mvc:annotation-driven 与 mvc:default-servlet-handler的作用
本人见解:两个标签需要配合使用,可以很好地处理SpringMVC请求静态资源或者控制器时的选择(静态资源包括图片,jsp,css,但是不设置的话访问jsp可以显示,不知原因)
下方转发自:https://www.cnblogs.com/cyhbyw/p/8624958.html
基于 Spring4.X 来学习 SpringtMVC, 在学习过程中,被“告知”在 XML 配置文件中建议设置如下两项:
一直不明白为什么,但又甘心。于是,花了一点时间来调试源码,想了解清楚为什么需要这样做。
Demo代码地址:
https://github.com/cyhbyw/springMVC_atguigu_TongGang
工程名称:
springMVC_DebugSourceCode
现在开始调试。
==============>>>>
PS:图片可能不是很清晰,可以右击图片、选择在新标签页中查看
或者,可以右击图片,选择“图片另存为”保存在本地并编好号(建议直接以01、02、03……来编号)
或者,可以右击图片,选择“复制图片”,再保存到本地并编好号(建议直接以01、02、03……来编号)
以上三种办法,任意选择喜欢的一种,以获得并查看更清晰的图片~~
<<<<==============
情况一:有这两个标签时
1. 初始化 HandlerMapping 的过程如下,且其中包含 RequestMappingHandlerMapping!如下图所示。
2. 初始化 HandlerAdapter 的过程如下,且其中包含 RequestMappingHandlerAdapter!如下图所示。
情况二:没有这两个标签 (提醒:调试时需要注释掉这两个标签的内容)
1. 初始化 HandlerMapping 的过程如下,且其中包含 DefaultAnnotationHandlerMapping。如下图所示。
从源码中可以看到,它调用了Line588的 getDefaultStrategies() 方法。而有这两个标签时,调用的是Line570的方法。
2. 初始化 HandlerAdapter 的过程如下,且其中包含 AnnotationMethodHandlerAdapter!如下图所示。
从源码中可以看到,它调用了Line626的 getDefaultStrategies() 方法。而有这两个标签时,调用的是Line608的方法。
可以看到,当有、无这两个标签时,SpringtMVC所采用的HandlerMapping、HandlerAdapter是不一样的。对比如下:
有这两个标签时 | 没有这两个标签时 | |
HandlerMapping | BeanNameUrlHandlerMapping SimpleUrlHandlerMapping RequestMappingHandlerMapping | BeanNameUrlHandlerMapping DefaultAnnotationHandlerMapping |
HandlerAdapter | HttpRequestHandlerAdapter SimpleControllerHandlerAdapter RequestMappingHandlerAdapter | HttpRequestHandlerAdapter SimpleControllerHandlerAdapter AnnotationMethodHandlerAdapter |
从表中可以看出:
1. 对于HandlerMapping,有标签时比无标签时多出一个 SimpleUrlHandlerMapping。更重要的是,将 DefaultAnnotationHandlerMapping 更新为 RequestMappingHandlerMapping!而从源码中也可以看到,前者已被废弃并建议使用后者。
2. 对于HandlerAdapter,将 AnnotationMethodHandlerAdapter 更新为 RequestMappingHandlerAdapter!同理,前者已被废弃并建议使用后者。
不知道会不会是因为上述原因才建议加上这两个标签的,但是,总归来说,使用已过时被废弃的类总是不好的吧。所以,即使没有其它更多理由,还是遵循建议,加上这两个标签吧。
自己还知道的建议加上这两个标签的其它原因如下(还未完全确认):
1. 除了自动注册上述的 RequestMappingHandlerMapping 与 RequestMappingHandlerAdapter 外,它还会自动注册 ExceptionHandlerExceptionResolver
2. 支持使用 ConversionService 进行数据格式转换
3. 支持使用 NumberFormatAnnotation 与 DateTimeFormat 进行数据格式化
4. 支持使用 RequestBody 与 ResponseBody 注解
上面的整个流程都是围绕着初始化 HandlerMapping & HandlerAdapter (就是给它们赋值)来展开的。既然已经赋值,那总得有取值并使用它们的地方吧。
使用流程如下:
1. 先会到达 DispatcherServlet 的 doDispatcher() 方法(此方法非常重要,是 SpringtMVC 处理Controller方法的核心入口!!);同时,会先后分别调用 getHandler() & getHandlerAdapter() 方法。
2. getHandler() 方法中就会使用刚刚赋值过的 HandlerMapping 对象
3. getHandlerAdapter() 方法中就会使用刚刚赋值过的 HandlerAdapter 对象
相关文章
- Spring框架中<mvc:default-servlet-handler/>的作用
- spring mvc绑定对象String转Date解决入参不能是Date的问题
- Spring MVC的简单用法
- ssm(Spring+Spring mvc+mybatis)——saveDept.jsp
- ssm(Spring+Spring mvc+mybatis)Spring配置文件——applicationContext-servlet.xml
- MVC模式:python案例
- spring MVC上传图片
- MVC过滤器简单刨析
- Atitit java rest mvc微服务原理以及框架选型 目录 第一节 Mvc原理 model controler view1 第二章 Spark 最简单1 第一节 Sprbt to
- Atitit. js mvc 总结(2)----angular 跟 Knockout o99 最佳实践
- paip.spring3 mvc servlet的配置以及使用最佳实践
- 前端MVC Vue2学习总结(二)——Vue的实例、生命周期与Vue脚手架(vue-cli)
- 002-MVC架构,贫血的领域模型、spring mvc,webhars使用
- 【.NET特供-第三季】ASP.NET MVC系列:MVC与三层图形对照(颠覆性理论)
- Spring MVC复选框
- Spring MVC统一异常处理的3种方式(附带实例)