跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

SpringMVC 详解:原理、HTTP 与参数处理

详细讲解了 SpringMVC 的核心概念与实战开发。内容包括 MVC 设计思想、SpringMVC 工作流程、静态与动态请求的处理方式。深入剖析了 HTTP 协议基础,涵盖 URL 结构、请求方法(GET/POST)、请求与响应格式。重点演示了服务端接收参数的三种方式:HttpServletRequest、声明参数及 POJO 类封装,并提供了 Controller 注解使用示例及常见 404 问题排查方案。适合希望快速掌握 SpringMVC 开发规范的初学者阅读。

疯疯癫癫发布于 2026/3/22更新于 2026/7/940 浏览
SpringMVC 详解:原理、HTTP 与参数处理

1 什么是 MVC

1.1 MVC 设计思想

MVC 是一种软件架构的思想,将软件按照模型、视图、控制器来划分。

  • Model,模型层,负责业务逻辑判断,数据库存取
  • View,视图层,负责界面展示,向用户呈现数据的方式(html 页面、图片、文本等)
  • Controller,控制器,负责接收用户请求,并根据请求调用相应的模型来处理业务逻辑

MVC 架构图

1.2 Spring MVC

Spring MVC 架构图

SpringMVC 是一种基于 MVC(模型 - 视图 - 控制器)模式的 Web 框架,它是基于 Spring 框架的一个子项目。

它通过将请求分派给相应的控制器来处理 Web 请求,然后将处理结果发送回客户端。

处理流程如图:

Spring MVC 处理流程

  1. 客户端发送请求至前端控制器 DispatcherServlet;
  2. DispatcherServlet 收到请求后,调用处理器映射器 HandlerMapping;
  3. HandlerMapping 根据请求 URL 找到具体的 Controller;
  4. 通过处理器适配器 HandlerAdapter 找到具体执行该方法的实现类;
  5. Controller 处理请求,并返回 ModelAndView;
  6. DispatcherServlet 通过 ViewResolver(视图解析器)确定负责显示数据的具体 View;
  7. DispatcherServlet 对 View 进行渲染视图(即将 Model 填充至视图组件中),并将完整的视图响应到客户端。

2 SpringMVC 快速入门

  1. 创建工程:新建工程 _051MVC-BOOT01 创建工程
  2. 选择依赖:选择 2.7.17 版本,并勾选 Spring Web 依赖项
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    选择依赖
  3. 创建首页文件:在 resources/static 目录下创建 index.html
    <h1> 工程首页 </h1>
    
  4. 启动工程:运行主程序启动应用
  5. 刷新静态资源:右键 static 目录,选择 Rebuild static Rebuild static

3 SpringMVC 处理请求

3.1 请求分类及处理方式

3.1.1 静态请求
  • 定义:指请求的页面由服务器上预先准备好的静态 web 资源组成,如 HTML、CSS、JS、IMG 等,返回给客户端的信息内容是不变的。
  • 处理方式:由服务器直接将请求的资源返回给客户端,服务器不处理任何逻辑,只是将预先准备好的资源返回给客户端。

静态请求

3.1.2 动态请求
  • 定义:服务器会根据用户的请求动态生成内容,将数据返回到客户端显示页面内容。
  • 处理方式:由服务器从数据库中获取数据,并进行相应的逻辑处理后将处理结果返回客户端。

动态请求

3.2 处理静态请求

3.2.1 处理 html 文件请求
  • 第 1 步:创建 index.html(已创建),浏览器输入地址测试 http://localhost:8080/index.html
  • 第 2 步:浏览器显示工程首页

首页效果

3.2.2 处理图片等请求
  • 第 1 步:复制任意一张图片到 static 下
  • 第 2 步:右键 static 目录,Rebuild static
  • 第 3 步:浏览器测试 http://localhost:8080/liying.jpg

3.3 处理动态请求

通过在 controller 中定义对应的类及方法实现动态请求的业务逻辑处理。

