文章目录
1. Spring MVC 概述
Spring MVC 是基于 Java 的 模型-视图-控制器(MVC) 框架,用于构建灵活、松耦合的 Web 应用程序。它围绕 DispatcherServlet(前端控制器)设计,负责协调请求处理流程。
1.1 Spring MVC 核心组件
组件 | 作用 |
---|---|
DispatcherServlet | 前端控制器,接收所有 HTTP 请求并分发给合适的处理器 |
HandlerMapping | 确定哪个 Controller 处理当前请求 |
Controller | 处理业务逻辑,返回 ModelAndView |
ModelAndView | 封装模型数据 + 视图名称 |
ViewResolver | 解析视图名称,返回实际的 View 对象 |
View | 渲染最终的响应(如 JSP、Thymeleaf) |
2. Spring MVC 请求处理流程
Spring MVC 的请求处理流程可以分为 6 个关键步骤,下面结合 流程图 和 代码示例 详细说明。
2.1 Spring MVC 请求处理流程图
2.2 详细步骤解析
-
HTTP 请求到达
DispatcherServlet
- 所有请求先由
DispatcherServlet
拦截(web.xml
或Servlet 3.0+
配置)。
- 所有请求先由
-
HandlerMapping
查找合适的 ControllerDispatcherServlet
查询HandlerMapping
,确定哪个Controller
能处理该请求。- 示例:
@RequestMapping("/user/{id}")
匹配/user/1
。
-
调用
Controller
方法DispatcherServlet
调用匹配的Controller
方法,并传入请求参数(如@PathVariable
、@RequestParam
)。
-
Controller
返回ModelAndView
Controller
处理业务逻辑,返回ModelAndView
(包含数据模型 + 视图名称)。
-
ViewResolver
解析视图DispatcherServlet
调用ViewResolver
将逻辑视图名(如"user"
)解析为实际视图(如/WEB-INF/views/user.jsp
)。
-
View
渲染并返回响应View
渲染 HTML,DispatcherServlet
返回最终的 HTTP 响应。
3. 代码示例:Spring MVC 实战
3.1 配置 DispatcherServlet
(web.xml)
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.2 定义 Controller
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ModelAndView getUser(@PathVariable Long id) {
User user = userService.getUserById(id);
ModelAndView mav = new ModelAndView("user"); // 视图名: "user"
mav.addObject("user", user); // 数据模型
return mav;
}
}
3.3 配置 ViewResolver
(Spring XML 配置)
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
- 逻辑视图
"user"
→ 实际路径/WEB-INF/views/user.jsp
。
4. Spring MVC 核心机制
4.1 注解驱动的 Controller
注解 | 作用 |
---|---|
@Controller | 标记类为 Spring MVC Controller |
@RequestMapping | 映射 URL 到方法 |
@GetMapping / @PostMapping | 限定 HTTP 方法 |
@PathVariable | 获取 URL 路径变量 |
@RequestParam | 获取查询参数 |
@RequestBody | 解析 JSON/XML 请求体 |
@ResponseBody | 直接返回数据(非视图) |
4.2 数据绑定 & 验证
@PostMapping("/register")
public String register(@Valid @ModelAttribute User user, BindingResult result) {
if (result.hasErrors()) {
return "register-form"; // 返回表单页显示错误
}
userService.save(user);
return "redirect:/login"; // 重定向
}
4.3 异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public ModelAndView handleUserNotFound(UserNotFoundException ex) {
ModelAndView mav = new ModelAndView("error");
mav.addObject("message", ex.getMessage());
return mav;
}
}
5. Spring MVC 高级特性
5.1 拦截器(Interceptor)
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!isUserLoggedIn(request)) {
response.sendRedirect("/login");
return false; // 中断请求
}
return true;
}
}
配置拦截器:
<mvc:interceptors>
<bean class="com.example.AuthInterceptor" />
</mvc:interceptors>
5.2 文件上传
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
file.transferTo(new File("/uploads/" + file.getOriginalFilename()));
}
return "redirect:/success";
}
6. 总结
关键点 | 说明 |
---|---|
核心组件 | DispatcherServlet 、HandlerMapping 、ViewResolver |
请求流程 | 请求 → DispatcherServlet → Controller → 视图渲染 |
注解驱动 | @Controller 、@RequestMapping 、@ResponseBody |
数据绑定 | @ModelAttribute 、@Valid + BindingResult |
拦截器 | 实现 HandlerInterceptor 进行权限控制 |
文件上传 | MultipartFile 处理 |
Spring MVC 通过 DispatcherServlet
统一调度,结合注解驱动开发,使得 Web 层开发更加灵活高效! 🚀