
文章目录
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返回ModelAndViewController处理业务逻辑,返回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 层开发更加灵活高效! 🚀

3475

被折叠的 条评论
为什么被折叠?