3.3.1 注解说明
  • @Controller:添加在类上;表示该类是一个控制器,负责处理用户的请求,并将处理结果生成响应返回给客户端。
  • @RequestMapping:请求注解;添加在控制器类或控制器方法上;将 HTTP 请求映射到控制器中的方法,指定处理请求的路径。
    • 控制器类上:为整个控制器指定一个基础路径
    • 控制器方法上:指定相对于基础路径的具体路径
  • @ResponseBody:响应注解;添加在控制器方法上;可以使控制器方法通过返回值的方式将响应返回给客户端。
3.3.2 示例

处理用户查询订单的请求

  • 请求地址:http://localhost:8080/selectOrder
  • 返回响应:String "查询订单成功~~"

实现

// @Controller:用于将一个类标识为 SpringMVC 中的控制器,负责处理用户的请求并将响应返回给客户端
@Controller
public class OrderController {
    // 1.请求注解
    @RequestMapping("/selectOrder")
    // 2.响应体注解,添加此注解后,可以通过返回值的方式响应给客户端数据
    @ResponseBody
    public String selectOrder() {
        return "查询订单成功~~";
    }
}
  • 第 1 步:工程目录下新建 controller.OrderController
  • 第 2 步:重启工程后浏览器测试 http://localhost:8080/selectOrder

3.4 常见问题

  • 工程已修改,但是浏览器刷新未出现效果
    • 工程 static 目录下文件修改后必须 Rebuild static
    • 浏览器有之前页面的缓存,Shift + F5 刷新页面
  • 404 错误码代表找不到资源
    • 找不到静态资源
      • 检查请求的路径是否正确
      • 检查静态资源文件的存储位置是否在 static 里面
      • 选中 static 文件夹 ReBuild 重新编译再测试
    • 找不到动态资源
      • 检查请求的路径是否正确
      • 检查 @Controller 注解是否添加
      • 检查 @RequestMapping 注解里面的处理路径是否正确

4 HTTP

4.1 HTTP 协议

超文本传输协议

HTTP 协议是浏览器与服务器通讯的应用层协议,规定了浏览器与服务器之间的交互规则以及交互数据的格式信息等。

  • 用途:网页获取,数据的传输
  • 特点
    • 应用层协议,使用 tcp 进行数据传输;
    • 有丰富的请求类型;
    • 可以传输的数据类型众多.

4.2 访问网页流程

  1. 客户端(浏览器)通过 tcp 传输,发送 http 请求给服务端;
  2. 服务端接收到 http 请求后进行解析;
  3. 服务端处理请求内容,组织响应内容;
  4. 服务端将响应内容以 http 响应格式发送给浏览器;
  5. 浏览器接收到响应内容,解析展示.

4.3 请求和响应

4.3.1 HTTP 请求 Request

浏览器给服务端发送的内容称为请求 Request,一个请求包含三部分:请求行,请求头,请求体

请求体:请求参数或者提交内容。请求体通常是用户上传的信息,比如:在页面输入的注册信息,上传的附件等内容。

请求体

请求头:对请求的进一步解释和描述。请求头是浏览器可以给服务端发送的一些附加信息,有的用来说明浏览器自身内容,有的用来告知服务端交互细节,有的告知服务端消息正文详情等。

Host: localhost:8080
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9

请求行:具体的请求类别和请求内容

GET / HTTP/1.1
  • 请求类别:每个请求类别表示向服务器端发请求做不同的操作
    • GET:获取服务器资源
    • POST:新增服务器资源
    • PUT:更新服务器资源
    • DELETE:删除服务器资源
  • 抽象路径:请求 URL 地址为:http://localhost:8080/
    • 请求行为:GET / HTTP/1.1
    • 请求 URL 地址为:http://localhost:8080/v1/users/login
    • 请求行为:GET /v1/users/login HTTP/1.1
    • 请求 URL 地址为:http://localhost:8080/v1/users/reg
    • 请求行为:GET /v1/users/reg HTTP/1.1
