当前位置: 首页 > article >正文

Spring MVC 全面解析:架构、流程与核心组件(详细)

一、核心架构分层

Spring MVC 以 DispatcherServlet 为中心,协调各组件处理请求:

组件作用
DispatcherServlet前端控制器,统一接收请求并分发给处理器(Controller)
HandlerMapping映射请求 URL 到具体的处理器(Controller 方法)
HandlerAdapter执行处理器方法,处理参数绑定与返回值
ViewResolver解析视图名称到具体视图技术(JSP、Thymeleaf 等)
HandlerExceptionResolver统一处理 Controller 抛出的异常

二、请求处理全流程

  1. 请求到达:HTTP 请求到达 DispatcherServlet,由其统筹处理。
  2. 查询处理器:调用 HandlerMapping 找到匹配的 Controller 方法。
  3. 执行处理HandlerAdapter 触发方法执行,处理参数绑定与逻辑。
  4. 返回结果
    • 返回逻辑视图名 → 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/userslistUsers()查询用户列表
      POST/api/userscreateUser(@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 实现响应式编程。

http://www.kler.cn/a/590344.html

相关文章:

  • spring bean的生命周期和循环依赖
  • 【零基础入门unity游戏开发——unity2D篇】2D射线和范围检测之Physics2D Raycast、OverlapCircle、OverlapBox
  • golang函数与方法的区别
  • K8S快速部署
  • 新闻发布时间抽取分析
  • LinkedList和链表
  • 【MySQL】从零开始:掌握MySQL数据库的核心概念
  • containerd 拉取镜像的工具以及优劣
  • 系统架构设计师—案例分析—架构评估
  • LLM论文笔记 24: A Theory for Length Generalization in Learning to Reason
  • QT非UI设计器生成界面的国际化
  • Java 买百鸡问题
  • Google内购 Java服务端(Springboot)校验订单详细流程
  • 日志存储与分析
  • [贪心算法] 摆动序列
  • Matlab 汽车ABS实现模糊pid和pid控制
  • JVM垃圾回收器全面解析:从核心概念到选型指南
  • Matlab 经验模态分解和时频图绘制
  • 结构型模式之外观模式:让复杂系统变简单的利器
  • golang中的结构体