`
yjflfliulei
  • 浏览: 78454 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

spring MVC 3.1 <mvc:annotation-driven>快速配置

阅读更多

<mvc:annotation-driven>

在spring mvc 3.1增加了此标签的一些新的内置标签,个人能力有限,下面对这个标签进行简要的说明:

以下为可选配置:

 

 

<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" conversion-service="" validator="" message-codes-resolver="">
		<mvc:argument-resolvers>
			<bean class="com.lay.user.util.CustomerArgumentResolver"/>
		</mvc:argument-resolvers>
		<mvc:message-converters>
			<bean class=""/>
		</mvc:message-converters>
		<mvc:return-value-handlers>
			<bean class=""/>
		</mvc:return-value-handlers>
</mvc:annotation-driven>

那么mvc:annotation-driven做了哪些事呢?

参考官方文档:

16.14.1 Enabling MVC Java Config or the MVC XML Namespace

 

 1.先说mvc:annotation-driven属性

 

  • ignoreDefaultModelOnRedirect:请求重定向时的参数(重定向是忽略model参数)
  • conversion-service:数据绑定时类型转换,如果不设置则默认注册FormattingConversionService,支持joda time,篇幅有限,就不介绍joda time了,有空再说。
  • validator:参数验证,可选,如不设置并且加入jsr303.jar的话则会使用jsr303,jsr303的实现框架有hibernate-validator.jar,具体可能以后会详细介绍。
  • message-codes-resolver:数据绑定和验证信息解析,可选,不设置默认注册DefaultMessageCodesResolver

基本默认的就够用了,更高级用法可以自己指定。

2.mvc:annotation-driven内置标签

 

  •  <mvc:argument-resolvers>:参数解析器,可通过实现HandlerMethodArgumentResolver接口实现,该实现不会覆盖原有spring mvc内置解析对参数的解析,要自定义的内置支持参数解析可以考虑注册RequestMappingHandlerAdapter,以下为参考:
public class CustomerArgumentResolver implements HandlerMethodArgumentResolver {

	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, 
			NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
		return null;
	}

	public boolean supportsParameter(MethodParameter parameter) {
		System.out.println(parameter.getParameterName() + " : " + parameter.getParameterName() 
				+ " \nParameterType: " + parameter.getParameterType() + " \nMethod: " + parameter.getMethod().getName());
		return false;
	}

}

 代码说明: supportsParameter方法主要判别参数是否为该解析器所支持的,支持:true ,不支持:false 

               如果返回true的话则调用resolveArgument方法。

 

 那么我们自定义的参数解析会在哪里调用呢?往下看:

 

我们查看HandlerMethodArgumentResolver的实现类:

没法插入图片。。。。。蛋疼

看代码:

 

/**
 * Resolves method parameters by delegating to a list of registered {@link HandlerMethodArgumentResolver}s.
 * Previously resolved method parameters are cached for faster lookups.
 *
 * @author Rossen Stoyanchev
 * @since 3.1
 */
public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {
       /**
	 * Find a registered {@link HandlerMethodArgumentResolver} that supports the given method parameter.
	 */
	private HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
		HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);
		if (result == null) {
			for (HandlerMethodArgumentResolver methodArgumentResolver : argumentResolvers) {
				if (logger.isTraceEnabled()) {
					logger.trace("Testing if argument resolver [" + methodArgumentResolver + "] supports [" +
							parameter.getGenericParameterType() + "]");
				}
				if (methodArgumentResolver.supportsParameter(parameter)) {
					result = methodArgumentResolver;
					this.argumentResolverCache.put(parameter, result);
					break;
				}
			}
		}
		return result;
	}
}

 

 解析参数的时候会自动找到HandlerMethodArgumentResolverComposite 这个 HandlerMethodArgumentResolver实现类,然后调用他的supportsParameter方法,supportsParameter方法会去判断是否支持该参数的解析,而我们自定义的参数解析器也被注入到for 循环中的argumentResolvers参数中了,不会上传图片,没法截图给大家看了,这里简单说下:

        argumentResolvers是一个参数解析器集合,我们自定义的解析器会出现在这里,spring mvc默认把RequestParamMethodArgumentResolver 和 ServletModelAttributeMethodProcessor重复注册到最后,

 spring mvc会一次找到supportsParameter方法返回true的解析器,并调用该方法的resolveArgument方法进行解析。

 

具体大家自己动手实现一下吧,不过多啰嗦了~!

 

  • mvc:return-value-handlers:对返回值的处理。自定义实现类需要实现HandlerMethodReturnValueHandler,这个和上面提到的mvc:argument-resolvers自定义实现类的使用上几乎没差别。同样的,如果想改变内置返回值处理的话请直接注入RequestMappingHandlerAdapter,不累赘了,具体可以查看HandlerMethodReturnValueHandlerComposite源码。
  • mvc:message-converters:主要是对 @RequestBody 参数和 @ResponseBody返回值的处理,可选的,在这里注册的HttpMessageConverter默认情况下优先级是高于内置的转换器的,那么怎么自定义转换器呢?

 通过实现HttpMessageConverter<T>接口便可以了,当然,你也可以继承AbstractHttpMessageConverter<T>,这样做会更轻松,具体做法参考源码

 

public interface HttpMessageConverter<T> {

      // Indicate whether the given class and media type can be read by this converter.
      boolean canRead(Class<?> clazz, MediaType mediaType);

      // Indicate whether the given class and media type can be written by this converter.
      boolean canWrite(Class<?> clazz, MediaType mediaType);

      // Return the list of MediaType objects supported by this converter.
      List<MediaType> getSupportedMediaTypes();

      // Read an object of the given type from the given input message, and returns it.
      T read(Class<T> clazz, HttpInputMessage inputMessage) throws IOException,
                                                                   HttpMessageNotReadableException;

      // Write an given object to the given output message.
      void write(T t, HttpOutputMessage outputMessage) throws IOException,
                                                              HttpMessageNotWritableException;

    }
 

 

文章的开头提到mvc:annotation-driven做了哪些事,其实使用mvc:annotation-driven默认情况下就注册了很多转换器了:

 

 

 

  • StringHttpMessageConverter
  • FormHttpMessageConverter
  • ByteArrayHttpMessageConverter
  • MarshallingHttpMessageConverter
  • MappingJacksonHttpMessageConverter
  • SourceHttpMessageConverter
  • BufferedImageHttpMessageConverter

由此可以明白我前面的一片关于输出json格式的文章中提及的采用mvc:annotation-driven时只需加入jar包即可完成输出json的原因了,xml又何尝不能通过MarshallingHttpMessageConverter来解决呢?

 

最后,开发中可以使用mvc:annotation-driven 快速配置,在不注入自己的解析器的情况下基本默认注入的转换器差不多够用了,至于其他的

  • RequestMappingHandlerMapping

  • RequestMappingHandlerAdapter

    可配置的属性以后在讨论。

分享到:
评论
1 楼 nba 2013-08-16  
不错, 谢谢

相关推荐

    拦截器与冲突解决

    NULL 博文链接:https://xj84.iteye.com/blog/2065681

    SpringMVC源码总结(三)mvc:annotation-driven和mvc:message-converters简单介绍

    NULL 博文链接:https://lgbolgger.iteye.com/blog/2105151

    (代码)SpringMVC第12讲:<mvc:annotation-driven/>

    SpringMVC第12讲:&lt;mvc:annotation-driven/&gt;

    SpringMVC源码总结(二)mvc:mvc:annotation-driven背后的那些事

    NULL 博文链接:https://yihuawuye1.iteye.com/blog/2105063

    spring的annotation-driven配置事务管理器详解 (多数据源配置

    spring的annotation-driven配置事务管理器详解 (多数据源配置

    struts2.3+hibernate3.6+spring3.1整合的纯xml配置的小项目

    &lt;tx:annotation-driven transaction-manager="txManager" /&gt; &lt;!-- &lt;aop:config&gt; &lt;aop:pointcut id="defaultServiceOperation" expression="execution(* x.y.service.*Service.*(..))" /&gt; &lt;aop:pointcut id=...

    license.txt

    &lt;mvc:annotation-driven&gt; &lt;/mvc:annotation-driven&gt; 中配置Json格式乱码。代码如下: &lt;!--json格式乱码处理--&gt; &lt;mvc:message-converters register-defaults="true"&gt; &lt;bean class="org.springframework....

    SpringMVC+Hibernate实例

    &lt;mvc:annotation-driven/&gt; &lt;!--视图解析--&gt; &lt;bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="viewClass" value="org.springframework....

    SpringMVC+Hibernate全注解整合

    &lt;mvc:annotation-driven/&gt; &lt;!-- 扫描包 --&gt; &lt;context:annotation-config/&gt; &lt;context:component-scan base-package="com.org.*" /&gt; &lt;bean id="jspViewResolver" class="org.springframework.web.servlet.view...

    springweb3.0MVC注解(附实例)

    &lt;display-name&gt;Spring Annotation MVC Sample&lt;/display-name&gt; &lt;!-- Spring 服务层的配置文件 --&gt; &lt;context-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;classpath:applicationContext...

    jakarta.annotation-api-1.3.5-API文档-中文版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    SSH整合&&SSH集成开发

    &lt;tx:annotation-driven transaction-manager="transactionManager" /&gt; &lt;!-- 保证POJO中标注@Required的属性被注入 --&gt; &lt;bean class="org.springframework.beans.factory.annotation....

    springMVC技术概述

    springMVC相关技术配置使用注解的HandlerMapping和HandlerAdapter使用&lt;mvc:annotation-driver&gt; 不过springBoot已经省略了这些配置 配置使用注解的Handler和Service等等使用&lt;context:component-scan&gt; 不过springBoot...

    springboot 基础简易实例, maven项目

    &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt; &lt;version&gt;2.1.4.RELEASE&lt;/version&gt; &lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt; &lt;/parent&gt; &lt;groupId&gt;com.example&lt;/groupId&gt; &lt;artifactId&gt;...

    Spring MVC 教程 快速入门 深入分析

    Spring MVC 教程 快速入门 深入分析 目录 一、前言 二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 ...十九、 &lt;mvc:annotation-driven /&gt; 到底做了什么工作

    spring applicationContext 配置文件

    &lt;bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" p:order="0"&gt; &lt;property name="interceptors"&gt; &lt;list&gt; &lt;ref bean="doubleSubmitInterceptor"/&gt; &lt;/list&gt; ...

    基于MyEclipse搭建maven+springmvc整合图文教程(含源码0

    &lt;mvc:annotation-driven /&gt; &lt;context:component-scan base-package="Controller" /&gt; &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; &lt;property name="prefix" value="/...

    spring3.2+strut2+hibernate4

    &lt;tx:annotation-driven transaction-manager="transactionManager" /&gt; &lt;!-- 保证POJO中标注@Required的属性被注入 --&gt; &lt;bean class="org.springframework.beans.factory.annotation....

    javax.annotation-api-1.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.2.jar; 赠送原API文档:javax.annotation-api-1.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-1.2.pom;...

    Spring MVC入门教程

    个人认为相当适合入门和知识巩固!! 一、前言 二、spring mvc 核心类与接口 ...十九、 &lt;mvc:annotation-driven /&gt; 到底做了什么工作 二十、 本文中springMVC.xml配置文件是核心,这里给一个下载地址

Global site tag (gtag.js) - Google Analytics