4.3.2 HTTP 响应 Response

服务端给浏览器发送的内容称为响应 Response,一个响应包含三部分:响应行,响应头,响应体。

响应体:响应的主体内容信息

响应体

响应头:响应头与请求中的消息头格式一致,表示的是服务端发送给客户端的附加信息。

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 3546
  • Content-Length:是用来告知浏览器响应正文的长度,单位是字节。
  • Content-Type:是用来告知浏览器响应正文中的内容是什么类型的数据 (图片,页面等等)。不同的类型对应的值是不同,浏览器接收正文前会根据上述两个响应头来得知长度和类型从而读取出来做对应的处理以渲染给用户看。
文件类型Content-Type 对应的值
htmltext/html
csstext/css
jsapplication/javascript
pngimage/png
gifimage/gif
jpgimage/jpeg

响应行

HTTP/1.1 200 OK
  • 响应码:
    • 1xx:保留
    • 2xx:成功,表示处理成功,并正常响应
    • 3xx:重定向,表示处理成功,但是需要浏览器进一步请求
    • 4xx:客户端错误,表示客户端请求错误导致服务端无法处理
    • 5xx:服务端错误,表示服务端处理请求过程出现了错误

4.4 URL

4.4.1 定义

URL(Uniform Resource Locator)是互联网上统一资源定位符的简称,用于标识和定位互联网上资源的地址。在 Web 浏览器中,URL 是用于访问网页的地址。

4.4.2 URL 组成

http://localhost:8080/v1/users/login?username=xxx&password=yyy

  • 协议(Protocol):指定访问资源的协议类型,常见的协议包括 HTTP、HTTPS 等。
  • 主机名(Hostname):指定要访问的服务器的主机名或域名。
  • 端口号(Port):指定服务器的端口号,不同的协议和应用程序使用不同的端口号。
  • 路径(Path):指定要访问的资源的路径,即文件或文件夹的路径。
  • 查询参数(Query Parameters):用于传递一些额外的信息给服务器,例如参数化的查询条件。查询参数和路径 Path 之间使用?分隔,多个查询参数之间使用 & 分隔。

URL 组成

4.4.3 注意事项
  • URL 地址是区分大小写的,因此在输入时要注意大小写的一致性。
  • URL 地址中不能包含非法字符,例如空格、特殊符号等。如果需要传递参数或附加信息,可以使用查询参数或 POST 请求等方式。

4.5 请求方法

4.5.1 GET 请求

GET 请求是 HTTP 协议中最常见的请求方式之一,它用于从服务器获取数据。

GET 请求将查询参数附加在 URL 之后,通过'?'符号进行分隔。

  • 注意事项
    • GET 请求的参数是可见的,因此在 URL 中传递敏感信息时需谨慎。
    • GET 请求的长度有限制,因为 URL 的长度有限制,因此当传递大量数据时,应考虑使用 POST 或其他方式。
  • 发送 GET 请求:在浏览器中输入 URL 地址确认即可向服务端发送 GET 请求。http://localhost:8080/v1/users/login?username=xxx&password=xxx

查询参数 GET 请求的参数通常以键值对的形式附加在 URL 之后。例如,以下 URL 中,'?name=John&age=25'是两个查询参数,分别表示名字和年龄

http://example.com/users?name=John&age=25
4.5.2 POST 请求

POST 请求是另一种常见的 HTTP 请求方式,它用于向服务器提交数据。与 GET 请求不同,POST 请求将数据放在请求体(Request Body)中,而不是 URL 中。

  • 请求体:POST 请求的请求体中包含要提交的数据。这些数据可以是 JSON、XML 或其他格式。请求体中的数据通过 Content-Type 头部指定。
  • 使用 POST 请求的注意事项
    • POST 请求的数据是私密的,不会显示在 URL 中,因此更适合传递敏感信息。
    • POST 请求的长度没有限制,可以提交大量的数据。

