基于DispatchServlet设计mvc框架流程
简单表述一下这个图:
当我们发起一笔请求(包括request、get、post),它通过我们的web.xml中的配置来到达我们的dispatchServlet(通过tomact,jboss等等基于我们的j2ee标准的容器来实现的),到达我们的dispatchSevlet之后,它会转发到我们的控制层,进行业务逻辑处理,设置业务的model,还要指定一个view,这个时候把结果返回到dispatchServlet,之后dispatchSevlet根据我们的modelAndView来返回一个view,这时就是我们的的jsp,最后根据j2ee的标准直接response来返回的web。
回答几个问题
- dispatchServlet如何找到control?
- 如何调用Control当中业务逻辑?
- 如何找到对应视图进行处理的?
- dispatchServlet如何进行初始化的?
回答上述问题需要先理解下面的类图
ViewResolver
必须配 不配需要写全路径
View
是用来解析的,jsp对应jstlView,freeMarker对应freeMarkerView,重定向对应RedirectView
HandlerAdapter
不同实现类对应不同control的调用
eg:AnnotationMethodHandlerAdapter对应注解的
SimpleControllerHandlerAdapter对应实现control接口的
SimpleServletHandlerAdapter对应Spring的用sevlet实现的
为什么需要它,因为handler的类型是Object,不确定用哪个才用这个适配器来确定
handler类别 | 对应适配器 | 描述 |
---|---|---|
controller | SimpleControllerHandlerAdapter | 标准控制器,返回modelAndView |
HttpRequestHandler | HttpRequestHandlerAdapter | 业务自行处理请求,不需要通过modleAndView转到视图 |
Servlet | SimpleServletHandlerAdapter | 基于标准的servlet处理 |
HandlerMethod | RequestMappingHandlerAdapter | 基于@requestMapping对应的方法处理 |
Handler
就是我们继承Control的类,用来处理业务逻辑的返回modelAndView的(重点理解这个)
HandlerMapping
通过getHandler()方法返回一个封装了handler和拦截器的HandlerExecutionChain链条对象
BeanNameUrlHandlerMapping 基于ioc name中已“/”开头的Bean时进行注册至映射
SimpleUrlHandlerMapping 基于手动配置url与controller映射
RequestMappingHandlerMapping 基于@RequestMapping注解配置对应映射
HandlerExecutionChain
就是拦截器的作用,不会直接处理handler对象,而会丢给HandlerAdapter去调用
HandlerExceptionResolver
异常处理器
请求处理基本流程图
现在可以回答那四个问题了
- dispatchServlet如何找到control?
通过HandlerMapping
- 如何调用Control当中业务逻辑?
HandlerAdapter
- 如何找到对应视图进行处理的?
ViewResolver:视图映射,真正解析(由模板转换成html)是View接口的render来处理的
- dispatchServlet如何进行初始化的?
request的请求过程(从dispatcherServlet看)
1、调用doDispatch()
2、遍历handlerMapping与request,通过getHandler()方法获取一个调用执行链
3、遍历handlerAdapters与handler(通过执行链)获取一个handler适配器
4、通过执行链去调用拦截器当中的preHandler方法进行预处理
5、预处理成功,基于Handler适配器调用handle方法,返回modelAndView
6、通过执行链去调用拦截器当中的postHandler方法进行拦截处理(对modelAndView做手脚)
7、processDispatchResult()
7.1、正常情况下:调用render方法进行视图解析(遍历ViewResolver与viewName获取view,基于viewClass来确定试图解析器,调用View.render方法解析返回(设置model属性至request))
7.2、异常情况下:遍历handlerExceptionResolvers调用resolveException()返回mv,最后跳转到异常
SpringMVC的上下文的初始化的过程
1、创建DispatchServlet
2、initServletBean
3、createWebApplicationContext
createBeanFactory
loadBeanDefinitions(ContextConfigLocation)
registerBeanDefinition
(IOC加载完毕)
4、initStrategies(初始化mvc环境)
initHandlerMapping(初始化映射配置)
initHandlerAdapters(初始化适配器)
initHandlerExceptionResolvers
initViewResolvers