SpringMVC运行原理总结
1、 用户发送请求至前端控制器DispatcherServlet捕获
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器
a、进入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); } }
b、获取到对应方法之后会调用对应(此处为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); } //还有方法不列举......
c、进入processRequest方法——执行其doService方法:
d、而此doService方法也就是DispatcherServlet中的doService方法(该方法将一些值传如request对象中):
e、然后执行其中的doDispatch方法:
f、 进入该方法可知该方法处理了适配器以及GET请求:
g、然后执行Handler方法并构建视图processDispatchResult:
3、此处如果没有处理请求Handler的方法(请求地址找不到)
进入processDispatchResult方法查看处理
a、配置了静态资源<mvc:default-servlet-handler/>,并且此次请求属于静态资源配置范围,则会得到静态资源的视图
b、没有配置静态资源<mvc:default-servlet-handler/>,或者请求不属于范围内,则会构建框架自带的一个异常视图(如404页面等)
4、有处理请求Handler方法(请求地址在配置范围内)
a、HandlerMapping 获取HandlerExecutionChain 对象
b、获取 HandlerAdapter对象
5、拦截器三个方法与视图获取的执行先后顺序
a:preHandle方法(在Handler Method方法执行前调用。功能举例:校验、实现权限等)
通过标蓝代码我们可以看到preHandle在Handler Method之前执行,
mappedHandler.applyPreHandle(processedRequest, response)执行的也就是我们创建的拦截器里的preHandler方法,
我们可以在该方法里通过返回boolean的值来决定是打回请求(拒绝访问),还是继续执行之后的步骤。
b:postHandle方法(在Handler Method方法执行后,渲染视图前调用。功能举例:加签名,印章等)
标蓝部分即postHandlle的执行,可见他在Handler Method之后执行,而在processDispatchResult(该方法里将会进行视图渲染,详见下方法图)之前执行
c、afterCompletion方法(在渲染视图之后被调用。功能举例:释放资源)
由上方法介绍可知,之后会执行processDispatchResult方法,我们找到该方法
如果有异常,则会构建异常视图如果没有则会构建指定视图,可见render方法,该方法我们在自定义视图的博客中介绍过,是用来进行渲染视图的
执行完上述视图渲染后,进行afterCompletion方法
6、将请求返回客户端