mvc:annotation-driven注解的作用

2023-10-30

一、<mvc:annotation-driven />注解意义

主要就是为了Spring MVC来用的,提供Controller请求转发,json自动转换等功能

<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。配置一些messageconverter。即解决了@Controller注解的使用前提配置<context:annotation-config/>是对包进行扫描,实现注释驱动Bean定义,同时将bean自动注入容器中使用。即解决了@Controller标识的类的bean的注入和使用。 
<mvc:annotation-driven>会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必需的,并且提供了数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能。
我们处理响应ajax请求时,就使用到了对json的支持。
对action写JUnit单元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,来完成测试,取的时候要知道是<mvc:annotation-driven />这一句注册的这两个bean。

<!--  spring 可以自动去扫描 base-package下面的包或子包下面的Java文件,如果扫描到有Spring的相关

注解的类,则把这些类注册为Spring的bean -->

<context:component-scan base-package="org.fkit.controller"/>

<!--设置配置方案 -->

  <mvc:annotation-driven/>

<!--使用默认的Servlet来响应静态文件-->

<mvc:default-servlet-handler/>

<!-- 视图解析器 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
<!-- 前缀 -->
<property name="prefix">
<value>/WEB-INF/content/</value>
</property>
<!-- 后缀 -->
<property name="suffix">
<value>.jsp</value>
</property>
</bean>

一开始我在写配置的时候,只写了<context:component-scan/>,并没有使用<mvc:annotation-driven/>,servlet拦截*.do,.do请求可以被正确捕捉和处理。

后来为了解决静态资源访问的问题,servlet改成了拦截所有请求,即/,并添加了默认的servlet,这时候*.do请求不能被控制器捕捉了,页面错误为404。直到添加了<mvc:annotation-driven/>之后,.do请求才又能被正确捕捉和处理。

<context:component-scan base-package="com"></context:component-scan>  
<mvc:annotation-driven/>  
<mvc:resources mapping="/styles/**" location="/WEB-INF/resource/styles/"/>  
<mvc:default-servlet-handler/>  

当我们需要controller返回一个map的json对象时,可以设定<mvc:annotation-driven />,

同时设定<mvc:message-converters> 标签,设定字符集和json处理类,例如:

<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

在使用SpringMVC3时,需要对response到页面的数据进行编码设置则需要自定义注解数据格式化类来对页面传过来的字符串进行格式化。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >  
        <property name="messageConverters">  
             <list>  
                 <bean class = "org.springframework.http.converter.StringHttpMessageConverter">  
                    <property name = "supportedMediaTypes">  
                         <list>  
                             <value>text/plain;charset=UTF-8</value>  
                         </list>  
                    </property>  
                 </bean>  
             </list>  
        </property>  
    </bean> 

<mvc:annotation-driven />相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean。

所以我们在上面配置的AnnotationMethodHandlerAdapter在<mvc:annotation-driven />后是不起作用的。<mvc:annotation-driven />包括了一个默认的AnnotationMethodHandlerAdapter功能。

SpringMVC 3.1.x以上版本

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  
	  <property name="formatters">  
	      <list>  
	          <bean class="com.grgbanking.it.common.formatter.TimestampFormatAnnotationFormatterFactory"/>  
	      </list>  
	  </property>  
	</bean> 
	
	<!-- 设置转换器 -->
	<mvc:annotation-driven conversion-service="conversionService">
		<mvc:message-converters>  
        	 <bean class = "org.springframework.http.converter.StringHttpMessageConverter">  
                    <property name = "supportedMediaTypes">  
                         <list>  
                             <value>text/plain;charset=UTF-8</value>  
                         </list>  
                    </property>  
                 </bean>  
        </mvc:message-converters>
	</mvc:annotation-driven>

spring mvc 3.1中annotation-driven所支持的全部配置。

<mvc:annotation-driven  message-codes-resolver ="bean ref" validator="" conversion-service="">  
     
     <mvc:return-value-handlers>  
        <bean></bean>  
    </mvc:return-value-handlers>  
      
    <mvc:argument-resolvers>  
    </mvc:argument-resolvers>  
      
    <mvc:message-converters>  
    </mvc:message-converters>[/color]  
</mvc:annotation-driven>  

其中3.1新增部分如下    
return-value-handlers 
允许注册实现了HandlerMethodReturnValueHandler接口的bean,来对handler method的特定的返回类型做处理。
HandlerMethodReturnValueHandler接口中定义了两个方法 
supportsReturnType 方法用来确定此实现类是否支持对应返回类型。 
handleReturnValue 则用来处理具体的返回类型。 
例如以下的handlerMethod 

@RequestMapping("/testReturnHandlers")  
public User testHandlerReturnMethod(){  
    User u  = new User();  
    u.setUserName("test");  
    return u;  
}  

