我们先在web.xml中配置好了 DispatcherServlet类
我们服务器端发送的请求 首先进入service方法 可是我们的DispatcherServlet类中没有service方法,所以自动执行其父类的父类的父类HttpServlet抽象类的该方法
HttpServlet类中的service方法最后将request和response传到了doGet方法,就近原则,传到了DispatcherServlet的父类FrameworkServlet中的doGet方法
直接将request和response传入processRequest方法
请求又进入了doService方法,这里的doService方法被DispatcherServlet类重写实现了,所以我们进入DispatcherServlet类中的doService方法
在doService方法中,我们的request被传入了许多的属性值,例如IoC容器,各种解析器等(两个细红圈所示),然后将request传入doDispatch方法
我们来到了doDispatch方法,首先定义一个请求处理器执行链mapperHandler,然后定义一个ModelAndView对象mv,mapperHandler执行getHandler方法,为当前的请求分配handler请求处理器(即Controller层下全部的方法),然后后面返回视图mv
然后定义一个适配器ha,Handler格式是不固定的,所以在处理请求时需要HandlerAdapter做适配
ha调用handle方法,返回ModelAndView对象mv,这里真正的调用了Controller层中的handler方法
最后执行processDispatcherResult方法
processDispatcherResult方法中,将mv对象、请求与响应传入render方法
在DispatcherServlet的render方法中,获得了目标视图,并进入视图对象的render方法
这个renderMergedOutputModel方法指把页面和目标方法的返回结果结合起来,在本类中是个抽象方法,InternalResourceView实现了该方法,我们点进去
最后通过请求转发的方式访问目标页面
使用redirect重定向的方式,是无法访问我们WEB-INF中的jsp页面,只能通过forward(请求转发)的方式