Spring MVC 核心组件详解

Spring MVC 架构基于 前端控制器模式,其核心组件协同工作实现请求处理流程。以下是关键组件及其作用、配置示例与工作流程解析:


一、核心组件及功能

1. DispatcherServlet(前端控制器)
  • 作用:中央调度器,统一接收所有HTTP请求,分发到对应组件处理,并渲染响应。

  • 配置位置 :web.xml(传统)或通过 WebApplicationInitializer(Servlet 3.0+,基于Java Config)。

  • XML配置示例 :

    复制代码

    <XML>

    复制代码
    <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-mvc-config.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>

2. HandlerMapping(处理器映射器)
  • 作用:根据请求URL映射到对应的Controller或处理方法。

  • 常见实现 :

    • RequestMappingHandlerMapping:支持注解(如@RequestMapping)。
    • BeanNameUrlHandlerMapping:根据Bean名称映射URL。
  • 配置示例 (注解驱动):

    复制代码

    <JAVA>

    复制代码
    @Configuration
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {
        // 自动注册 RequestMappingHandlerMapping 和 HandlerAdapter
    }

3. HandlerAdapter(处理器适配器)
  • 作用 :适配不同类型的处理器(如@Controller、HttpRequestHandler)并调用其方法。

  • 关键实现 :

    • RequestMappingHandlerAdapter:处理基于注解的控制器方法。
    • HttpRequestHandlerAdapter:处理实现HttpRequestHandler接口的控制器。
  • 配置扩展点 (如自定义参数解析器):

    复制代码

    <JAVA>

    复制代码
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new CustomArgumentResolver());
    }

4. Controller(控制器)
  • 作用:处理业务逻辑,返回模型数据和视图名。

  • 注解示例 :

    复制代码

    <JAVA>

    复制代码
    @Controller
    @RequestMapping("/user")
    public class UserController {
        @GetMapping("/info")
        public String getUserInfo(Model model) {
            model.addAttribute("user", userService.findUser());
            return "user/info"; // 视图名称
        }
    }

5. ViewResolver(视图解析器)
  • 作用:将视图名解析为具体的视图实现(如JSP、Thymeleaf)。

  • 常见实现 :

    • InternalResourceViewResolver:解析JSP。
    • ThymeleafViewResolver:集成Thymeleaf模板引擎。
  • 配置示例 :

    复制代码

    <XML>

    复制代码
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/views/" />
      <property name="suffix" value=".jsp" />
    </bean>

6. HandlerInterceptor(拦截器)
  • 作用:在请求处理前后执行预处理或后处理(如权限验证)。

  • 自定义拦截器 :

    复制代码

    <JAVA>

    复制代码
    public class AuthInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
            if (!checkAuth(request)) {
                response.sendRedirect("/login");
                return false;
            }
            return true;
        }
    }
  • 注册拦截器 :

    复制代码

    <JAVA>

    复制代码
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/admin/**");
    }

7. MultipartResolver(文件上传解析器)
  • 作用 :解析文件上传请求(如处理multipart/form-data类型请求)。

  • 配置示例 :

    复制代码

    <XML>

    复制代码
    <bean id="multipartResolver" 
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <property name="maxUploadSize" value="10485760"/> <!-- 10MB -->
    </bean>

二、请求处理流程

  1. 请求入口 :客户端请求到达 DispatcherServlet。
  2. 查找Handler :通过 HandlerMapping 确定处理请求的Controller或方法。
  3. 执行拦截器 :调用 HandlerInterceptor 的 preHandle 方法。
  4. 适配处理 :HandlerAdapter 执行具体的Controller方法,返回ModelAndView。
  5. 处理视图 :ViewResolver 解析视图名并渲染视图,填充模型数据。
  6. 响应返回:生成HTTP响应返回客户端。

三、高级配置与扩展

  1. 异常处理
    • 组件 :HandlerExceptionResolver,处理Controller抛出的异常。

    • 注解 :@ExceptionHandler(在Controller或@ControllerAdvice类中)。

      复制代码

      <JAVA>

      复制代码
      @ControllerAdvice
      public class GlobalExceptionHandler {
          @ExceptionHandler(Exception.class)
          public ModelAndView handleError(Exception ex) {
              ModelAndView mav = new ModelAndView("error");
              mav.addObject("message", ex.getMessage());
              return mav;
          }
      }

  1. 消息转换器
    • 组件 :HttpMessageConverter,处理请求/响应体转换(如JSON ↔ 对象)。

    • 示例 :集成Jackson处理JSON:

      复制代码

      <JAVA>

      复制代码
      @Configuration
      public class WebConfig implements WebMvcConfigurer {
          @Override
          public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
              converters.add(new MappingJackson2HttpMessageConverter());
          }
      }

四、总结

  • 核心组件 :围绕 DispatcherServlet 展开,包括映射(HandlerMapping)、适配(HandlerAdapter)、视图解析(ViewResolver)三驾马车。
  • 扩展性 :通过实现接口或继承类(如 WebMvcConfigurer),可自定义拦截器、参数解析器等。
  • 最佳实践 :优先使用注解驱动(@RequestMapping, @Controller)代替传统XML配置,提高代码可读性。
相关推荐
EatFan4 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
Maiko Star5 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
现任明教教主~7 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
一条破秋裤7 小时前
Linux 线程创建:pthread_create 与基本回收
java·linux·运维
布吉岛的石头8 小时前
Java 程序员第 49 阶段5:BERT 预训练目标 MLM+NSP 的工程含义
java·人工智能·深度学习·bert·transformer
摇滚侠8 小时前
《On Java 中文版 基础卷》阅读笔记 对象无处不在 03
java·笔记·python
二十雨辰9 小时前
[学成在线]-01项目背景
java
弈栈录10 小时前
Java AI 应用的异步化与高并发设计
java·后端·架构
落魄实习生10 小时前
Agent Scope Java 2.x 系列【2】 ReActAgent
java·开发语言
艸肅10 小时前
Ubuntu 安装 JDK (含手动安装)
java·ubuntu·jdk