日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

@ResponseBody & @RequestBody

 老鼠愛上美貓 2012-08-09

@ResponseBody & @RequestBody

作用?

@RequestBody 將 HTTP 請求正文插入方法中,使用適合的HttpMessageConverter將請求體寫入某個對象。

 

@ResponseBody 將內(nèi)容或?qū)ο笞鳛?HTTP 響應(yīng)正文返回,使用@ResponseBody將會跳過視圖處理部分,而是調(diào)用適合HttpMessageConverter,將返回值寫入輸出流。

 

HttpMessageConverter接口

<mvc:annotation-driven  />開啟了之后它給AnnotationMethodHandlerAdapter初始化7個轉(zhuǎn)換器,可以通過調(diào)用 AnnotationMethodHandlerAdapter類的getMessageConverts()方法來獲取轉(zhuǎn)換器的一個集合 List<HttpMessageConverter>

 

默認給AnnotationMethodHandlerAdapter初始化的有(當(dāng)然我們也可以添加自定義的converter)

 

ByteArrayHttpMessageConverter

StringHttpMessageConverter

ResourceHttpMessageConverter

SourceHttpMessageConverter<T>

XmlAwareFormHttpMessageConverter

Jaxb2RootElementHttpMessageConverter

MappingJacksonHttpMessageConverter

 

Spring是如何尋找最佳的HttpMessageConverter

1 首先獲取注冊的所有HttpMessageConverter集合

 

2 然后客戶端的請求header中尋找客戶端可接收的類型,

比如  Accept application/json,application/xml等,組成一個集合

 

3 所有的HttpMessageConverter 都有canRead和canWrite方法 返回值都是boolean,看這個HttpMessageConverter是否支持當(dāng)前請求的讀與寫,讀對應(yīng)@RequestBody注解, 寫對應(yīng)@ResponseBody注解

 

4 遍歷HttpMessageConverter集合與前面獲取可接受類型進行匹配,如果匹配直接使用當(dāng)前第一個匹配的HttpMessageConverter,然后return(一般是通過Accept和返回值對象的類型進行匹配)

 

例如

StringHttpMessageConverter           

支持String , Accept所有類型

 

MappingJacksonHttpMessageConverter  

支持Map List 實體對象等等  ,Accept:application/json

 

 

示例:

目標(biāo):

使用ResponseBody根據(jù)head的Accept不同對同一地址請求分別來呈現(xiàn)一個實體的json與xml結(jié)果

 

由于<context:annotation-config />

默認會初始化AnnotationMethodHanlderAdapter,但我們返回xml內(nèi)容需要對這個HandlerAdapter進行一定的修改,所以配置文件如下:

 

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

   

<context:annotation-config />

   

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

        <property name="messageConverters">

            <list>

                <ref bean="stringHttpMessageConverter" />

                <ref bean="jsonHttpMessageConverter" />

                <ref bean="marshallingHttpMessageConverter" />

            </list>

        </property>

    </bean>

 

<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter" /> 

 

<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />

 

<bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">

        <constructor-arg ref="jaxbMarshaller" />

        <property name="supportedMediaTypes" value="application/xml"></property>

</bean>

   

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">

        <property name="classesToBeBound">

            <list>

                <value>com.model.User</value>

            </list>

        </property>

</bean>

 

注:要使用Jaxb2Marshaller我們在對應(yīng)的實體,比如User類上需要標(biāo)明

 

@XmlRootElement 注解,需要引入

 

import javax.xml.bind.annotation.XmlRootElement;

這個包。

 

 

Controller中應(yīng)對請求的方法

 

@RequestMapping(value="/user/{userid}", method=RequestMethod.GET)

public @ResponseBody User queryUser(@PathVariable("userid") long userID) {

       Calendar d = Calendar.getInstance();

       d.set(1987, 12, 9);

       User u = new User();

       u.setUserID(userID);

       u.setUserName("zhaoyang");

       u.setBirth(d.getTime());

       return u;

}

 

接著我們使用curl這個工具進行測試

如下圖:

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多