Spring MVC 全面解析:架构、流程与核心组件(详细)
一、核心架构分层
Spring MVC 以 DispatcherServlet 为中心,协调各组件处理请求:
组件 | 作用 |
---|---|
DispatcherServlet | 前端控制器,统一接收请求并分发给处理器(Controller) |
HandlerMapping | 映射请求 URL 到具体的处理器(Controller 方法) |
HandlerAdapter | 执行处理器方法,处理参数绑定与返回值 |
ViewResolver | 解析视图名称到具体视图技术(JSP、Thymeleaf 等) |
HandlerExceptionResolver | 统一处理 Controller 抛出的异常 |
二、请求处理全流程
- 请求到达:HTTP 请求到达
DispatcherServlet
,由其统筹处理。 - 查询处理器:调用
HandlerMapping
找到匹配的 Controller 方法。 - 执行处理:
HandlerAdapter
触发方法执行,处理参数绑定与逻辑。 - 返回结果:
- 返回逻辑视图名 →
ViewResolver
解析为具体视图(如 JSP)。 - 直接返回数据(如 JSON)→ 通过
HttpMessageConverter
序列化响应。三、配置与注解驱动开发
1. 基于 Java 配置的 MVC 初始化
<JAVA>
@Configuration @EnableWebMvc // 启用Spring MVC注解驱动 @ComponentScan("com.example.web") // 扫描Controller包 public class WebConfig implements WebMvcConfigurer { // 配置视图解析器(Thymeleaf示例) @Bean public ViewResolver viewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); resolver.setCharacterEncoding("UTF-8"); return resolver; } @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setTemplateResolver(templateResolver()); return engine; } private ITemplateResolver templateResolver() { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".html"); resolver.setTemplateMode("HTML5"); return resolver; } // 静态资源处理 @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
2. Controller 开发示例
<JAVA>
@Controller @RequestMapping("/orders") public class OrderController { @Autowired private OrderService orderService; @GetMapping("/{id}") public String getOrderDetails(@PathVariable Long id, Model model) { Order order = orderService.findOrderById(id); model.addAttribute("order", order); return "order/detail"; // 视图名对应Thymeleaf模板路径 } @PostMapping @ResponseStatus(HttpStatus.CREATED) public ResponseEntity<Order> createOrder(@RequestBody @Valid Order order, BindingResult result) { if (result.hasErrors()) { throw new ValidationException("参数校验失败"); } Order savedOrder = orderService.saveOrder(order); return ResponseEntity.created(URI.create("/orders/" + savedOrder.getId())).body(savedOrder); } }
四、数据绑定与验证
1. 参数绑定
- 路径参数:
@PathVariable
<JAVA>
@GetMapping("/users/{userId}/posts/{postId}") public String getPost(@PathVariable Long userId, @PathVariable Long postId) { ... }
- 请求参数:
@RequestParam
<JAVA>
@GetMapping("/search") public List<Product> searchProducts(@RequestParam String keyword, @RequestParam(defaultValue = "0") int page) { ... }
- 表单对象:
@ModelAttribute
<JAVA>
@PostMapping("/register") public String registerUser(@ModelAttribute("user") User user, BindingResult result) { if (result.hasErrors()) { return "register-form"; } // 保存用户 return "redirect:/login"; }
-
2. 数据验证
集成 JSR-303/JSR-380 规范(如Hibernate Validator):
<JAVA>
public class User { @NotBlank(message = "用户名不能为空") @Size(min = 4, max = 20, message = "用户名长度需4-20字符") private String username; @Email(message = "邮箱格式错误") private String email; } @PostMapping("/users") public String createUser(@Validated User user, BindingResult result) { if (result.hasErrors()) { return "user/create-form"; } userService.save(user); return "redirect:/users/list"; }
五、视图技术与 RESTful 支持
1. 视图解析(JSP/Thymeleaf)
- JSP 配置:
<XML>
<!-- 在Spring XML配置中定义 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>
- JSON 输出:
<JAVA>
@RestController // 等效于@Controller + @ResponseBody @RequestMapping("/api/users") public class UserApiController { @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) public List<User> listUsers() { return userService.findAll(); } }
-
2. RESTful 接口设计
HTTP方法 路径 控制器方法 功能 GET /api/users
listUsers()
查询用户列表 POST /api/users
createUser(@RequestBody User)
新增用户 PUT /api/users/{id}
updateUser(@PathVariable Long id, ...)
更新用户信息
六、高级特性与最佳实践
1. 全局异常处理
使用
@ControllerAdvice
统一处理异常:<JAVA>
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ResourceNotFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public ResponseEntity<String> handleNotFound(ResourceNotFoundException ex) { return ResponseEntity.status(404).body(ex.getMessage()); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<Map<String, String>> handleValidationExceptions( MethodArgumentNotValidException ex) { Map<String, String> errors = new HashMap<>(); ex.getBindingResult().getAllErrors().forEach(error -> { String fieldName = ((FieldError) error).getField(); String errorMsg = error.getDefaultMessage(); errors.put(fieldName, errorMsg); }); return ResponseEntity.badRequest().body(errors); } }
2. 拦截器(Interceptor)
实现预处理与后处理逻辑:
<JAVA>
public class LoggingInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { System.out.println("请求开始: " + request.getRequestURI()); return true; // 继续处理链 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { System.out.println("请求处理完成,视图渲染前"); } } // 注册拦截器 @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/**"); } }
七、性能优化技巧
- 静态资源缓存:配置
ResourceHandler
设置 Cache-Control 头。 - 异步处理:使用
@Async
或返回Callable
/DeferredResult
提升吞吐量。<JAVA>
@GetMapping("/async-data") public DeferredResult<String> asyncRequest() { DeferredResult<String> result = new DeferredResult<>(); CompletableFuture.supplyAsync(() -> { // 模拟耗时操作 return "处理完成"; }).whenCompleteAsync((res, ex) -> result.setResult(res)); return result; }
- 启用GZIP压缩:在web服务器(如Tomcat)中配置压缩策略。
-
八、与 Spring Boot 集成
Spring Boot 自动配置简化了 Spring MVC 的配置:
<JAVA>
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } // 自动配置项包括: // - 默认静态资源路径(/static, /public) // - 嵌入式Tomcat/Jetty // - 自动注册 Converter/Formatter // - Jackson JSON 支持
总结
- 核心价值:Spring MVC 通过 分层设计 + 松耦合组件 提供灵活的 Web 开发体验。
- 开发准则:遵循 RESTful 规范,合理运用注解简化代码。
- 进阶方向:结合 Spring Security 实现安全控制、利用 WebFlux 实现响应式编程。
- 返回逻辑视图名 →