Spring MVC分析

基于DispatchServlet设计mvc框架流程

在这里插入图片描述
简单表述一下这个图:

当我们发起一笔请求(包括request、get、post),它通过我们的web.xml中的配置来到达我们的dispatchServlet(通过tomact,jboss等等基于我们的j2ee标准的容器来实现的),到达我们的dispatchSevlet之后,它会转发到我们的控制层,进行业务逻辑处理,设置业务的model,还要指定一个view,这个时候把结果返回到dispatchServlet,之后dispatchSevlet根据我们的modelAndView来返回一个view,这时就是我们的的jsp,最后根据j2ee的标准直接response来返回的web。

回答几个问题
  1. dispatchServlet如何找到control?
  2. 如何调用Control当中业务逻辑?
  3. 如何找到对应视图进行处理的?
  4. dispatchServlet如何进行初始化的?

回答上述问题需要先理解下面的类图
在这里插入图片描述
ViewResolver

必须配  不配需要写全路径

View

是用来解析的,jsp对应jstlView,freeMarker对应freeMarkerView,重定向对应RedirectView

HandlerAdapter

不同实现类对应不同control的调用
eg:AnnotationMethodHandlerAdapter对应注解的
SimpleControllerHandlerAdapter对应实现control接口的
SimpleServletHandlerAdapter对应Spring的用sevlet实现的
为什么需要它,因为handler的类型是Object,不确定用哪个才用这个适配器来确定

在这里插入图片描述

handler类别对应适配器描述
controllerSimpleControllerHandlerAdapter标准控制器,返回modelAndView
HttpRequestHandlerHttpRequestHandlerAdapter业务自行处理请求,不需要通过modleAndView转到视图
ServletSimpleServletHandlerAdapter基于标准的servlet处理
HandlerMethodRequestMappingHandlerAdapter基于@requestMapping对应的方法处理

Handler

就是我们继承Control的类,用来处理业务逻辑的返回modelAndView的(重点理解这个)

HandlerMapping

通过getHandler()方法返回一个封装了handler和拦截器的HandlerExecutionChain链条对象

在这里插入图片描述

BeanNameUrlHandlerMapping 基于ioc name中已“/”开头的Bean时进行注册至映射
SimpleUrlHandlerMapping 基于手动配置url与controller映射
RequestMappingHandlerMapping  基于@RequestMapping注解配置对应映射

HandlerExecutionChain

就是拦截器的作用,不会直接处理handler对象,而会丢给HandlerAdapter去调用

HandlerExceptionResolver

异常处理器

请求处理基本流程图
在这里插入图片描述

现在可以回答那四个问题了

  1. dispatchServlet如何找到control?

通过HandlerMapping

  1. 如何调用Control当中业务逻辑?

HandlerAdapter

  1. 如何找到对应视图进行处理的?

ViewResolver:视图映射,真正解析(由模板转换成html)是View接口的render来处理的

  1. 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

附送源码调用图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值