mvc:annotation-driven 与 mvc:default-servlet-handler的作用

2023-11-17

本人见解:两个标签需要配合使用,可以很好地处理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 对象

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mvc:annotation-driven 与 mvc:default-servlet-handler的作用 的相关文章

随机推荐

  • anita的音乐空间(项目)

    目录 项目核心功能 项目前置工作 1 创建项目 2 数据库设计 3 配置文件中配置数据库和xml 核心功能设计 1 登录功能 2 注册功能 3 上传音乐至音乐列表功能 4 播放音乐功能 5 删除音乐列表音乐功能 5 1删除音乐列表单个音乐功
  • ZooKeeper的一些总结

    文章目录 前言 一 Zookeeper是什么 二 Zookeeper用来做什么 三 Zookeeper的优势是什么 四 为什么用zookeeper 五 zookeeper解决了什么问题 总结 前言 Zookeeper作为一个分布式协调服务
  • Dictionary的用法

    Dictionary常用用法 以 key 的类型为 int value的类型为string 为例 1 创建及初始化 Dictionary
  • UNIX网络编程卷一 学习笔记 第二十九章 数据链路访问

    目前大多操作系统都为程序提供访问数据链路层的功能 此功能可提供以下能力 1 能监视由数据链路层接收的分组 使得tcpdump之类的程序能运行 而无需专门的硬件设备来监视分组 如果结合使用网络接口进入混杂模式 promiscuous mode
  • Ubuntu18.04安装Android Studio无法从System Settings下载各种SDK包的报错问题

    前提 1 已经安装好了jdk 打开linux终端测试jdk安装是否成功 java version 可以看到如下信息显示出来 2 安装Android SDK 以上都可以参考文章Ubuntu下安装Android Studio 直到参考文章的这一
  • 使用MySQL创建数据库的语句

    一 mysql怎么创建数据库 MySQL是一个开放源代码的关系型数据库管理系统 创建数据库的首要任务就是了解MySQL如何创建数据库 创建一个MySQL数据库只需要使用CREATE DATABASE语句即可 使用这个语句 您可以指定新数据库
  • antdmessage使用_Antd message 这种组件为什么不需要在Render中使用,只需要在方法中调用...

    一般的引用antd中的组件我们需要 import Button from antd class App extends React Component render return 如上代码所示 需要把import的组件放在我们的render
  • 如何使用大型语言模型与任何 PDF 和图像文件聊天 — 使用代码 构建可以回答有关任何文件的问题的人工智能助手的完整指南

    介绍 PDF 和图像文件中蕴藏着如此多有价值的信息 幸运的是 我们拥有强大的大脑 能够处理这些文件以查找特定信息 这实际上很棒 但是 我们中有多少人内心深处不希望有一个工具可以回答有关给定文档的任何问题 项目的一般工作流程 清楚地了解正在构
  • 小福利,使用python里面的basemap模块和folium模块制作可视化地图

    小福利 使用python里面的basemap模块和folium模块制作可视化地图 首先导入模块 import json folium requests import mimetypes import http client import p
  • spring项目中监控方法执行时间

    当项目规模越来越大时 难免会遇到性能问题 尤其是多系统之间接口调用 所以添加时间监控很有必要 但是由于代码已经上线 所以要保证对代码的侵略性最小 所以Spring AOP可以解决这个问题 首先定义监控方法 package com proje
  • Java实现定义员工类的实例

    文章目录 定义员工类的实例 题目 准备知识 标准JavaBean static关键字的使用 源代码 定义员工类的实例 题目 需求 请完成一个标准实体类的设计 并提供如下要求实现 某公司的员工信息系统中 需要定义一个公司的员工类Employe
  • 微服务初始

    今天准备开始学习微服务 使用微服务肯定是因为他有好处 首先了解到的三种架构 传统单体 集群架构 微服务架构 单体架构 有单点问题 如果宕机所有的服务都不可用 所有业务的功能模块都聚集在一起 如果代码量多 功能之前如果有很多共同的代码 不同业
  • 自写控件:滑动呈现控件(实现了两个以上控件间的切换)我写的

    namespace SyncCenter My public class SlidPanel System Windows Forms UserControl private Dictionary
  • RESTful设计方法

    REST REST 即Representational State Transfer的缩写 维基百科称其为 具象状态传输 国内大部分人理解为 表现层状态转化 RESTful是一种开发理念 维基百科说 REST是设计风格而不是标准 REST描
  • Navicat备份数据库和还原数据库详解

    Navicat备份数据库和还原数据库详解 首先我们知道Navicat备份的数据库文件为XX psc文件 当然也可以备份成XX sql文件 下面我们以常用的XX psc文件为例 来详细操作数据库的备份 其他数据库可视化工具以后再详述 废话不多
  • Nginx配置WS、WSS域名

    文章目录 一 Nginx配置WS 二 Nginx配置WSS 一 Nginx配置WS WS的全称是WebSocket Nginx配置WebSocket也比较简单 只需要在nginx conf文件中进行相应的配置 这种方式很简单 但是很有效 能
  • ssim算法计算图片_图片的相似度--图像结构相似度SSIM

    计算两张图片的相似度 图片结构相似度 SSIM SSIM的全称为structural similarity index 结构相似性 分别从亮度 对比度 结构三方面度量图像相似性 均值作为亮度的估计 标准差作为对比度的估计 协方差作为结构相似
  • 在 Dev-C++ 或 Code::Blocks 下面配置 EasyX !

    前言 EasyX 虽然挺好用 但是目前官方只发布了针对 VC 的使用方法 本文介绍如何将 EasyX 配置到 DevCpp 或 CodeBlocks 里面 并提供相关的库 平时我工作忙 有问题直接在后面留言 我会尽力修改 注 版本太老的 m
  • 华为校招机试题-查找重复代码-2023年

    题目描述 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给定两行代码 字符串长度 1 lt length lt 100 由英文字母 数字和空格组成 找出两行代
  • mvc:annotation-driven 与 mvc:default-servlet-handler的作用

    本人见解 两个标签需要配合使用 可以很好地处理SpringMVC请求静态资源或者控制器时的选择 静态资源包括图片 jsp css 但是不设置的话访问jsp可以显示 不知原因 下方转发自 https www cnblogs com cyhby