mvc:annotation-driven 注解的作用

1.自动注册映射处理器和适配器

这是该注解的主要功能,添加< mvc:annotation-driven/>注解后,容器中会<自动注册HandlerMapping与HandlerAdapter 两个bean。省去手动注册HandlerMapping和HandlerAdapter的步骤。

当配置了< mvc:annotation-driven/>后,Spring就知道了我们启用注解驱动。然后Spring通过< context:component-scan/>标签的配置,会自动为我们将扫描到的@Component,@Controller,@Service,@Repository等注解标记的组件注册到工厂中,来处理我们的请求。

HandlerMapping的实现类的作用:将请求映射到带@RequestMapping注释的控制器方法,将URL路径映射到控制器bean名称。
HandlerAdapter的实现类的作用:实现类RequestMappingHandlerAdapter,处理请求的适配器,确定调用哪个类的哪个方法,并且构造方法参数,返回值。

在spring mvc 3.1以上,DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter对应变更为:
DefaultAnnotationHandlerMapping -> RequestMappingHandlerMapping
AnnotationMethodHandlerAdapter -> RequestMappingHandlerAdapter
AnnotationMethodHandlerExceptionResolver -> ExceptionHandlerExceptionResolver

2.映射异常处理

处理@ExceptionHandler标注的异常处理函数:在dispatcherServlet中,当用户未注册自定义的ExceptionResolver时,自动注册AnnotationMethodHandlerExceptionResolver来对使用@ExceptionHandler标注的异常处理函数进行解析处理(这也导致当用户注册了自定义的exeptionResolver时将可能导致无法处理@ExceptionHandler)。

3.数据校验

官方文档解释:“默认情况下,当在类路径中检测到诸如Hibernate Validator之类的Bean验证提供程序时,使用@EnableWebMvc或<mvc:annotation-driven>会通过LocalValidatorFactoryBean在Spring MVC中自动注册Bean验证支持。”

要实现Hibernate Validator/JSR303 校验(或者其他各种校验),必须实现SpringMVC提供的一个接口:ValidatorFactory。LocalValidatorFactoryBean是ValidatorFactory的一个实现类。<mvc:annotation-driven ></mvc:annotation-driven>会在springmvc容器中自动加载一个LocalValidatorFactoryBean类,因此可以直接实现数据校验。

就日常使用来说,比如支持@Valid等一系列校验注解。

4.数据类型转换和数据格式化

< mvc:annotation-driven/>支持ConversionService,可以进行常见数据类型的转换和格式化。

ConversionService:定义了一个统一的API,用于在运行时执行类型转换逻辑。大多数ConversionService实现还实现ConverterRegistry,该注册器提供用于注册转换器的SPI。在内部,ConversionService实现委派其注册的转换器执行类型转换逻辑。
ConversionService会在应用程序启动时实例化,然后在多个线程之间共享。
在Spring应用程序中,通常会为每个Spring容器(或ApplicationContext)配置一个ConversionService实例。

FormattingConversionServiceFactoryBean:一个工厂,提供对FormattingConversionService的便捷访问,该服务配置有用于常见类型(例如数字和日期时间)的转换器和格式化程序。

①默认:
添加 < mvc:annotation-driven/>后,会默认创建一个ConversionService,即 FormattingConversionServiceFactoryBean。
使用FormattingConversionServiceFactoryBean可以让SpringMVC支持@NumberFormat和@DateTimeFormat等Spring内部自定义的转换器。

②:自定义:
默认的ConversionService可以在字符串,数字,枚举,集合,映射和其他常见类型之间进行转换。
如果要实现其他的类型转换,比如将字符串 “LiHua”-23-“男” 转换为Student实体类,可以自定义类型转换器。
要支持自己自定义的格式器和转换器(实现Converter,ConverterFactory或GenericConverter接口),只需自定义相应的类并加入IOC容器,然后通过设置converters属性将自定义的转换器注册到ConversionService即可。

XML配置文件:

   <mvc:annotation-driven conversion-service="conversionService"/><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><ref bean="employeeConverter"/></set></property></bean>

5.支持使用@RequestBody、@ResponseBody

这个没什么好说的了。

6.支持静态资源文件加载和请求映射同时使用

在配置完静态资源访问后,如果没有配置< mvc:annotation-driven/>,springmvc将只能访问静态资源,而无法进行请求映射。
因此,有静态资源文件需要加载的时候,一定要配置< mvc:annotation-driven/>。

< mvc:annotation-driven/>允许将DispatcherServlet映射到“ /”(从而覆盖了容器默认Servlet的映射),同时仍允许容器默认Servlet处理静态资源请求。 它使用URL映射“ / **”配置DefaultServletHttpRequestHandler,并且相对于其他URL映射具有最低优先级。

关于静态资源访问的配置:
在springmvc中,直接访问静态资源会404,因为之前配置的拦截器会将所有的请求通过/拦截,交给mvc的入口DispatcherServlet去匹配@RequestMapping/path,访问不到就报错了。

