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

devtools/2025/3/16 6:24:06/

一、核心架构分层

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示例)@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/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 {@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 实现响应式编程。

http://www.ppmy.cn/devtools/167480.html

相关文章

晋升系列4:学习方法

每一个成功的人&#xff0c;都是从底层开始打怪&#xff0c;不断的总结经验&#xff0c;一步一步打上来的。在这个过程中需要坚持、总结方法论。 对一件事情长久坚持的人其实比较少&#xff0c;在坚持的人中&#xff0c;不断的总结优化的更少&#xff0c;所以最终达到高级别的…

Vue.js 项目部署全解析:从开发到上线的关键旅程题

引言 在当今快速迭代的前端开发领域&#xff0c;将 Vue.js 项目顺利部署到生产环境&#xff0c;犹如为精心打造的数字产品开启面向世界的大门。从开发阶段的代码编写&#xff0c;到上线前的构建优化&#xff0c;再到最终服务器端的部署与调试&#xff0c;每一步都至关重要且充…

Tomcat 安装

一、Tomcat 下载 官网&#xff1a;Apache Tomcat - Welcome! 1.1.下载安装包 下载安装包&#xff1a; wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.102/bin/apache-tomcat-9.0.102.tar.gz 安装 javajdk。 yum install java-1.8.0-openjdk.x86_64 -y /etc/altern…

股指期货的锁仓是什么意思?

股指期货锁仓是指投资者在持有某一方向仓位的同时&#xff0c;反向开立一个数量相等但方向相反的仓位。这种操作类似于给持仓“上锁”&#xff0c;无论市场价格如何波动&#xff0c;锁仓后的盈亏状态都不会再发生变化。锁仓的主要目的是在不确定的市场环境下&#xff0c;锁定当…

vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题

1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆&#xff0c;邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible &#xff1b; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…

UML详解:14种类型及实例展示

1. 什么是 UML UML 是统一建模语言的缩写。UML 图是基于 UML&#xff08;统一建模语言&#xff09;的图表&#xff0c;目的是直观地表示系统及其主要参与者、角色、动作、工件或类&#xff0c;以便更好地理解、更改、维护或记录信息关于系统。简而言之&#xff0c;UML 是一种现…

AI自动文献综述——python先把知网的文献转excel

第一步 Refworks转excel 下载以后是个txt文件, 帮我把这个txt文件转excel,用函数形式来写便于我后期整理成软件 提取 其中的 标题,作者,单位,关键词,摘要。 分别存入excel列。 import re import pandas as pddef extract_and_convert(txt_file_path, output_excel_path…

手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机

首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线&#xff0c;一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线&#xff0c;插入手机充电口&#xff08;可能会需要转接头&#xff09; 然后确保手机开机 按下键盘…