好记性不如烂笔头。
以程序部署在Tomcat上为例,网站程序使用SpringMVC框架开发。
1.客户端发起一个访问网站的请求(如: localhost:8080/index)。
2.请求到达服务器并Tomcat接收到,Tomcat读取网站的web.xml 配置并缓存。
3.查看配置中是否有符合条件的 Filter 过滤器,有则调用过滤器进行处理。
4. 处理完成后 发现处理请求的servlet 被指定为Spring的DispatcherServlet。
5.DispatcherServlet 接收到Tomcat提交的请求,此时分两种情况:
1)该请求为网站的第一个请求,DispatcherServlet先调用初始化方法 initStrategies(), 然后调用doService()方法
2)请求不为第一次请求该网站,直接调用doService()方法
6.doService()方法调用 doDispatch()方法,doDispatch()内主要分为如下几步:
1)先通过getHandler获得request中对应的请求handler
mappedHandler = getHandler(processedRequest);
getHandler() 方法会去对比初始化时 initHandlerMappings() 生成 的 matchingBeans 中的 requestMappingHandlerMapping ,看requestMappingHandlerMapping 中是否包含processedRequest 请求的路由,存在就返回该路由对应的handler,不存在返回null。
2) 通过获得的handler 获得对应的 HandlerAdapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
getHandlerAdapter() 方法也是去获得初始化时initHandlerAdapters() 方法生成的handerAdapter。
3) handler 中的设置的拦截器(继承自HandlerInterceptorAdapter)在此处进行调用
if (!mappedHandler.applyPreHandle(processedRequest, response)) { return; }
4)执行 handler方法处理请求,并返回一个 ModelAndView 对象
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
controller 中的方法就是在这个方法中被执行的。
5)对 返回的 ModelAndView对象进行处理,返回给客户端,最后调用拦截器的afterCompletion() 方法
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
7. 客户端收到返回的响应。