发送 POST 请求经常在 form 表单中发送。

<form action="请求地址" method="post">
    <input type="text" name="username">
    <input type="text" name="password">
    <input type="submit" name="登录">
</form>

请求示例

POST /users HTTP/1.1
Host: example.com
Content-Type: application/json
Request Body: {"username": "john", "password": "secret"}

4.6 传递数据方式

客户端向服务端传递数据的方式分为 GET 请求和 POST 请求两种方式。

4.6.1 GET 请求

在查询参数中传递,比如:

http://localhost:8080/v1/users/login?username=xxx&password=xxx
4.6.2 POST 请求

在请求体中传递,比如:

<form action="请求地址" method="post">
    <input type="text" name="username">
    <input type="text" name="password">
    <input type="submit" name="登录">
</form>

5 服务端接收参数

5.1 HttpServletRequest 接收

  • HttpServletRequest 是 Java Servlet 规范中定义的一个接口,它提供了与 HTTP 请求相关的方法和属性。
  • 在 Java Web 应用程序中,当客户端发送 HTTP 请求时,容器(例如 Tomcat)会创建一个 HttpServletRequest 对象,该对象包含了客户端请求的所有信息,如请求的 URL、请求方法、请求头、请求参数等。
  • 在请求处理过程中,开发人员可以使用 HttpServletRequest 对象来获取客户端发送过来的请求参数。通过调用 HttpServletRequest 的方法,可以获取请求的参数名称、参数值以及参数的数量等信息。

以上述案例为准,客户端把用户名和密码信息传递给服务端,服务端接收传递过来的用户名和密码信息。

  • 第 1 步:controller.UserController 处理请求
/**方式 1:使用 HttpServletRequest 接收数据*/
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(HttpServletRequest request) {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    return username + ":" + password;
}
  • 第 2 步:重启工程测试

5.2 声明参数接收

可以在处理请求的方法中通过 声明参数的方式 来接收客户端传递过来的数据。

应用分析

  • 第 1 步:controller.UserController 处理登录请求
/**方式 2:通过声明参数的方式接收*/
@RequestMapping("/v1/users/login")
@ResponseBody
// 好处:代码简洁,并且可以自动根据声明的类型进行转换
public String login(String username, String password) {
    return "username = " + username + ", password = " + password;
}
  • 第 2 步:重启工程,执行测试脚本测试

5.3 声明 POJO 类接收

如果客户端传递数据过多,通过 HttpServletRequest 方式接收复用性较差,通过 声明参数接收 又很繁琐;所以可以将数据封装到 POJO 类 中来接收。

操作步骤

  • 第 1 步:controller.UserController 处理登录请求
/**方式 3:通过声明 Pojo 类接收*/
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(User user) {
    return user.toString();
}
  • 第 2 步:自定义 pojo 类,工程目录下创建 entity.User
public class User {
    // 客户端传递几个参数,此处就有几个属性
    private String username;
    private String password;
    // 省略 setter() getter() 和 toString() 方法
}
  • 第 3 步:重启工程后测试

6 HttpClient 测试

6.1 HttpClient 说明

使用 SpringMVC 中提供的 .http 后缀的文件来测试 Controller 层接口。

使用三个 # 号 作为不同测试方法的分隔符,也可以作为注释说明。

应用分析

  • 第 1 步:在 test 目录下创建 Directory:http
  • 第 2 步:创建 .http 后缀的文件进行测试:testUserController.http
### GET 请求测试
GET http://localhost:8080/v1/users/login?username=liying&password=123456
Accept: application/json

### POST 请求测试
POST http://localhost:8080/v1/users/login
Content-Type: application/x-www-form-urlencoded
username=liying&password=123456
  • 第 3 步:执行对应的请求方法测试

测试执行

7 POJO

7.1 定义

Plain Ordinary Java Object:简单的 Java 对象;