解决:如果是需要mvc处理的,则交给@RequestMapping;如果不需要mvc处理,则使用服务器(Tomcat)默认的servlet处理:对应的请求交给servlet处理,没有对应的servlet则直接访问。默认的servlet在Tomcat配置文件\conf/web.xml中。

加载静态资源的三种方案:
①使用< mvc:default-servlet-handler/>。
②配置/XX /**将静态资源文件映射到 ResourceHttpRequestHandler 进行处理。

 <mvc:resources mapping="/js/**" location="/js/"></mvc:resources><mvc:resources mapping="/css/**" location="/css/"></mvc:resources>1

③激活Tomcat的defaultServlet来处理静态文件。

<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.css</url-pattern>
</servlet-mapping>1234567891011

注意:如果不使用< mvc:resources/>注册HandlerMapping,而要设置自己的自定义HandlerMapping实例,请确保将其order属性设置为小于DefaultServletHttpRequestHandler的Integer.MAX_VALUE的值。
因为spring 会先执行 order 值比较小的,默认的应该servlet在最后执行,以便于处理不可能进行请求映射的静态资源访问。
补充理解:
DefaultAnnotationHandlerMapping 的 order 属性值是:0。
<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping 的 order 属性值是: 2147483646。
< mvc:default-servlet-handler/>自动注册的 SimpleUrlHandlerMapping 的 order 属性值是:2147483647。
因此映射的顺序是:注解映射——<mvc:resources/ >映射的静态资源——< mvc:default-servlet-handler/> 兜底。

7.其他功能

启用矩阵变量:在MVC命名空间中,<mvc:annotation-driven>元素具有应设置为true的enable-matrix-variables属性。 默认情况下,它设置为false。

配置异步请求处理:MVC Java配置和MVC名称空间提供用于配置异步请求处理的选项。 WebMvcConfigurer具有方法configureAsyncSupport,而<mvc:annotation-driven>具有子元素。

创建ContentNegotiationManager:在MVC命名空间中,<mvc:annotation-driven>元素具有content-negotiation-manager属性,该属性期望可以使用ContentNegotiationManagerFactoryBean创建ContentNegotiationManager。

数据绑定支持。

…(我应该没说全,还有别的功能,用到的时候再说吧)

8.< mvc:annotation-driven /> 和< context:annotation-config/>的关系:

< mvc:annotation-driven />:虽然有这么多功能,但主要还是为了Spring MVC来用的,提供Controller请求转发,json自动转换等功能。

< context:annotation-config/>:向 Spring 容器注册 4 个BeanPostProcessor。注册这4个 BeanPostProcessor的作用,就是为了系统能够识别相应的注解。常见的如:@ Resource 、@Required、@Autowired等。
不过,其实包扫描配置<context:component-scan base-package=”XX.XX”/> 也提供上述功能,因此当启动用了包扫描就不必再配置< context:annotation-config/>了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux主机熵值过小,tomcat在linux启动应用慢解决方式

问题&#xff1a;o.a.c.util.SessionIdGeneratorBase - Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [2,741] milliseconds原因&#xff1a;拿Tomcat /dev/random做关键词&#xff0c;一堆详细说明。建议看wiki。https://www.cnblogs.…

@Autowired注解能用在static属性吗?autowired注入static属性上为null

Autowired注解能用在static属性吗&#xff1f; 答案是否定的&#xff0c;我们来测试下&#xff1a; 日志信息已经很明确了&#xff0c;表示static不能被Autowired进行复制。为什么呢&#xff1f;我们现在就来一起了解其原因。 首先将我们的测试环境搭建好&#xff0c; Use…

linux下用c语言写黄金矿工,C语言写的黄金矿工O(∩_∩)O---初稿,能玩了

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼int main(void){initgr();go();getch();closegr();return 0;}void youxiye() /* 游戏页 */{setfillstyle(SOLID_FILL,15);bar(0,0,639,49);setfillstyle(SOLID_FILL,6);bar(0,49,639,349);setcolor(BLUE);line(0,49,638,49);setc…

Swagger介绍及使用

导语&#xff1a; 相信无论是前端还是后端开发&#xff0c;都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力&#xff0c;经常来不及更新。其实无论是前端调用后端&#xff0c;还是后端调用后端&…

linux 安装libcurl4-gnutls-dev,curl / curl.h,libcurl,libcurl4-openssl-dev,libcurl4-nss-dev库之间的区别?...

我有以下curl标题,我仍然可以安装上面提到的libcurl4包 –kafkaMetamorphosis:~$ll /usr/include/curl/total 200drwxr-xr-x 2 root root 4096 Jan 16 13:29 ./drwxr-xr-x 51 root root 20480 Jan 16 13:29 ../-rw-r--r-- 1 root root 7303 Dec 18 01:11 curlbuild.h-rw-r--r--…

c语言输入四个成绩求最高分最低分,数组实现学生成绩录入、求最高分、最低分、平均分和排序...

/*使用数组实现10名学生的成绩录入&#xff0c;并输出这10名学生中成绩的最高分最低分平均分按照分数从大到小排序思考&#xff1a;如何实现从小到大排序&#xff1f;如果学院有5个班&#xff0c;每个班30人&#xff0c;如何处理&#xff1f;求所有成绩中的最高分是哪个班的&am…

c语言课设宿舍管理程序,C语言程序课程设计宿舍管理软件.doc

C语言程序课程设计宿舍管理软件.doc课程设计(论文)题 目 名 称 宿舍管理软件课 程 名 称 C语言程序课程设计学 生 姓 名学 号系 、专 业 信息工程系、信息大类指 导 教 师 黄 同 成目 录1 前言2 需求分析62.1要求62.2任务2.3运行环境2.4开发工具3 概要设计与详细设计73.1设计原…

接口文档生成工具Swagger2的使用

一、什么是Swagger Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法&#xff0c;参数和模型紧密集成到服务器端的代码&#xff0c;允许API来始终保…

Netty详解

一&#xff0e;Netty介绍 1.什么是netty Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架&#xff0c;用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架&#xff0c;Netty 在互联网领域、大数据分布式计算…

有没有检查c语言编译错误的软件,求大佬解答,为什么这个程序编译软件检查不出错误...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include /* malloc()等 */#include#include#include /* exit() */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status; /* Status是函数的类型,其值是函数结果状态代码&…

语法分析器c语言实验报告,词法分析实验报告(C++)..doc

词法分析实验报告(C).词法分析实验报告一、实验目的1. 掌握词法分析的原理。2. 熟悉保留字表等相关的数据结构与单词的分类方法。3. 掌握词法分析器的设计与调试。二、实验内容根据编译中的分词原理,用C语言编写一个C语言的词法分析程序:.三、实验要求1. 输入:任意一个C语言程序…

详解 Java NIO

详解 Java NIO 文件的抽象化表示&#xff0c;字节流以及字符流的文件操作等属于传统 IO 的相关内容&#xff0c;我们已经在前面的文章进行了较为深刻的学习了。 但是传统的 IO 流还是有很多缺陷的&#xff0c;尤其它的阻塞性加上磁盘读写本来就慢&#xff0c;会导致 CPU 使用…

转专业计算机c语言,转专业申请美国计算机专业研究生必须要做的准备

先修课——转专业申计算机时&#xff0c;补先修课是使自己match的重要的一步。1.纽约大学的计算机硕士项目(计算机系的M.S. in Computer Science和M.S. in Information Systems项目)对申请人的先修课要求&#xff1a;The minimum prerequisite background for admission to the…

使用between and查找时间范围时的日期边界问题

最近在一个项目的后台数据库查找中&#xff0c;需要根据表中的时间字段查找某一范围内的数据&#xff08;7天、15天、30天&#xff09;&#xff0c;这时我想用between and&#xff08;其实使用DateDiff函数就可以完成&#xff0c;详情请看另一片文章&#xff1a;SQL查询今天、昨…

c语言画爱心附带解释,用C语言画一个“爱心”

/*每个main函数代表一种形状*/#includeusing namespacestd;#include#include/*int main(void){for(float y 1.5f;y > -1.5f;y - 0.06f){for(float x -1.5f;x < 1.5f;x 0.03f){float a x * x y * y - 1;putchar(a * a * a - x * x * y * y * y < 0.0f?^: );}putc…

SQL查询今天、昨天、7天内、30天

今天的所有数据&#xff1a;select * from 表名 where DateDiff(dd,datetime类型字段,getdate())0 昨天的所有数据&#xff1a;select * from 表名 where DateDiff(dd,datetime类型字段,getdate())1 7天内的所有数据&#xff1a;select * from 表名 where DateDiff(dd,dateti…

C语言入门I love China,C语言从入门到精通

如何学习C语言 Ⅰ第1篇 基础知识开启C语言编程世界之门。第1章 步入C的世界——Hello C 2视频教学录像&#xff1a;1小时34分钟你可能已经听说或知道一点C语言&#xff0c;也可能没有任何基础&#xff0c;没关系&#xff0c;本章就带领你进入C语言的编程世界。1.1 了解C语…

电气工程及其自动化学不学c语言,电气工程及其自动化学什么 就业方向有哪些...

电气工程及其自动化学什么 就业方向有哪些2019-05-05 11:16:29文/刘美娟电气工程及其自动化专业是电气信息领域的一门新兴学科&#xff0c;触角伸向各行各业&#xff0c;小到一个开关的设计&#xff0c;大到宇航飞机的研究&#xff0c;都有它的身影。由于和人们的日常生活以及工…

Tomcat(一):简介

一、概念 Tomcat 服务器是一个开源的轻量级Web应用服务器&#xff0c;在中小型系统和并发量小的场合下被普遍使用&#xff0c;是开发和调试Servlet、JSP 程序的首选。 二、原理 Tomcat结构图&#xff1a; ​ Tomcat主要组件&#xff1a;服务器Server&#xff0c;服务Serv…

Tomcat(二):server.xml配置

一、server.xml详解 Tomcat各组件关系图 ​ 1、Server ​ server.xml的最外层元素。 常用属性&#xff1a; ​ port&#xff1a;Tomcat监听shutdown命令的端口。 ​ shutdown&#xff1a;通过指定的端口&#xff08;port&#xff09;关闭Tomcat所需的字符串。修改shutd…