SpringMVC 入门
# 1. 什么是 Spring MVC
Spring MVC(Spring Web MVC) 是基于 Servlet API 构建的一个 Web 框架,它是 Spring 框架中的 Web 模块,帮助开发者实现基于 MVC 设计模式的 Web 应用程序。
Spring、Spring MVC、Spring Boot 之间的关系
- Spring 是核心框架,提供了依赖注入、面向切面编程等基础功能。
- Spring MVC 是 Spring 的 Web 模块,实现了 MVC 设计模式的 Web 应用开发框架。
- Spring Boot 是 Spring 的脚手架,帮助快速搭建 Spring 应用,简化配置。
提示
现在大多数 Java Web 项目都是基于 Spring Boot 开发的,添加 Spring Web
依赖后,实际上就是一个 Spring MVC 项目。因此,Spring Boot 项目中使用的 Web 模块本质上就是 Spring MVC。
# 2. MVC 的定义与解释
MVC 是 Model-View-Controller 的缩写,是一种设计模式。MVC 将软件系统分为三个部分:
- Model(模型):负责处理应用的数据逻辑,通常与数据库交互。
- View(视图):负责数据显示,通常通过模板渲染模型数据。
- Controller(控制器):负责用户输入的处理,将用户请求转发给模型并返回视图。
MVC 在实际开发中的理解
- 用户输入请求 → 由 Controller 接收并处理 → Controller 调用 Model 进行数据处理 → Model 返回数据 → Controller 将数据传递给 View → View 渲染并返回给用户。
# 3. MVC 和 Spring MVC 的关系
MVC 是一种设计思想,Spring MVC 是这种思想的具体实现。Spring MVC 继承了 Servlet API,是一个标准的 Java Web 框架。
Spring MVC 的现代应用
尽管 MVC 最初包含了视图渲染的功能,但随着前后端分离架构的兴起,Spring MVC 在现代开发中主要负责后端业务逻辑和数据处理,将 JSON 数据返回给前端,前端负责渲染 UI。
总结
- Spring MVC 是基于 MVC 设计模式的 Web 框架,它是 Spring 的核心组成部分,通过继承 Servlet API 实现了 Web 应用开发的标准化流程。
- 在现代 Web 开发中,Spring MVC 主要负责处理请求、调用业务逻辑和返回数据,而不再涉及 UI 的渲染。
# 4. 如何学习Spring MVC
学习 Spring MVC,主要掌握以下 3 个关键功能:
- 请求映射功能:将用户请求映射到相应的 Java 方法上(实现 URL 到方法的映射)。
- 参数获取功能:从请求中获取用户传递的参数。
- 数据返回功能:将处理后的数据返回给用户(如返回 JSON 数据、页面视图等)。
掌握了这三个功能,基本上就掌握了 Spring MVC 的核心。
# 创建项目时选择 Spring Web 依赖
在学习如何连接用户请求和 Java 程序之前,首先需要创建一个 Spring MVC 项目。现代 Spring MVC 项目通常是基于 Spring Boot 构建的,因此在创建项目时,只需在依赖中选择添加 Spring Web 模块即可。
# 编写 Spring MVC 控制器代码
下面是一个简单的 Spring MVC 控制器示例代码,通过该代码可以映射一个简单的请求路径并返回字符串响应。
示例代码
@Controller // 标识这是一个 Spring MVC 控制器类,必须添加该注解,否则无法处理请求
@ResponseBody // 将返回值直接写入 HTTP 响应体,通常用于返回 JSON 数据或纯文本数据
@RequestMapping("/web") // 类级别的请求映射,指定了基础路径(可省略)
public class WebController {
@RequestMapping("/hello") // 方法级别的请求映射,完整路径为 "/web/hello"
public String hello() {
return "你好,世界"; // 返回的内容将直接作为响应体内容
}
}
2
3
4
5
6
7
8
9
10
代码解析
@Controller
:用于标识一个类为控制器,Spring 会将其作为 Bean 加载并注册到上下文中。必须添加,否则该类无法处理 HTTP 请求。@RequestMapping
:用于映射请求路径,可以标注在类或方法上。- 当标注在类上时,指定基础路径(如
/web
),所有方法的路径都会在此基础上进行拼接。 - 当标注在方法上时,指定具体路径(如
/hello
)。此路径与类级别路径组合形成完整的 URL。
- 当标注在类上时,指定基础路径(如
@ResponseBody
:将方法的返回值直接写入 HTTP 响应体,通常用于返回 JSON 数据或纯文本。如果不使用此注解,Spring 会尝试将返回值作为视图名称进行解析。- 路径访问:在浏览器中访问
http://127.0.0.1:8080/web/hello
时,会映射到hello()
方法,返回的字符串直接展示在页面上。
注意事项
@Controller
不能被替代:不能使用其他注解(如@Service
、@Component
)替代@Controller
,否则请求将无法映射到该类。- 路径映射:
@RequestMapping
可以只在方法上使用,但不能只在类上使用。方法级别的映射路径是必须的。 - 返回视图时的注解选择:如果返回的是静态页面视图(如 JSP、HTML),可以省略
@ResponseBody
注解。如果返回的是 JSON 数据,必须使用@ResponseBody
或@RestController
(@RestController
是@Controller
和@ResponseBody
的组合)。
# 请求映射注解的区别与使用
在 Spring MVC 中,处理用户请求的关键在于如何映射不同的 HTTP 请求类型(如 GET、POST 等)到控制器方法。最常用的注解包括 @RequestMapping
、@GetMapping
和 @PostMapping
等。
# 1. @RequestMapping
注解
- 功能:
@RequestMapping
是最基础的请求映射注解,可以处理多种请求类型,包括 GET、POST、PUT、DELETE 等。 - 用法:
@RequestMapping
可标注在类或方法上。标注在类上时,指定基础路径;标注在方法上时,指定具体路径和请求类型。
示例代码:处理 GET 请求
// 默认处理所有请求类型(包括 GET 和 POST, 建议用在类上)
@RequestMapping("/hello")
// 明确指定处理 GET 请求 (用在方法上建议明确指定method 参数)
@RequestMapping(value = "/hello", method = RequestMethod.GET)
2
3
4
5
# 2. @GetMapping
和 @PostMapping
注解
- 功能:
@GetMapping
和@PostMapping
是@RequestMapping
的简化版本,专用于处理 GET 和 POST 请求。 - 优点:相比
@RequestMapping
,这些注解更加直观简洁,更符合 RESTful 风格的开发实践。
示例代码:处理 GET 请求
// 使用 @GetMapping 专门处理 GET 请求,推荐使用这种写法
@GetMapping("/hello")
2
示例代码:处理 POST 请求
// 使用 @PostMapping 专门处理 POST 请求,推荐使用这种写法
@PostMapping("/hello")
2
# 3. 扩展:处理其他类型的请求
在实际开发中,除了 GET 和 POST 请求外,还需要处理 PUT、DELETE、PATCH 等请求。Spring MVC 提供了相应的注解:
@PutMapping
:处理 PUT 请求,用于更新资源。@DeleteMapping
:处理 DELETE 请求,用于删除资源。@PatchMapping
:处理 PATCH 请求,用于部分更新资源。
示例代码:处理 PUT 请求
@PutMapping("/update")
public ResponseEntity<String> updateResource() {
return ResponseEntity.ok("资源已更新");
}
2
3
4
示例代码:处理 DELETE 请求
@DeleteMapping("/delete")
public ResponseEntity<String> deleteResource() {
return ResponseEntity.ok("资源已删除");
}
2
3
4
# 4. 路径前的斜杠(/
)问题
在Spring框架中,无论是@RequestMapping
还是@PostMapping
等具体的HTTP方法注解,路径前的斜杠(/
)都是可选的。Spring会自动处理类级别和方法级别路径的拼接,无论是否添加斜杠,最终的URL都会正确组合。例如:
@RestController
@RequestMapping("userInfo")
public class UserInfoController {
@PostMapping("addUserInfo")
public String addUserInfo(...) {
// 方法实现
}
}
2
3
4
5
6
7
8
9
上述配置会映射到/userInfo/addUserInfo
。为了代码一致性和可读性,建议在整个项目中统一是否使用斜杠。
总结:
- 斜杠可选:路径前的斜杠在映射注解中可以有也可以没有,Spring会正确拼接。
- 保持一致:为了代码整洁,建议在项目中统一路径定义风格。
- 路径拼接:类级别和方法级别的路径会自动组合,无需担心斜杠问题。