当前位置: 首页 > article >正文

SpringMVC (二)请求处理

目录

章节简介

一 请求处理(初级)

eg:请求头

二 请求处理(进阶)

eg:请求体

三 获取请求头

四 获取Cookie

五 级联封装

六 使用@RequestBoby封装JSON对象

七 文件的上传

八 获取整个请求 HttpEntity

九 原生请求


Spring MVC 是 Spring 框架中的一个核心模块,专门用于构建 灵活、松耦合的 Web 应用程序。它基于经典的 MVC(Model-View-Controller)设计模式,但通过 Spring 的依赖注入(DI)和面向切面(AOP)等特性,简化了开发流程,提高了代码的可维护性。

与传统 Servlet/JSP 对比

特性Spring MVC传统 Servlet/JSP
耦合性低(基于接口和注解)高(直接依赖 Servlet API)
配置注解驱动,简化 XML/Java 配置需手动配置 web.xml
测试易于单元测试(Mock 框架支持)测试复杂(依赖容器)
扩展性模块化设计,易于扩展扩展需手动管理
功能集成无缝集成 Spring 生态(如安全、事务)需自行整合其他库

复习巩固前言JSON

图示:

章节简介

一 请求处理(初级)

eg:请求头

1 处理请求参数

前端代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>信息提交表单</title>
</head>
<body>
<h3>信息采集</h3>
<!-- 指定提交地址为 /handle02  表单数据会附加在 URL 参数中-->
<form action="/handle02" method="get"><fieldset><legend>主要信息</legend><label for="account1">账户:</label><input type="text" id="account1" name="account" value="" maxlength="10"><br><label>密码:<input type="password" id="password1" name="pw" maxlength="9"></label><br><label>性别:<input type="radio" name="gender" id="gender1" value="male" checked> 男<input type="radio" name="gender" value="female"> 女</label><br><label>爱好:<input type="text" id="hobby" name="hobby"><input type="checkbox" name="hobby" value="smoke"> 抽烟<input type="checkbox" name="hobby" value="drink"> 喝酒<input type="checkbox" name="hobby" value="perm"> 烫头</label><br></fieldset>其他补充信息:<br><textarea name="other" cols="25" rows="2"></textarea><br>籍贯:<select name="place"><option value="鲁">山东省</option><option value="皖">安徽省</option><option value="粤">广东省</option><option value="京" selected>北京市</option><option value="苏">江苏省</option></select><br><input type="hidden" name="hid" value="hahahahahahaha"><input type="submit" value="确认"><input type="reset" value="重置">
</form>
</body>
</html>

请求方法类:

package org.example.spring04mvc.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class RequestTestController {@RequestMapping("/handle01")public String handleRequest(@RequestParam String account,@RequestParam String pw,@RequestParam String gender,@RequestParam List<String> hobby,@RequestParam(required = false) String other,@RequestParam String place,@RequestParam String hid) {System.out.println("Account: " + account);System.out.println("Password: " + pw);System.out.println("Gender: " + gender);System.out.println("Hobbies: " + hobby);System.out.println("Place: " + place); // 自动处理URL编码(如"京")if (other != null) {System.out.println("Other: " + other);}System.out.println("隐藏信息: " + hid);return "表单上传成功!";}}

Sprig项目启动页面展示

个人控制台与浏览器展示:

二 请求处理(进阶)

eg:请求体

前端代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>信息提交表单</title>
</head>
<body>
<h3>信息采集</h3>
<!-- 指定提交地址为 /handle02 表单数据会通过 HTTP 请求体(Body) 发送到服务器。 -->
<form action="/handle02" method="post"><fieldset><legend>主要信息</legend><label for="account1">账户:</label><input type="text" id="account1" name="account" value="" maxlength="10"><br><label>密码:<input type="password" id="password1" name="pw" maxlength="9"></label><br><label>性别:<input type="radio" name="gender" id="gender1" value="male" checked> 男<input type="radio" name="gender" value="female"> 女</label><br><label>爱好:<input type="text" id="hobby" name="hobby"><input type="checkbox" name="hobby" value="smoke"> 抽烟<input type="checkbox" name="hobby" value="drink"> 喝酒<input type="checkbox" name="hobby" value="perm"> 烫头</label><br></fieldset>其他补充信息:<br><textarea name="other" cols="25" rows="2"></textarea><br>籍贯:<select name="place"><option value="鲁">山东省</option><option value="皖">安徽省</option><option value="粤">广东省</option><option value="京" selected>北京市</option><option value="苏">江苏省</option></select><br><input type="hidden" name="hid" value="hahahahahahaha"><input type="submit" value="确认"><input type="reset" value="重置">
</form>
</body>
</html>

封装:(可能由于版本问题@Data使用出错)

package org.example.spring04mvc.bean;import lombok.Data;@Data
public class emailUsers {// 账号指定默认值private String account="zhangsan";private String pw;private String gender;private String hid;private String place;private String other;private String[] hobby;}

指定:

package org.example.spring04mvc.controller;import org.example.spring04mvc.bean.emailUsers;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
public class RequestTestController {@RequestMapping("/handle01")public String handleRequest(@RequestParam String account,@RequestParam String pw,@RequestParam String gender,@RequestParam List<String> hobby,@RequestParam(required = false) String other,@RequestParam String place,@RequestParam String hid) {System.out.println("Account: " + account);System.out.println("Password: " + pw);System.out.println("Gender: " + gender);System.out.println("Hobbies: " + hobby);System.out.println("Place: " + place); // 自动处理URL编码(如"京")if (other != null) {System.out.println("Other: " + other);}System.out.println("隐藏信息: " + hid);return "表单上传成功!";}@RequestMapping("/handle02")public String handleRequest02(emailUsers emailUser){System.out.println(emailUser);return "表单上传成功!";}}

运行结果:

三 获取请求头

    @RequestMapping("/handle03")public String handleRequest03(@RequestHeader(value = "Host",defaultValue = "localhost") String host) {System.out.println(host);return "Ok" + host;}

四 获取Cookie

    @RequestMapping("/handle04")public String handleRequest04(@CookieValue(value = "JSESSIONID",defaultValue = "") String sessionId) {System.out.println(sessionId);return "Ok" + sessionId;}

五 级联封装

六 使用@RequestBoby封装JSON对象

代码实现:

    //测试接收JSON数据,获取请求体json的数据,自动转为对象@RequestMapping("/handle06")public String handleRequest06(@RequestBody emailUsers emailUser) {System.out.println(emailUser);return "OK";}
    //将JSON对象以字符串接收@RequestMapping("/handle07")public String handleRequest07(@RequestBody String json) {System.out.println(json);return "OK";}

七 文件的上传

    //接收文件上传表单@RequestMapping("/handle08")public String handleRequest08(emailUsers emailUser,@RequestParam("file") MultipartFile f1,@RequestParam("file2") MultipartFile[] f2) throws IOException {// 1获取原始文件名String originalFilename = f1.getOriginalFilename();// 2获取文件大小long size = f1.getSize();// 3获取文件流InputStream inputStream = f1.getInputStream();// 4文件保存f1.transferTo(new File("D:\\" + originalFilename));System.out.println(emailUser);return "OK";}

更改部分参数

八 获取整个请求 HttpEntity

HttpEntity 是 Spring Framework 中用于表示 HTTP 请求或响应实体 的核心类,它封装了 HTTP 消息的 头部(Headers) 和 正文(Body),常用于客户端和服务端之间的数据交互。以下是其核心特性和用法:


1. 核心功能

  • 封装数据:包含 HTTP 消息的 body(如 JSON、XML、表单数据)和 headers(如 Content-TypeAuthorization)。

  • 支持泛型HttpEntity<T> 允许指定正文内容的类型(如 Stringbyte[]Map 或自定义对象)。

  • 不可变性:创建后不可修改,若需变更需通过 HttpEntity 的构建方法生成新实例。

    // HttpEntity 封装请求头请求体,把整个请求拿过来封装@RequestMapping("/handle09")public String handleRequest09(HttpEntity<String> httpEntity){//拿到请求头HttpHeaders headers = httpEntity.getHeaders();//拿到请求体String body = httpEntity.getBody();return "OK";}

九 原生请求

    //使用原生API@RequestMapping("/handle10")public String handleRequest10(HttpServletRequest request) throws IOException {//拿到请求头Enumeration<String> headerNames = request.getHeaderNames();//拿到请求体String body = request.getReader().readLine();return "OK";}

相关文章:

SpringMVC (二)请求处理

目录 章节简介 一 请求处理&#xff08;初级&#xff09; eg:请求头 二 请求处理&#xff08;进阶&#xff09; eg:请求体 三 获取请求头 四 获取Cookie 五 级联封装 六 使用RequestBoby封装JSON对象 七 文件的上传 八 获取整个请求 HttpEntity 九 原生请求 Spring…...

Android (Kotlin) 高版本 DownloadManager 封装工具类,支持 APK 断点续传与自动安装

以下是一个针对 Android 高版本的 DownloadManager 封装工具类&#xff0c;支持 断点续传 和 自动安装 APK 功能。该工具类兼容 Android 10 及以上版本的文件存储策略&#xff0c;并适配了 FileProvider 和未知来源应用安装权限。 工具类&#xff1a;DownloadUtils import and…...

深入探索Android Bitmap:从原理到实战

一、Bitmap 是什么 在 Android 开发中,Bitmap 是极为重要的基石。简单来说,Bitmap 代表位图,是图片在内存里的具体呈现形式 ,任何诸如 JPEG、PNG、WEBP 等格式的图片,一旦被加载到内存中,就会以 Bitmap 对象的形式存在。从原理上看,Bitmap 本质是像素点的集合,若其宽度…...

​详细介绍 SetWindowPos() 函数

书籍&#xff1a;《Visual C 2017从入门到精通》的2.3.8 Win32控件编程 环境&#xff1a;visual studio 2022 内容&#xff1a;【例2.29】模态对话框 说明&#xff1a;以下内容大部分来自腾讯元宝。 ​1. 函数功能与用途 SetWindowPos() 是 Windows API 中用于动态调整窗口…...

1.6、Java继承、构造方法、数组

子类可以增加字段、增加方法或覆盖父类方法&#xff0c;但继承不会删除任何字段和方法不恰当认为super 同 this 引用是类似的概念&#xff0c;其实super不是一个对象的引用&#xff0c;不能将值super赋给另一个对象变量&#xff0c;super只是一个指示 编译器调用父类方法的特殊…...

通义万相 2.1 与蓝耘智算平台的深度协同,挖掘 AIGC 无限潜力并释放巨大未来价值

我的个人主页 我的专栏&#xff1a; 人工智能领域、java-数据结构、Javase、C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01; 点赞&#x1f44d;收藏❤ 引言&#xff1a;AIGC 浪潮下的新机遇 在当今数字化飞速发展的时代&#xff0c;人工智能生成内容&…...

Spring Boot项目中成功集成了JWT

JWT 原理解释 什么是 JWT&#xff1f; JSON Web Token&#xff08;JWT&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用环境间安全地将信息作为JSON对象传输。JWT通常用于身份验证和信息交换。 JWT 的结构 JWT由三部分组成&#xff…...

DeepSeek 3FS集群化部署临时笔记

DeepSeek 3FS集群化部署临时笔记 一、3FS集群化部署1、环境介绍2、对应的软件包安装3、编译4、部署4.1 部署monitor_collector_mainStep 2: Admin clientStep 3: Mgmtd serviceStep 4: Meta serviceStep 5: Storage serviceStep 6: Create admin user, storage targets and cha…...

专题|Python贝叶斯金融数据应用实例合集:随机波动率SV模型、逻辑回归、参数更新、绩效比较BEST分析亚马逊股票、普尔指数...

原文链接&#xff1a;https://tecdat.cn/?p41020 本专题合集系统梳理了贝叶斯方法在金融数据分析与分类建模中的前沿应用。合集聚焦于PyMC3概率编程框架&#xff0c;深度探讨了共轭先验参数更新、贝叶斯逻辑回归、贝叶斯夏普比率等核心算法在实际场景中的落地实践&#xff08;…...

RocketMQ企业应用篇

在现代企业级应用中&#xff0c;分布式消息队列系统如RocketMQ发挥着至关重要的作用。本文将深入探讨RocketMQ在电商和物联网场景中的应用&#xff0c;结合实际案例和代码示例&#xff0c;展示如何利用RocketMQ解决企业级应用中的关键问题。 一、电商场景应用 1. 秒杀抢购解决…...

vue-常用指令 | 常用指令的修饰符

目录 什么是vue指令 v-cloak v-text v-html v-pre v-show /v-if v-else/v-else-if v-on v-bind v-for v-model 常用指令的修饰符 v-model 指令修饰符 事件修饰符 按键修饰符 什么是vue指令 指令就是带有 v- 前缀 的特殊 属性&#xff0c;不同的属性对应不…...

Git提交前时间检查

为了防止在本地看日志的时候&#xff0c;由于本地时间被修改&#xff0c;导致日志的时间存在非正确时间。通过以下脚本在提交前进行时间验证&#xff0c;只有是正确的时间才可以提交。 使用方法如下&#xff1a; 复制如下脚本&#xff0c;命名为 pre-commit &#xff0c;放到 …...

Linux调度器 --- 负载均衡的存在的问题

文章目录 前言一、简介二、Linux 调度器2.1 在单核系统上&#xff0c;CFS 非常简单2.2 在多核系统上&#xff0c;CFS 变得非常复杂2.2.1 负载均衡算法2.2.2 优化措施 三、Linux调度器负载均衡的存在的问题3.1 组负载不均衡问题&#xff08;Group Imbalance Bug&#xff09;3.2 …...

从零开始用AI开发游戏(三)背景故事

《迷域回响》背景故事 第一章&#xff1a;失落的符文纪元 在远古的“艾瑟兰”大陆&#xff0c;掌握空间魔法的「筑界者文明」曾建造了连通万界的回响迷宫——这座迷宫既是试炼场&#xff0c;也是囚笼。文明巅峰时期&#xff0c;筑界者将禁忌知识刻入虚空符文&#xff0c;嵌于…...

IXTUR气控永磁铁:以高精度气控和稳定磁场,为机器人应用提供稳定抓取力

在现代工业生产和物流领域&#xff0c;物料的抓取与搬运是影响生产效率和成本控制的重要环节。传统夹爪在面对不同材质、形状和重量的物体时&#xff0c;常常存在适应性差、抓取不稳定、操作复杂等问题&#xff0c;导致生产流程中频繁出现停机调整&#xff0c;增加了人工干预成…...

硬件驱动——51单片机:寄存器、LED、动态数码管

目录 一、51单片机 1.寄存器 二、LED点灯 1.原理 2.封装函数 3.顺序点灯 4.特定位点灯 三、动态数码管 1.原理 2.封装函数 3.0~9跳变 4.顺序移位0~9跳变 一、51单片机 1.寄存器 51单片机共40个引脚&#xff0c;其中P0,P1,P2,P3是四个有8引脚的寄存器&#xff0…...

2025 香港 Web3 嘉年华:全球 Web3 生态的年度盛会

自 2023 年首届香港 Web3 嘉年华成功举办以来&#xff0c;这一盛会已成为全球 Web3 领域规模最大、影响力最深远的行业活动之一。2025 年 4 月 6 日至 9 日&#xff0c;第三届香港 Web3 嘉年华将在香港盛大举行。本届活动由万向区块链实验室与 HashKey Group 联合主办、W3ME 承…...

【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法

在DQL的基础查询中&#xff0c;我们已经学过了多表查询的一种&#xff1a;联合查询&#xff08;union&#xff09;。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先&#xff0c;我们想要查询emp表和stu表两个表&#xff0c;按照我们之前的知识栈&#xff0c;我们直接使用…...

Leetcode-132.Palindrome Partitioning II [C++][Java]

目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-132.Palindrome Partitioning IIhttps://leetcode.com/problems/palindrome-partitioning-ii/description/132. 分割回文串 II - 力扣&#xff08;LeetCode&#xff09;132. 分割回文串 II - 给你一个字符串 s&…...

在 macOS 上优化 Vim 用于开发

简介 这篇指南将带你通过一系列步骤&#xff0c;如何在 macOS 上优化 Vim&#xff0c;使其具备 代码补全、语法高亮、代码格式化、代码片段管理、目录树等功能。此外&#xff0c;我们还会解决在安装过程中可能遇到的常见错误。 1. 安装必备工具 在开始 Vim 配置之前&#xff…...

SOME/IP-SD -- 协议英文原文讲解8

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.4.4 S…...

【Agent实战】货物上架位置推荐助手(RAG方式+结构化prompt(CoT)+API工具结合ChatGPT4o能力Agent项目实践)

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 结论 效果图示 1.prompt 2. API工具封…...

Spring Boot使用线程池创建多线程

在 Spring Boot 2 中&#xff0c;可以使用 Autowired 注入 线程池&#xff08;ThreadPoolTaskExecutor 或 ExecutorService&#xff09;&#xff0c;从而管理线程的创建和执行。以下是使用 Autowired 方式注入线程池的完整示例。 1. 通过 Autowired 注入 ThreadPoolTaskExecuto…...

PyTorch 深度学习实战(11):强化学习与深度 Q 网络(DQN)

在之前的文章中&#xff0c;我们介绍了神经网络、卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#xff09;、Transformer 等多种深度学习模型&#xff0c;并应用于图像分类、文本分类、时间序列预测等任务。本文将介绍强化学习的基本概念&#xff0…...

在Eclipse 中使用 MyBatis 进行开发,通常需要以下步骤:

在Eclipse 中使用 MyBatis 进行开发&#xff0c;通常需要以下步骤&#xff1a; 1. 创建 Maven 项目 首先&#xff0c;在 Eclipse 中创建一个 Maven 项目。如果你还没有安装 Maven 插件&#xff0c;可以通过 Eclipse Marketplace 安装 Maven 插件。 打开 Eclipse&#xff0c;选…...

Python学习第十九天

Django-分页 后端分页 Django提供了Paginator类来实现后端分页。Paginator类可以将一个查询集&#xff08;QuerySet&#xff09;分成多个页面&#xff0c;每个页面包含指定数量的对象。 from django.shortcuts import render, redirect, get_object_or_404 from .models impo…...

Adobe Premiere Pro2023配置要求

Windows 系统 最低配置 处理器&#xff1a;Intel 第六代或更新版本的 CPU&#xff0c;或 AMD Ryzen™ 1000 系列或更新版本的 CPU&#xff0c;需要支持 Advanced Vector Extensions 2&#xff08;AVX2&#xff09;。操作系统&#xff1a;Windows 10&#xff08;64 位&#xff…...

面试求助:接口测试用例设计主要考虑哪些方面?

一、基础功能验证 1. 正常场景覆盖 关键点&#xff1a;验证接口在合法输入下的正确响应&#xff08;状态码、数据结构、业务逻辑&#xff09;。 案例&#xff1a; json 复制 // 用户登录接口 输入&#xff1a;{"username": "合法用户", "password…...

C语言——变量与常量

C语言中的变量与常量&#xff1a;简洁易懂的指南 在C语言编程中&#xff0c;变量和常量是最基本的概念之一。理解它们的区别和使用方法对于编写高效、可维护的代码至关重要。本文将详细介绍C语言中的变量和常量&#xff0c;并通过图表和代码示例帮助你更好地理解。 目录 什么…...

考研408-数据结构完整代码 线性表的顺序存储结构 - 顺序表

线性表的顺序存储结构 - 顺序表 1. 顺序表的定义 ​ 用一组地址连续的存储单元依次存储线性表的数据元素&#xff0c;从而使逻辑上相邻的两个元素在物理位置上也相邻 2. 顺序表的特点 随机访问&#xff1a; 即通过首地址和元素序号可以在O(1) 时间内找到指定元素&#xff0…...