所返回的类型为一个pojo,正常情况下spring mvc无法解析,将转由DefaultRequestToViewNameTranslator 解析出一个缺省的view name,转到 testReturnHandlers.jsp, 
我们增加以下配置 

<mvc:annotation-driven validator="validator">  
    <mvc:return-value-handlers>   
           <bean  class="net.zhepu.web.handlers.returnHandler.UserHandlers"></bean>   
    </mvc:return-value-handlers>
</mvc:annotation-driven>  
public class UserHandlers implements HandlerMethodReturnValueHandler {  
    Logger logger = LoggerFactory.getLogger(this.getClass());  
    @Override  
    public boolean supportsReturnType(MethodParameter returnType) {  
        Class<?> type = returnType.getParameterType();  
        if(User.class.equals(type))  
        {  
            return true;  
        }  
        return false;  
    }  
  
    @Override  
    public void handleReturnValue(Object returnValue,  
            MethodParameter returnType, ModelAndViewContainer mavContainer,  
            NativeWebRequest webRequest) throws Exception {  
        logger.info("handler  for return type users ");  
        mavContainer.setViewName("helloworld");  
    }  
  
}  

此时再访问 http://localhost:8080/springmvc/testReturnHandlers ,将交由 UserHandlers来处理返回类型为User的返回值。 

argument-resolvers 
允许注册实现了WebArgumentResolver接口的bean,来对handlerMethod中的用户自定义的参数或annotation进行解析 

<mvc:annotation-driven validator="validator">  
    <mvc:argument-resolvers>  
 <bean class="net.zhepu.web.handlers.argumentHandler.MyCustomerWebArgumentHandler" />  
    </mvc:argument-resolvers>  
  
</mvc:annotation-driven> 
public class MyCustomerWebArgumentHandler implements WebArgumentResolver {  
  
    @Override  
    public Object resolveArgument(MethodParameter methodParameter,  
            NativeWebRequest webRequest) throws Exception {  
        if (methodParameter.getParameterType().equals(MyArgument.class)) {  
            MyArgument argu = new MyArgument();  
            argu.setArgumentName("winzip");  
            argu.setArgumentValue("123456");  
            return argu;  
        }  
        return UNRESOLVED;  
    }  
  
}  

这里我们定义了一个 customer webArgumentHandler,当handler method中参数类型为 MyArgument时生成对参数的类型绑定操作。 
注意新注册的webArgumentHandler的优先级最低,即如果系统缺省注册的ArgumentHandler已经可以解析对应的参数类型时,就不会再调用到新注册的customer ArgumentHandler了。 

二、<context:annotation-config/> 注解

当我们需要使用BeanPostProcessor时,直接在Spring配置文件中定义这些Bean显得比较笨拙,例如:
  使用@Autowired注解,必须事先在Spring容器中声明AutowiredAnnotationBeanPostProcessor的Bean

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/>

使用 @Required注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean:

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>

类似地,使用@Resource、@PostConstruct、@PreDestroy等注解就必须声明 CommonAnnotationBeanPostProcessor;使用@PersistenceContext注解,就必须声明 PersistenceAnnotationBeanPostProcessor的Bean。
  这样的声明未免太不优雅,而Spring为我们提供了一种极为方便注册这些BeanPostProcessor的方式,即使用<context:annotation- config/>隐式地向 Spring容器注册AutowiredAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor以及PersistenceAnnotationBeanPostProcessor这4个BeanPostProcessor。如下:

<context:annotation-config/> 

另,在我们使用注解时一般都会配置扫描包路径选项:

<context:component-scan base-package="pack.pack"/>

该配置项其实也包含了自动注入上述processor的功能,因此当使用<context:component-scan/>后,即可将<context:annotation-config/>省去。

备注:
在配置文件中使用 context 命名空间之前,必须在 <beans> 元素中声明 context 命名空间。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
   http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
	<mvc:resources mapping="/favicon.ico" location="/favicon.ico,classpath:/favicon.ico" />
	<mvc:resources mapping="/public/**" location="/public/,classpath:/public/" />
	<mvc:resources mapping="/platform/**" location="/platform/" />
	
	<bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
	<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>application/json; charset=UTF-8</value>
				<value>*; charset=UTF-8</value>
			</list>
		</property>
	</bean>
	<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="org.springframework.http.converter.ResourceHttpMessageConverter" />
				<ref bean="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
			</list>
		</property>
	</bean>
	<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
		<property name="detectHandlersInAncestorContexts" value="true" />
	</bean>
	<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<property name="templateLoaderPaths">
			<list>
				<value>/WEB-INF/ftl</value>
				<value>classpath:/ftl</value>
			</list>
		</property>
		<property name="preferFileSystemAccess" value="false" />
		<property name="freemarkerSettings">
			<props>
				<prop key="defaultEncoding">UTF-8</prop>
				<prop key="url_escaping_charset">UTF-8</prop>
				<prop key="locale">zh_CN</prop>
			</props>
		</property>
	</bean>
	<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
		<property name="cache" value="true" />
		<property name="suffix" value=".ftl" />
		<property name="contentType" value="text/html; charset=UTF-8" />
		<property name="requestContextAttribute" value="rc"></property>
	</bean>
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
</beans>

