1、Spring3.1开始使用新的HandlerMapping 和 HandlerAdapter 来支持@Contoller 和@RequestMapping注解处理:处理器映射RequestMappingHandlerMapping和处理器适配器RequestMappingHandlerAdapter组合来代替Spring2.5 开始的处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter。
HandlerMapping:请求到处理器的映射,如果映射成功返回一个HandlerExecutionChain 对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象;
HandlerAdapter:HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器。
2、@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换。
@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。配合@ResponseBody注解,以及HTTP Request Header中的Accept属性,Controller返回的Java对象可以自动被转换成对应的XML或者JSON数据。这个过程是通过HttpMessageConverter即消息转换器机制实现的。实现对象转xml的类为Jaxb2RootElementHttpMessageConverter,转换成功的条件:
a) 返回对象的类具有XmlRootElement注解。
b) 请求头中的Accept属性包含application/xml。
对象转换成json数据时需要把Jackson2或者GSON加入工程的class path,Spring就会自动把GsonHttpMessageConverter加进来,这样Spring就会选择MappingJackson2HttpMessageConverter或者GsonHttpMessageConverter来进行数据转换。
@RequestBody
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。配合@RequestBody注解,以及HTTP Request Header中的Content-Type属性,HTTP Request Body中包含的XML或者JSON数据可以自动被转换成对应的Java对象。如:
3、关于mvc:annotation-driven
application/json;charset=UTF-8
text/html;charset=UTF-8
text/plain;charset=UTF-8
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping 和org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 和 ExceptionHandlerExceptionResolver
<1>、return-value-handlers
允许注册实现了HandlerMethodReturnValueHandler接口的bean,来对handler method的特定的返回类型做处理
HandlerMethodReturnValueHandler接口中定义了两个方法, supportsReturnType 方法用来确定此实现类是否支持对应返回类型。 handleReturnValue 则用来处理具体的返回类型
<2>、argument-resolvers
允许注册实现了HandlerMethodArgumentResolver接口的bean,来对handlerMethod中的用户自定义的参数或annotation进行解析 。spring调用该接口实现Controller的参数装配。HandlerMethodArgumentResolver实现类中会调用DataBinder,Converter等。常用的该接口实现类有:ServletModelAttributeMethodProcessor:实体类的组装用它实现。RequestParamMethodArgumentResolver:基本数据类型如String用它实现。
实例:自定义一个@ListAttribute注解并使用它在controller上来解析并封装参数
实现了HandlerMethodArgumentResolver接口的参数解析器:
<3>、mvc:annotation-driven中的HttpMessageConverter(消息转换器机制)详解
HttpMessageConverter主要是用来转换request的内容到一定的格式,转换输出的内容的到response。即:controller方法返回的类型,可以是字节数组、字符串、对象引用等,经过HttpMessageConverter处理后,将这些返回类型以一定内容格式(即response的content-type类型,同时还要考虑到客户端是否接受这个类型)存进response的body中返回给客户端。
mvc:message-converters register-defaults="true">有一个register-defaults属性,当为true时,仍然注册默认的HttpMessageConverter,当为false则不注册,仅仅使用用户自定义的HttpMessageConverter。
默认的HttpMessageConverter有:
ByteArrayHttpMessageConverter:支持返回值类型为byte[],content-type为application/octet-stream,*/*
StringHttpMessageConverter:支持的返回值类型为String,
ResourceHttpMessageConverter:支持的返回值类型为Resource,content-type为 */*
SourceHttpMessageConverter:支持的返回值类型为DomSource,SAXSource,Source,StreamSource,content-type为application/xml,text/xml,application/*+xml
MappingJacksonHttpMessageConverter:判断返回值能否被格式化成json,content-type为 application/json,application/*+json
AllEncompassingFormHttpMessageConverter:支持的返回值类型为MultiValueMap,content-type为application/x-www-form-urlencoded,multipart/form-data
HttpMessageConverter主要针对那些不会返回view视图的response。其中StringHttpMessageConverter有两个构造函数。当你没有给它指定字符集时,使用默认的ISO-8859-1,这便是造成乱码的一个原因,由于我们经常使用utf-8,所以可以在构造它时指定一下字符集。