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

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 实现响应式编程。

相关文章:

  • 5 分钟搭建 Prometheus + Grafana 监控
  • vue/react/vite前端项目打包的时候加上时间最简单版本,防止后端扯皮
  • 【C/C++】文件句柄
  • Dify1.01版本vscode 本地环境搭建运行实践
  • SSL 和 TLS 认证
  • Vue 3 事件总线详解:构建组件间高效通信的桥梁
  • 在虚拟环境里面配置Linux系统
  • 工作流集成方案,程序审批功能,springboot集成工作流
  • 解决Win11 rdp输入正确的密码,但是还是登录失败
  • 什么是提示词工程,有哪些开源项目
  • vscode怎么debug vue项目
  • 用Deep seek解析ChatGPT打造数字虚拟人
  • iOS底层原理系列05-内存管理:从核心原理到高级优化
  • Linux网络编程——守护进程
  • 【存储中间件】Redis核心技术与实战(一):Redis入门与应用(高级数据结构:Bitmaps、HyperLogLog、GEO)
  • CSS语言的编程范式
  • 使用DeepSeek和墨刀AI,写PRD文档、画原型图的思路、过程及方法
  • ECU BootLoader开发——Flash编程
  • npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本的处理方法
  • DataWhale 大语言模型 - 长上下文模型和新型架构
  • 黄页网站系统/企点
  • 专业定制网站建设/百度网址大全 简单版
  • 网站编辑工具/关键字优化用什么系统
  • 没有网的电脑怎么安装wordpress/灰色词seo推广
  • wordpress 调试模式/seo外包公司是啥
  • 津坤科技天津网站建设/seo的内容主要有哪些方面