实现Controller的三种方式分析

每种实现的方式对应的HanderAdapter都不同。

实现Controller接口

该接口对应的HanderAdapterSimpleControllerHandlerAdapter

使用案列:

 public class LeController implements Controller {

	 @Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 创建数据视图类
ModelAndView mv = new ModelAndView();
// 填充数据
mv.addObject("msg","北方情韵");
// 跳转的视图
mv.setViewName("index");
return mv;
}
}

配置对应的bean信息,这里的name就是访问该Controller的路径。

<bean class="cn.lele.controller.LeController" name="/le" />

我们可以通过debug那个执行链就可以知道。

实现HttpRequestHandler接口

该接口对应的HanderAdapterHttpRequestHandlerAdapter

使用案例:

 public class YueController implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("msg","实现接口HttpRequestHandler");
request.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(request,response);
} }

配置对应的bean信息,这里的name就是访问该Controller的路径。

<bean class="cn.lele.controller.YueController" name="/yue" />

继续查看当前对象的执行链

这两种方式大体上是类似的,我们可以区别的看一下,他们是怎么处理的。

先看实现HttpRequestHandlerAdapter接口的:

进入1075行代码:

可以发现,这是把当前Controller强转为HttpRequestHander,然后再执行HttpRequestHanderAdapterhandleRequest方法。(实际就是去执行我们Controller里面的方法。)

HttpRequestHandler正是我们Contoller类实现的HttpRequestHandler

同理,我们去看一下实现Controller接口的类的处理方法。

一样,都是先强转为接口类,然后执行对应的方法,也就是我们自己实现的方法:

注意:当前的所处位置:

使用注解的方式

待补充

探究HandlerAdapter的装配规则

一直都很疑惑:

为什么不装配全部都能用,只装配一种,不符合的就不能用了呢?

未配置HandlerAdapter

观察DispatcherServlet的初始化方法:

可以看到有对HandlerAdapter的初始化,点进去加断点。

开始Debug:

根据注释,我们可以知道如果此时HandlerAdapters如果为空的话将加载初始化的HandlerAdapters

可以看到,在664行加载了四个HandlerAdapter

进入此方法继续debug查看:

注意:DispatcherServlet的初始化方法只执行一次,后面需要重新启动tomcat才能继续进入初始化方法。

重启后,继续Debug:

往下走,可以看到这里读取到了几个HandlerAdapter

很明显872行代码是读取了什么文件

重新Debug可以发现这里读取的是org/springframework/web/servlet/DispatcherServlet.properties文件。

DispatcherServlet.properties:

......

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
org.springframework.web.servlet.function.support.HandlerFunctionAdapter ......

文件里内容不少,我这里只留下了HandlerAdapter的信息了

继续往下看怎么处理的:

下面我感觉应该是利用泛型和反射得到所有的处理器。

配置了HandlerAdapter

如果我们再容器中装配了Adapter:

重启tomcat,继续Debug

可以看到642行读取到了我们配置的两个HandlerAdapter,并且再645行赋值给了DispatcherServlet的handlerAdapters,此时方法就会结束了。因为下面都不符合条件了。

总结:

如果我们在容器里添加了HandlerAdapter,那么就不会通过读取本地的文件添加默认的四个HandlerAdapter。

如果没在容器中添加HandlerAdapter,机会读取本地的DispatcherServlet.properties里面的四个HandlerAdapter。

最新文章

  1. codevs 1472 体检
  2. October 17th 2016 Week 43rd Monday
  3. Javascript学习笔记:闭包题解(4)
  4. 安装dubbo-admin遇到的问题和解决之道
  5. 工作随笔——mysql子查询删除原表数据
  6. 在CSDN中添加友情连接
  7. VBA実績表
  8. Lambda Action Func练习
  9. 巧用Systemtap注入延迟模拟IO设备抖动
  10. fgets和scanf的区别
  11. Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作
  12. iOS 8中CLLocationManager及MKMapView showUserLocation失败的解决的方法
  13. 想要学习Linux技术,先好好的读一本Linux书籍吧
  14. ATmega8仿真——外部中断的学习
  15. PORTE_ISFR &amp; (1&lt;&lt;n)
  16. AOP - 1 基本概念
  17. Elasticsearch High Level Rest Client 发起请求的过程分析
  18. nvm 设置 nodejs 默认版本
  19. Centos6.5搭建grok匹配测试网站
  20. 「SDOI2014」数数 解题报告

热门文章

  1. AIBOX视频边缘计算终端,助力识别人员违规行为!
  2. SQL一文入门助记
  3. uniapp 微信小程序 根据经纬度解析地址(腾讯地图)
  4. pyCharm中下载包的速度慢的解决方案
  5. JDBC的一些基础认识,写的不是特别完善,希望大家看的时候别太介意嘿嘿嘿
  6. sqlSession封装以及CRUD的实现
  7. CH32V307 内部10M网络工程创建流程
  8. 基于ERNIELayout&amp;pdfplumber-UIE的多方案学术论文信息抽取
  9. 学习ASP.NET Core Blazor编程系列二十——文件上传(完)
  10. BBS升级版