是没有继承任何类或实现任何接口的简单 Java 对象,也不依赖于其他复杂的框架或技术;

POJO 对象通常包含了纯粹的数据和简单的业务逻辑,是一种用于简化 Java 应用程序开发的编程模型;

是 entity 实体类、VO(Value Object 或 View Object)视图对象、DTO(Data Transfer Object)数据传输对象 这 3 个对象的总称。

7.2 entity 实体类|DTO|VO

  • entity 实体类:作用用来和数据库中的表字段一一对应的,比如 UserEntity(id,username,password,nickname);
  • DTO:作用用来接收客户端传递给服务器的数据的,比如:UserLoginDTO(username,password) 实现登录功能,客户端向服务器端传递数据;
  • VO:作用用来处理服务器响应给客户端的数据的,比如:UserListVO(id,username,nickname) 登录成功后的列表页显示当前用户信息。

目录

  1. 1 什么是 MVC
  2. 1.1 MVC 设计思想
  3. 1.2 Spring MVC
  4. 2 SpringMVC 快速入门
  5. 3 SpringMVC 处理请求
  6. 3.1 请求分类及处理方式
  7. 3.1.1 静态请求
  8. 3.1.2 动态请求
  9. 3.2 处理静态请求
  10. 3.2.1 处理 html 文件请求
  11. 3.2.2 处理图片等请求
  12. 3.3 处理动态请求
  13. 3.3.1 注解说明
  14. 3.3.2 示例
  15. 3.4 常见问题
  16. 4 HTTP
  17. 4.1 HTTP 协议
  18. 4.2 访问网页流程
  19. 4.3 请求和响应
  20. 4.3.1 HTTP 请求 Request
  21. 4.3.2 HTTP 响应 Response
  22. 4.4 URL
  23. 4.4.1 定义
  24. 4.4.2 URL 组成
  25. 4.4.3 注意事项
  26. 4.5 请求方法
  27. 4.5.1 GET 请求
  28. 4.5.2 POST 请求
  29. 4.6 传递数据方式
  30. 4.6.1 GET 请求
  31. 4.6.2 POST 请求
  32. 5 服务端接收参数
  33. 5.1 HttpServletRequest 接收
  34. 5.2 声明参数接收
  35. 5.3 声明 POJO 类接收
  36. 6 HttpClient 测试
  37. 6.1 HttpClient 说明
  38. GET 请求测试
  39. POST 请求测试
  40. 7 POJO
  41. 7.1 定义
  42. 7.2 entity 实体类|DTO|VO
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ 继承机制详解:从基础到多继承与组合
  • Web 安全 Shell 注入与成绩查询漏洞解析
  • LiuJuan Z-Image Generator 本地部署与 8K 人像生成指南
  • Web 自动化测试实战:常用函数全解析与场景化应用指南
  • Kotlin 基础:拒绝语法噪音
  • 字节跳动开源 Seed-OSS-36B:512K 上下文与推理控制
  • 鸿蒙生态下大模型重塑移动应用开发新范式
  • 大模型落地应用架构模式解析与实施策略
  • 数据结构:顺序表原理与实现
  • Python 零基础转行学习路线与核心技能详解
  • MySQL 数据库基础入门:从概念到实战
  • C++ STL string 类从零实现详解
  • Alpamayo-R1-10B 部署:WebUI 端口自定义配置指南
  • 基于大疆 SRT 数据的高精度 AR 视频投射方案
  • 二分查找实战:旋转数组最小值与缺失数字
  • AI 辅助开发:使用 DeepSeek 构建贪吃蛇游戏
  • 飞算 JavaAI 实战指南:用自然语言加速 Java 开发
  • C++ 二叉搜索树原理与代码实现
  • jQuery 合成事件实战:hover 与 trigger 用法解析
  • Llama-2-7b 昇腾 NPU 测评:性能数据、场景适配与硬件选型

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online