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>
二、请求处理流程
- 请求入口:客户端请求到达
DispatcherServlet
。 - 查找Handler:通过
HandlerMapping
确定处理请求的Controller或方法。 - 执行拦截器:调用
HandlerInterceptor
的preHandle
方法。 - 适配处理:
HandlerAdapter
执行具体的Controller方法,返回ModelAndView
。 - 处理视图:
ViewResolver
解析视图名并渲染视图,填充模型数据。 - 响应返回:生成HTTP响应返回客户端。
三、高级配置与扩展
- 异常处理
- 组件:
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; } }
- 组件:
- 消息转换器
- 组件:
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配置,提高代码可读性。