springMVC的执行请求过程
springMVC的运行流程:
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)并返回给DispatcherServlet
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(Controller,也叫后端控制器)
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果(ModelAndView)返回给DispatchServlet
8、DispatchServlet将ModelAndView传给ViewResolver视图解析器(如果加上@responsebody注解,则返回值不通过viewResolver,而是直接返回object)
9、ViewResolver解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
11、DispatcherServlet响应用户
从以上过程可以看出,DispatcherServlet有接受请求,响应结果,转发等作用。有了DispatcherServlet之后,可以减少组件之间的耦合度。
简要过程如下:
下面我们从源码来详细分析请求的执行过程:
我们从页面发送的请求,进入DispatcherServlet类Service方法(位于DispatcherServlet类继承的——FrameworkServlet类中)捕获该请求:
@Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpMethod httpMethod = HttpMethod.resolve(request.getMethod()); if (HttpMethod.PATCH == httpMethod || httpMethod == null) { processRequest(request, response); } else { super.service(request, response); } }
获取到对应方法之后会调用对应(此处为doGet)方法:
@Override protected final void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @Override protected final void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } //还有方法不列举......
进入processRequest方法——执行其doService方法:
而此doService方法也就是DispatcherServlet中的doService方法(该方法将一些值传如request对象中):
然后执行其中的doDispatch方法:
进入该方法可知该方法处理了适配器以及GET请求:
然后执行Handler方法并构建视图processDispatchResult:
我们进入processDispatchResult方法查看构建,其中可看到
如果出现请求出现异常将会构建一个异常视图(如404页面等)
而在这之前我们需要的视图构建在render里创建:
我们沿着这一条线索往下走找到其实现的AbstractView中的render:
其中的renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);用于将请求和数据进行处理
继续往下走找到其实现的InternalResourceView中的renderMergedOutputModel
其中的红线标注的就是处理的Dispatch
标蓝部分就是请求转发