@RequestBody和@ResponseBody和消息转换器机制原理

1Spring3.1开始使用新的HandlerMapping HandlerAdapter 来支持@Contoller @RequestMapping注解处理:处理器映射RequestMappingHandlerMapping和处理器适配器RequestMappingHandlerAdapter组合来代替Spring2.5 开始的处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter

HandlerMapping:请求到处理器的映射,如果映射成功返回一个HandlerExecutionChain 对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象;
HandlerAdapterHandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器。

 

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 pathSpring就会自动把GsonHttpMessageConverter加进来这样Spring就会选择MappingJackson2HttpMessageConverter或者GsonHttpMessageConverter来进行数据转换。

 

@RequestBody

该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上配合@RequestBody注解,以及HTTP Request Header中的Content-Type属性,HTTP Request Body中包含的XML或者JSON数据可以自动被转换成对应的Java对象。如:

@RequestBody和@ResponseBody和消息转换器机制原理_第1张图片

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实现类中会调用DataBinderConverter等。常用的该接口实现类有:ServletModelAttributeMethodProcessor:实体类的组装用它实现RequestParamMethodArgumentResolver:基本数据类型如String用它实现。

实例:自定义一个@ListAttribute注解并使用它在controller上来解析并封装参数

@RequestBody和@ResponseBody和消息转换器机制原理_第2张图片

实现了HandlerMethodArgumentResolver接口的参数解析器:

@RequestBody和@ResponseBody和消息转换器机制原理_第3张图片

@RequestBody和@ResponseBody和消息转换器机制原理_第4张图片


<3>mvc:annotation-driven中的HttpMessageConverter消息转换器机制详解

HttpMessageConverter主要是用来转换request的内容到一定的格式,转换输出的内容的到response即:controller方法返回的类型,可以是字节数组、字符串、对象引用等,经过HttpMessageConverter处理后,将这些返回类型以一定内容格式(即responsecontent-type类型,同时还要考虑到客户端是否接受这个类型)存进responsebody中返回给客户端

mvc:message-converters register-defaults="true">有一个register-defaults属性,当为true时,仍然注册默认的HttpMessageConverter,当为false则不注册,仅仅使用用户自定义的HttpMessageConverter 

默认的HttpMessageConverter有:

ByteArrayHttpMessageConverter:支持返回值类型为byte[]content-typeapplication/octet-stream,*/* 

StringHttpMessageConverter:支持的返回值类型为String,
ResourceHttpMessageConverter:支持的返回值类型为Resourcecontent-type*/* 

SourceHttpMessageConverter:支持的返回值类型为DomSource,SAXSource,Source,StreamSourcecontent-typeapplication/xml,text/xml,application/*+xml 

MappingJacksonHttpMessageConverter:判断返回值能否被格式化成jsoncontent-typeapplication/json,application/*+json 

AllEncompassingFormHttpMessageConverter:支持的返回值类型为MultiValueMapcontent-typeapplication/x-www-form-urlencoded,multipart/form-data 

 

HttpMessageConverter主要针对那些不会返回view视图的response。其中StringHttpMessageConverter有两个构造函数。当你没有给它指定字符集时,使用默认的ISO-8859-1,这便是造成乱码的一个原因,由于我们经常使用utf-8,所以可以在构造它时指定一下字符集。




你可能感兴趣的:(Spring,MVC)