一、核心架构分层
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示例)@Beanpublic ViewResolver viewResolver() {ThymeleafViewResolver resolver = new ThymeleafViewResolver();resolver.setTemplateEngine(templateEngine());resolver.setCharacterEncoding("UTF-8");return resolver;}@Beanpublic 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;}// 静态资源处理@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();} }
2. Controller 开发示例
<JAVA>
@Controller @RequestMapping("/orders") public class OrderController {@Autowiredprivate 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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("请求开始: " + request.getRequestURI());return true; // 继续处理链}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {System.out.println("请求处理完成,视图渲染前");} }// 注册拦截器 @Configuration public class WebConfig implements WebMvcConfigurer {@Overridepublic 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 实现响应式编程。
- 返回逻辑视图名 →