在 Spring MVC 中,DispatcherServlet 是前端控制器,它接收 HTTP 请求并将请求分发给正确的处理程序。具体的逻辑如下:
- 接收 HTTP 请求。
DispatcherServlet 的入口方法是 doService(),它接收 HTTP 请求,实例化 HttpServletRequest 和 HttpServletResponse 对象,并将它们传递给 doDispatch() 方法:
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
// ...
doDispatch(request, response);
// ...
}
- 根据请求的 URL 找到对应的处理程序。
在 doDispatch() 方法中,DispatcherServlet 首先需要找到与请求 URL 匹配的处理程序。这个任务由 HandlerMapping 接口及其实现类完成。HandlerMapping 会解析请求 URL,并查找与之匹配的处理程序。最常用的实现类是 RequestMappingHandlerMapping,它会解析 @RequestMapping 注解,将 URL 映射到对应的处理程序。
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
// ...
HandlerExecutionChain mappedHandler = null;
mappedHandler = this.handlerMapping.getHandler(request);
// ...
}
- 调用处理程序。
找到处理程序后,DispatcherServlet 就需要执行它了。这个任务由 HandlerAdapter 接口及其实现类完成。HandlerAdapter 会根据处理程序的类型和参数信息来调用处理程序。
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
// ...
HandlerAdapter handlerAdapter = getHandlerAdapter(mappedHandler.getHandler());
ModelAndView mv = handlerAdapter.handle(request, response, mappedHandler.getHandler());
// ...
}
- 根据处理程序返回的视图名或视图对象找到对应的视图。
处理程序执行完毕后,通常会返回一个 ModelAndView 对象,其中包含视图名或视图对象。DispatcherServlet 需要根据这个信息找到对应的视图。这个任务由 ViewResolver 接口及其实现类完成。ViewResolver 会根据视图名或视图对象,查找并返回对应的视图。
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
// ...
View view;
if (mv.isReference()) {
// We need to resolve the view name.
view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
// ...
} else {
// No need to lookup: the ModelAndView object contains the actual View object.
view = mv.getView();
// ...
}
// ...
}
- 渲染视图并将结果返回给客户端。
最后,DispatcherServlet 需要将视图渲染后的结果返回给客户端。这个任务由视图本身完成。视图通常会将渲染结果写入到 HttpServletResponse 对象中,然后 DispatcherServlet 将其发送给客户端。
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
// ...
view.render(mv.getModelInternal(), request, response);
// ...
}
总之,DispatcherServlet 是 Spring MVC 的核心组件,它实现了前端控制器模式,负责接收 HTTP 请求,将其分发给正确的处理程序,并将处理结果渲染为视图返回给客户端。
请求流程图
上述流程图描述了一个完整的请求过程,包括以下步骤:
- 客户端发送请求到 DispatcherServlet。
- DispatcherServlet 获取请求的 HandlerExecutionChain。
- DispatcherServlet 获取 HandlerAdapter。
- HandlerAdapter 调用 Handler 处理请求。
- Handler 返回 ModelAndView。
- DispatcherServlet 获取 ViewResolver。
- ViewResolver 解析视图。
- View 渲染视图。
- DispatcherServlet 返回响应给客户端。