Spring MVC 是一个强大而灵活的框架,它为构建基于 Java 的 Web 应用程序提供了一整套解决方案。理解其请求执行流程是掌握 Spring MVC 的关键。本文将通过分析 Spring MVC 请求执行流程的源码,帮助大家更好地理解其内部工作机制。
请求执行流程概述
在 Spring MVC 中,当用户发起请求时,整个过程大致可以分为以下几个步骤:
- 接收请求:Servlet 接收到请求。
- 请求分发:DispatcherServlet 根据请求信息将其分发到相应的处理程序。
- 处理请求:调用相应的控制器来处理请求,并返回 ModelAndView。
- 渲染视图:将 ModelAndView 景观渲染为最终的HTML页面。
- 返回响应:将渲染后的页面返回给客户端。
具体流程解析
1. 接收请求
Spring MVC 使用 DispatcherServlet
作为前端控制器,负责接收所有的 HTTP 请求。web.xml
文件中配置了 DispatcherServlet
,如下示例:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2. 请求分发
当请求到达 DispatcherServlet
,它会根据请求的 URL 和配置的处理器映射器(HandlerMapping
)找到合适的控制器。例如,AnnotationMethodHandlerMapping
基于注解来匹配请求:
@Override
protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
String lookupPath = getLookupPathForRequest(request);
HandlerMethod handlerMethod = this.handlerMethodMapping.lookupHandlerMethod(lookupPath);
return handlerMethod;
}
3. 处理请求
DispatcherServlet
找到对应的控制器后,执行控制器的方法。控制器方法的返回值通常是 ModelAndView
对象。示例控制器如下所示:
@Controller
public class MyController {
@RequestMapping("/hello")
public ModelAndView hello() {
ModelAndView modelAndView = new ModelAndView("hello");
modelAndView.addObject("message", "Hello, Spring MVC!");
return modelAndView;
}
}
4. 渲染视图
在得到 ModelAndView
后,DispatcherServlet
会调用视图解析器(ViewResolver
)来获取视图名称对应的实际视图对象。常见的视图解析器是 InternalResourceViewResolver
,它根据配置的前后缀返回 JSP 视图:
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
如果 Controller 返回的视图名是 "hello",则解析器将返回 /WEB-INF/views/hello.jsp
。
5. 返回响应
最后,控制器的返回结果通过视图渲染生成 HTML 页面,DispatcherServlet
将结果写入 HTTP 响应中返回给客户端。
@Override
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 省略部分代码
View view = getViewForWebResponse(modelAndView, request);
view.render(model, request, response);
}
总结
以上是 Spring MVC 请求执行流程的简要解析。从接收请求到返回响应,这一流程中的每个步骤都显示了 Spring MVC 的设计理念:通过统一的前端控制器和多个后端处理器解耦请求与处理逻辑,从而实现高效、灵活和可扩展的架构。理解这一执行流程,不仅能帮助开发者更好地使用 Spring MVC 进行开发,还能在调试和优化应用程序时提供指导。