SpringMVC执行流程
01.客户端发送请求被我们在web.xml中配置DispatcherServlet(核心控制器)拦截;
默认执行DispatcherServlet中的
protected void doDispatch(HttpServletRequest req,HttpServletResponse resp) throws Exception{};
此方法中定义了HandlerExecutionChain mapperHandler=null;//处理器执行链
MapperHandler = getHandler(processedRequest);//根据用户的请求获取处理器执行
链;
02.核心控制器请求HandlerMapping(处理器映射器)查找需要的Handler(Controller)并返回此Handler;
进入protected HandlerExecutionChain getHandler(HttpServletRequest req) throws Exception{};
//在处理器映射器中遍历查找请求的Handler
for(HandlerMapping hm:this.handlerMappings){ //handlerMappings==>List<HandlerMapping>
//hm是List<HandlerMapping>集合中的一个元素==》HandlerMapping
HandlerExecutionChain handler = hm.getHandler(req);
}
继续跟进HandlerMapping接口的实现类AbstractHandlerMapping类中的
public final HandlerExecutionChain getHandler(HttpServletRequest req) throws Exception{};
Object handler = getHandlerInternal(req);//获取要执行的Handler
HandlerExecutionChain executionChain = getHandlerExecutionChain(handler,req);
跟进getHandlerExecutionChain();
For(HandlerInterceptor interceptor : this.adaptedInterceptor){
…
chain.addInterceptor(interceptor);//添加了一些处理器拦截器
}
由此可知:处理器执行链中包含了一个即将执行的handler和一些intercpetor拦截器。
03.核心控制器DispatcherServlet调用HandlerAdapter(处理器适配器)去执行Handler;
经过以上操作,现在核心控制器已经拿到要执行的handler;
回到DispatcherServlet中的doDispather方法继续往下执行;
//获取处理器适配器,参数为处理器执行链中获取处理器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
跟进protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException{};
//handlerAdapters ==> List<HandlerAdapter>
for(HandlerAdapter ha : this.handlerAdapters){
…
If(ha.support(handler)){
return ha; //返回需要的处理器适配器 handlerAdapter
}
}
跟进 support()方法;
boolean support(Object handler);是HandlerAdapter接口中的方法;
此方法有5个实现类;默认执行3个;
在webmvc的jar包下找到DispatcherServlet.properties配置文件;
默认的处理器映射器/处理器适配器配置为:
04.Handler(Controller)执行完成后给HandlerAdapter返回ModelAndView;
返回到doDispatch方法继续往下执行;
mv = ha.handler(processedRequest,response,mappedHandler.getHandler());
跟进handler方法所属接口是HandlerAdapter;
handler() 有5个实现类;根据DispatcherServlet.properties中配置的顺序来执行;
首先进入HttpRequestHandlerAdapter,此类中的handler方法最终将handler向下转型为HttpRequestHandler类型,和我们自定义的Controller无关;
所以继续执行下一个Adapter;
然后进入SimpleControllerHandlerAdapter类中的handler方法,此方法中将handler向下转型为Controller类型,正是我们需要的!(因为我们自定义的Controller继承了AbstractController又实现了Controller接口)
观察handler方法中的代码:
分析以上方法:
01. 只有Controller类型才有handlerRequest方法
02. AbstractController实现了Controller;
返回的handleRequestInternal方法也是AbstractController中的方法;
此方法为抽象方法;观察它的实现类有:
03. 我们自定义的Controller中的方法名称是handlerRequestInternal
04.所以执行Controller的handlerRequestInternal方法就是执行HelloController中的handlerRequestInternal方法。
05.HandlerAdapter(处理器映射器)向前端核心控制器DispatcherServlet返回ModelAndView;
06.核心控制器DispatcherServlet请求ResolverView(视图解析器)进行解析,
将逻辑视图名解析成真正的视图对象View(视图可以为jsp,xml,pdf,json…);
07.视图解析器(ResolverView)向DispatcherServlet返回View,并使用ModelAndView对象模型数据对View进行视图渲染;
08.最终客户端获得响应消息。