Spring 3.0.x中使用了annotation-driven后,缺省使用DefaultAnnotationHandlerMapping 来注册handler method和request的mapping关系。 

AnnotationMethodHandlerAdapter来在实际调用handlermethod前对其参数进行处理。 

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

在spring mvc 3.1中,对应变更为 
DefaultAnnotationHandlerMapping -> RequestMappingHandlerMapping 
AnnotationMethodHandlerAdapter -> RequestMappingHandlerAdapter 
AnnotationMethodHandlerExceptionResolver -> ExceptionHandlerExceptionResolver 

以上都在使用了annotation-driven后自动注册。 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

mvc:annotation-driven注解的作用 的相关文章

  • 【Java】基础类型之float(八)

    特征 float 数据类型是单精度 32位 符合IEEE 754标准的浮点数 float 在储存大型浮点数组的时候可节省内存空间 默认值是 0 0f 浮点数不能用来表示精确的值 如货币 float是浮点类型中的一种 以F或f结尾标识 如果不
  • Secrets of RLHF in Large Language Models Part I: PPO

    本文是LLM系列文章 针对 Secrets of RLHF in Large Language Models Part I PPO 的翻译 大型语言模型中RLHF的秘密 上 PPO 摘要 1 引言 2 相关工作 3 人类反馈的强化学习 4
  • 高端技能之教你学会iOS抓包以及Fiddler抓包软件的用法

    软件安装包在最下面 安装fiddler 一路无脑选是 配置 Tools gt Options 第一步 勾选Https Decrypt用于将网页的密文包解为明文包 第二步 勾选Allow的意思是允许手机手动代理之后可以连接 第三步 记住端口号
  • 座舱开发的“道”与“术”

    前言 近年来 随着汽车 新四化 浪潮的兴起 软件定义已成为产业共识 将深度参与到整个汽车的定义 开发验证销售以及服务全过程 一方面确保软件可升级 跨车型 软件甚至跨车企软件重用 另一方面对于硬来讲 要做到可扩展 可更换 甚至做到传感器的即插
  • 单词接龙

    单词接龙 是指一组单词序列 任何两个相邻的单词满足前一个单词的尾字母和后一个单词的首字母相同 接龙长度 接龙中所有单词长度之和 如单词 tea cat dog aid fish 可以形成单词接龙 cat tea aid dog 其中cat为
  • [转]Project2010简易操作指南

    本文转自 http ce sysu edu cn hope Item aspx id 68176 一 启动阶段 1 前期准备 1 新建项目文件 选择 File NewNew 菜单 选择项目模版 打开项目文件 看见任务表格后设定任务自动排期

