SpringMvc-Dispatcher
来源:互联网 发布:淘宝a0图纸扫描仪 编辑:程序博客网 时间:2024/05/22 16:53
虽然知道springMvc处理请求的大致过程,但是具体实现在脑子里比较模糊,因此简单看下源码,只求看懂工作原理,并做下笔记。
几个关键类或接口的说明:
HandlerMapping:
这是一个接口,该接口表示实现了这个接口的类是完成url和处理bean映射逻辑的。当SpringMvc启动就会根据选择的实现类去把Controller类型的bean和url绑定如果我们不在配置文件配置,默认会用BeanNameUrlHandlerMapping 这个实现类去完成这个工作(实现类种类如图1)。在registerHandler(String urlPath, Object handler)这个方法中把urlPath当做bean的Name,从ApplicationContext中拿到bean的实例,然后放入urlPath为key,value为该实例的map中(图2)。
图1:HandlerMapping的实现类
图2:registerHandler。
HandlerAdapter
由于springMVC创建的handle的种类有很多种,不同的handler处理请求的方法不同(如图3)。这里就用了适配器模式。因为如果把handler类型的判断放到请求的处理中不符合规范代码的要求,也使处理请求的代码不够简练,总而言之,处理请求就是处理请求,不应该有其他逻辑。具体的适配方式是,HandlerAdapter接口有一个supports(Object handle)方法,该方法判断该当前的适配器是否支持这种handle。
图3:handle有几种adpter就有几种。
HandlerExecutionChain
该类持有一个Object Handle的对象,和一个拦截器的集合。当请求进来,doDispatcher方法会遍历所有的HandlerMapper从中找到和request匹配的hander,把这个hander放入HandlerExecutionChain中。
doDispatcherServlet
doDispatcherServlet中的doService首先拿到请求,对request注入一些属性然后调用doDispatch。这个方法首先判断request是否是Multipart类型(处理文件上传下载)如果是会构建processRequest时传入multipartResolver。然后根据request中的url,从handleMapper中找到对应hander并且放入handlerExecutionChain对象中。然后根据handlerExecutionChain中的hander找到对应的适配器HandlerAdapter。然后调用handlerExecutionChain的applyPreHandle();方法执行handlerExecutionChain中前置拦截器的逻辑。然后执行HandlerAdapter.handle()方法执行我们在controller中写的逻辑。
- SpringMvc-Dispatcher
- SpringMVC—Dispatcher配置
- Springmvc之dispatcher-servlet.xml
- springMVC中Dispatcher中的/和/*的区别
- SpringMVC与Web解读(二):Dispatcher
- dispatcher
- Dispatcher
- Dispatcher
- Dispatcher
- Dispatcher
- SpringMVC之context-dispatcher.xml,了解基本的控制器
- springMvc 配置 controller 配置 spring-dispatcher-servlet.xml
- springmvc的Dispatcher的url-pattern的拦截机制
- SpringMVC中的配置文件applicationContext.xml和dispatcher-servlet.xml
- SpringMVC 4.2.2 - Web.xml,Dispatcher-Servlet及ApplicationContext配置笔记
- springmvc发生No mapping found for HTTP request with URI[...] in dispatcher servlet
- idea 创建 springMVC 项目中 dispatcher-servlet.xml文件的基本配置
- Filter,Dispatcher
- Spring:SpringMVC 视图解析 - ViewResolver&View
- GIT安装
- virtualbox centos6.5 ambari1.7 单机安装hdp2.2相关笔记
- java 关键字
- HDU 2830 Matrix Swapping II(dp最大子矩阵和)
- SpringMvc-Dispatcher
- 强大的vim配置文件,让编程更随意
- JavaScript--修改DOM节点CSS样式
- 网教20. 猜-丁-壳!
- sosi脚本改造
- Linux中rz和sz命令用法
- matlab程序向量化理解
- jsp打印杨辉三角
- java使用http下载文件