1. SpringMVC 架构概述
SpringMVC 是 Spring 框架的一个重要组成部分,是一个基于请求驱动的框架,用于处理 Web 请求。SpringMVC 基于前端控制器模式,所有的请求都通过DispatcherServlet进行分发。
1.1 前端控制器模式
- 前端控制器(DispatcherServlet):负责接收所有 HTTP 请求并将它们委派给具体的处理器。
- 处理器映射器(HandlerMapping):根据请求的 URL 定位到相应的处理器(Controller)。
- 处理器适配器(HandlerAdapter):用于将请求适配为 Controller 的方法调用。
- 视图解析器(ViewResolver):将返回的逻辑视图名称解析为具体的视图。
2. DispatcherServlet:请求的中央控制器
DispatcherServlet是 SpringMVC 的核心,负责请求的分发。它会协调所有组件,如 HandlerMapping、HandlerAdapter 和 ViewResolver。
2.1 初始化和请求分发
- 当用户发起请求时,DispatcherServlet会拦截请求,并使用HandlerMapping来查找对应的处理器。
- 找到处理器后,DispatcherServlet使用HandlerAdapter来执行该处理器。
关键源码
- DispatcherServlet负责处理 HTTP 请求并将它们转交给HandlerMapping。
- HandlerExecutionChain表示一个请求和其处理器之间的关系,HandlerAdapter用于执行具体的处理。
2.2 生命周期
- 初始化时:DispatcherServlet 会读取
web.xml或 Spring 配置文件中的配置,加载应用上下文。 - 处理请求时:DispatcherServlet 会通过 AOP 拦截器链(HandlerInterceptor)对请求进行处理。
3. HandlerMapping:请求与处理器的映射
HandlerMapping是 SpringMVC 中用于根据请求 URL 查找相应处理器的组件。SpringMVC 提供了多种HandlerMapping实现,最常用的是RequestMappingHandlerMapping。
3.1 请求映射的核心方法
关键源码
- RequestMappingHandlerMapping是 SpringMVC 中最常用的HandlerMapping实现,它会根据请求的 URL 匹配到具体的处理器方法。
4. HandlerAdapter:请求与处理器方法的适配
HandlerAdapter是用于处理器方法适配的接口,它将请求和响应传递给相应的控制器方法。SpringMVC 通过不同的HandlerAdapter实现来适配不同类型的处理器。
4.1 适配器的核心方法
关键源码
- RequestMappingHandlerAdapter负责将 HTTP 请求适配到实际的控制器方法。它通过反射调用控制器的方法,并将结果封装为ModelAndView。
5. Controller:处理器和视图的结合
Controller是 SpringMVC 中用于处理请求的核心组件。SpringMVC 提供了多种方式来创建 Controller,例如通过实现Controller接口或者使用@Controller注解标注类。
5.1 Controller 方法的执行
关键源码
- 在 SpringMVC 中,
@RequestMapping注解用于将 HTTP 请求映射到控制器方法。 - handleRequest方法会在匹配到
/hello请求时执行,并返回视图名helloView。
5.2 数据的传递与绑定
SpringMVC 支持模型(Model)的传递。返回的视图可以通过ModelAndView或者@ModelAttribute将数据传递到视图层。
关键源码
- ModelAndView用于将控制器返回的模型数据和视图名称传递给视图解析器。
6. ViewResolver:视图的解析
ViewResolver是 SpringMVC 中用于解析视图名的接口。它的实现会根据返回的逻辑视图名解析出具体的视图对象,例如 JSP、Thymeleaf 等。
6.1 视图解析的实现
关键源码
java复制
public class InternalResourceViewResolver implements ViewResolver { private String prefix = "/WEB-INF/views/"; private String suffix = ".jsp"; @Override public View resolveViewName(String viewName, Locale locale) throws Exception { return new InternalResourceView(prefix + viewName + suffix); } }- InternalResourceViewResolver会将逻辑视图名(如
helloView)解析成一个具体的视图对象(如/WEB-INF/views/helloView.jsp)。
7. SpringMVC 中的拦截器:HandlerInterceptor
SpringMVC 提供了HandlerInterceptor机制,在请求处理前后进行拦截操作。可以用于权限校验、日志记录等。
7.1 拦截器的核心方法
关键源码
java复制
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Pre-handle logic"); return true; // 继续执行请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Post-handle logic"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("After completion logic"); } }- preHandle:在请求处理之前执行。
- postHandle:在请求处理后但在视图渲染前执行。
- afterCompletion:在请求完成后执行。
总结
SpringMVC 是一个基于前端控制器模式的 Web 框架,通过DispatcherServlet、HandlerMapping、HandlerAdapter和ViewResolver等组件协同工作,实现了请求的接收、分发、处理和视图渲染。Controller是请求处理的核心,而HandlerInterceptor提供了强大的拦截机制,可用于日志记录、权限校验等。通过灵活配置这些组件,SpringMVC 可以满足复杂的 Web 开发需求。