2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

@ResponseBody & @RequestBody

 老鼠愛(ài)上美貓 2012-08-09

@ResponseBody & @RequestBody

作用?

@RequestBody 將 HTTP 請(qǐng)求正文插入方法中,使用適合的HttpMessageConverter將請(qǐng)求體寫入某個(gè)對(duì)象。

 

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

 

HttpMessageConverter接口

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

 

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

 

ByteArrayHttpMessageConverter

StringHttpMessageConverter

ResourceHttpMessageConverter

SourceHttpMessageConverter<T>

XmlAwareFormHttpMessageConverter

Jaxb2RootElementHttpMessageConverter

MappingJacksonHttpMessageConverter

 

Spring是如何尋找最佳的HttpMessageConverter

1 首先獲取注冊(cè)的所有HttpMessageConverter集合

 

2 然后客戶端的請(qǐng)求header中尋找客戶端可接收的類型,

比如  Accept application/json,application/xml等,組成一個(gè)集合

 

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

 

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

 

例如

StringHttpMessageConverter           

支持String , Accept所有類型

 

MappingJacksonHttpMessageConverter  

支持Map List 實(shí)體對(duì)象等等  ,Accept:application/json

 

 

示例:

目標(biāo):

使用ResponseBody根據(jù)head的Accept不同對(duì)同一地址請(qǐng)求分別來(lái)呈現(xiàn)一個(gè)實(shí)體的json與xml結(jié)果

 

由于<context:annotation-config />

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

 

<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我們?cè)趯?duì)應(yīng)的實(shí)體,比如User類上需要標(biāo)明

 

@XmlRootElement 注解,需要引入

 

import javax.xml.bind.annotation.XmlRootElement;

這個(gè)包。

 

 

Controller中應(yīng)對(duì)請(qǐ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這個(gè)工具進(jìn)行測(cè)試

如下圖:

 

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多