随机推荐

  • 网络地址不在同一网段能通信吗

    ip地址不一样的主机只要是在同一个网段就可以直接通信 如果在同一网段IP地址相同就冲突了 如果是不同的网段 而且不能通过掩码使其在一个大网段里 那么是不可以直接通信的 在同一网段可以直接通信是通过广播传输的 如果不通网段的话 广播包就过不去
  • Signoff Criteria --- ocv/aocv/pocv之POCV介绍

    POCV parametric on chip variation 本小节介绍pocv相关内容 1 Overview Process variation可以简单分成die to die和on chip variation ocv die t
  • 四级高频词汇360个

    英语四级高频词汇如下 1 alter v 改变 改动 变更 2 burst vi n 突然发生 爆裂 3 dispose vi 除掉 处置 解决 处理 of 4 blast n 爆炸 气流 vi 炸 炸掉 5 consume v 消耗 耗尽
  • 网络攻防WEB入门指南

    网络攻防WEB入门指南 大佬绕路 文章目录 前言 学习网络攻防该如何入门 前言 我对网络攻防的理解 分为比赛和实战两个部分 两者所学习的知识虽有共通之处 但还是有很大区别 我也在向实战的状态转换 不过二者入门所要掌握的知识差别不大 下面主要
  • 判断是否为子序列

    两个整数序列A a1 a2 a3 am和B b1 b2 b3 bn已存入两个单链表中 设计一个算法 判断 序列B是否是序列A的连续子序列 include
  • React中高阶组件应用

    高阶组件 函数传入一个组件 返回一个新的组件 1 高阶组件的运用 在不破坏原本的结构的时候 利用高阶组件进行加工 如下 如果要在Home组件以及About组件再传入region 中国 就需要两个都修改 class App extends P
  • 【面经——欢聚集团 一面】

    2021年4月8日在实习僧投的简历 4月12号中午在面试中望软件回来的路上接到YY邀面电话 直接约下午5点45分线下面试 自己从新港东地铁站过去还是挺远的 大概5点钟就到了南村万博 下地铁之后走了一段路吧还算挺方便的 差不多到45分的时候面
  • ARP协议详解:了解数据包转发与映射机制背后的原理

    数据来源 一 广播与广播域概述 1 广播与广播域 广播 将广播地址做为目标地址的数据帧 广播域 网络中能接收到同一个广播所有节点的集合 广播域越小越好 收到的垃圾广播越少 这样通信效率更高 下图每个圈都是一个广播域 说明了交换机隔离不了广播
  • 区块链学习笔记(三)——从商鞅变法谈“共识机制”

    区块链学习笔记 三 从商鞅变法谈 共识机制 前言 一 商鞅变法的故事 总结一下 二 共识机制 1 什么是共识机制 2 要点 总结 前言 区块链健康运行的灵魂是 共识机制 那么什么是 共识机制 呢 一 商鞅变法的故事 相信大家都听过这么一个故
  • OpenStack的部署(八)------cinder组件

    目录 一 在CT控制节点配置Cinder 1 创建数据库实例和角色 2 创建用户 修改配置文件 3 开启Cinder服务 4 验证 二 在计算节点c2配置Cinder 存储节点 1 准备工作 2 配置cinder模块 3 开启cinder卷
  • 背景建模--Vibe 算法优缺点分析

    一 Vibe 算法的优点 Vibe背景建模为运动目标检测研究邻域开拓了新思路 是一种新颖 快速及有效的运动目标检测算法 其优点有以下两点 1 思想简单 易于实现 Vibe通常随机选取邻域20个样本为每个像素点建立一个基于样本的背景模型 具有
  • Python工具箱系列:使用Python实现简单的文本加密和解密

    Python工具箱系列 使用Python实现简单的文本加密和解密 在计算机科学中 数据加密是一项重要的技术 用于保护敏感数据的安全性 Python作为一种强大而受欢迎的编程语言 提供了丰富的库和工具 使得实现文本加密和解密变得相对容易 本文
  • 第40节 指北针实例

    目录 本节内容 本节代码 思路 以下为全部代码 本节内容 受网友提问 本节实现一个指北针 上面左下角的指北针由两部分组成 一部分是指针 一部分是底盘 底盘动 指针在动 默认朝向Z轴负方向是北 朝向X轴正方向是东 你可以感受一下 其它的方向就
  • termux下安装centos安装python

    安装termux 链接 f droid 下载安装 授存储权限 termux setup storage 提示输入y 换源 termux change repo 获权 termux chroot 先安装依赖 pkg install pytho
  • 冯乐乐之二 shader的数学

    冯乐乐目录 第2章渲染流水线介绍 第三章 Unity shader基础 基础shaderLab语言 shader结构 属性properties 主角SubShader 备胎Fallback shader三大类型 Unity宠儿表面着色器 聪
  • Python 程序设计练习1.2

    从键盘输入三个数到a b c中 按公式值输出 在同一行依次输入三个值a b c 用空格分开 输出 b b 4 a c的值 输入格式 在一行中输入三个数 输出格式 在一行中输出公式值 输入样例 在这里给出一组输入 例如 1 7 3 输出样例
  • Linux下查找和删除7天以前的文件

    在工作做 项目里runtime目录下产生很多日志文件 需要定期去删除 记一次linux下清理过期日志的过程 环境说明 删除 var log 下7天以前的 log文件 用到的命令 find rm 命令示例 find data www runt
  • 统一观测丨借助 Prometheus 监控 ClickHouse 数据库

    引言 ClickHouse 作为用于联机分析 OLAP 的列式数据库管理系统 DBMS 最核心的特点是极致压缩率和极速查询性能 同时 ClickHouse 支持 SQL 查询 在基于大宽表的聚合分析查询场景下展现出优异的性能 因此 获得了广
  • 你离知道做到之间差的是什么?

    文章目录 知道却没有做到的原因 1 信息超载 2 消极过滤 3 缺少跟进 如何知道做到 1 少而精 2 绿灯思维 3 跟进 贯穿始终的做法 重复 重复 再重复 前言 非常感谢我的人生导师 始终告诉我当你接触高人的思想 方法指导时 不要怀疑
  • mvc:annotation-driven注解的作用