基于 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 对象

下一篇将进行源码调试并分析 SpringtMVC 是如何实现并做到上述差异的

转载于:https://www.cnblogs.com/cyhbyw/p/8624958.html

SpringtMVC中配置 mvc:annotation-driven/ 与 mvc:default-servlet-handler/ 的作用相关推荐

  1. linux添加静态网关route文件,详解Linux系统中配置静态路由的方法

    主机只有一块网卡的时候,不会涉及到默认路由和静态路由的问题.两块网卡时,也可以一块配置有网关(默认路由走这个网卡),另外一块只配置IP和掩码确认(该主机同网络的可以互通).不过在稍大型的.有多网段的环 ...

  2. 在Spring中使用Asciidoctor:使用Spring MVC渲染Asciidoc文档

    Asciidoc是一种基于文本的文档格式,因此如果要将文档提交到版本控制系统中并跟踪不同版本之间的更改,它非常有用. 这使Asciidoc成为编写书籍,技术文档,常见问题解答或用户手册的理想工具. 创 ...

  3. java mvc中重复提交表单,spring mvc 防止重复提交表单的两种方法,推荐第二种

    第一种方法:判断session中保存的token 比较麻烦,每次在提交表单时都必须传入上次的token.而且当一个页面使用ajax时,多个表单提交就会有问题. 注解Token代码: package c ...

  4. 在idea中创建maven工程,搭建MVC框架,完成和servlet相似的操作

    1.创建maven项目 1.1 File -> New Module,进入创建项目窗口. 1.2 点击Next,填写GroupId.ArtifactId和Version 1.3 填写Module ...

  5. Spring 一二事(8) - annotation 形式的 MVC

    1 <!-- 2 component:把一个类放入到spring容器中,该类就是一个component 3 在base-package指定的包及子包下扫描所有的类 4 --> 5 < ...

  6. ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控 ...

  7. java web开发中Filter使用Annotation配置 (转载)

    为什么80%的码农都做不了架构师?>>>    为了在java中得到request和response对象,搜索到了 <如何在Java的普通类中获取Session以及reques ...

  8. asp.net mvc 包含了一个 html 的助手类在哪里,c# - 在App_Code中使用@HTML的ASP.NET MVC Razor Helper - 堆栈内存溢出...

    我尝试在cshtml文件中的App_Code中创建一个Helper. // Using's are needed to ensure helpers function correctly. @usin ...

  9. ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件

    作者: Rick Anderson 翻译: 娄宇(Lyrics) 校对: 高嵩 章节: 介绍视图组件 创建视图组件 调用视图组件 演练:创建一个简单的视图组件 附加的资源 查看或下载示例代码 介绍视图 ...

最新文章

  1. linux oracle 用户创建,LINUX下Oracle数据库用户创建方法详解
  2. java web 树形管理_java web 后台树形菜单排序
  3. equals与hashcode的区别与联系
  4. ThreadPoolExecutor线程池 + Queue队列
  5. .gitignore更新后如何生效
  6. 安装Kibana报错[warning][admin][elasticsearch] Unable to revive connection: http://localhost:9200/
  7. paip.账务系统的安全性
  8. 为什么中国电气自动化工程师这么难招
  9. 那些年我们感到不可思议的数据恢复
  10. javascript 视频进度条制作
  11. 软件测试的简单理解以及与软件开发的区别
  12. 程序设计:从圆的半径求得圆的面积
  13. python not in函数用法,pandas is in和not in的使用说明
  14. BAV99与TVS在静电应用的比较
  15. 【8086汇编基础】05--常用函数库文件--emu8086.inc
  16. 以信息化来提升应急无线电管理
  17. Apache2 VirtualHost的配置方法
  18. 计算机检测报告素材,笔记本检测报告模板.doc
  19. 百度云尹世明:用ABC让复杂的营销更简单
  20. 解决老安卓系统根证书缺失或过期导致的网站访问错误及软件运行问题. 2023-03-05

热门文章

  1. GalHttprequest类库简介——android平台上的一个轻量级的http网络请求及缓存框架
  2. linux slocate(secure locate) 命令详解
  3. 关于MVP模式的一些讨论文章
  4. 基于JSP实现医院病历管理系统
  5. pandas的分列操作str.split()
  6. 基于python的螺纹钢28分钟策略
  7. Bzoj1511---OKR-Periods of Words(KMP)
  8. mysql12----explain
  9. redis sentinel哨兵模式集群搭建教程
  10. BZOJ2743 [HEOI2012]采花