Xml代碼
<bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /><!-- json轉換器 -->
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
<bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /><!-- json轉換器 -->
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
需要以下兩個jar包:
Xml代碼
<dependency org="org.codehaus.jackson" name="jackson-core-asl" rev="1.5.5" conf="runtime->default" />
<dependency org="org.codehaus.jackson" name="jackson-mapper-asl" rev="1.5.5" conf="runtime->default" />
<dependency org="org.codehaus.jackson" name="jackson-core-asl" rev="1.5.5" conf="runtime->default" />
<dependency org="org.codehaus.jackson" name="jackson-mapper-asl" rev="1.5.5" conf="runtime->default" />
Java代碼
@RequestMapping(value="/nogood", method=RequestMethod.GET)
public @ResponseBody CmUser execute(String userid) {
CmUser u = new CmUser();
u.setAge(16);
u.setName("測試用戶");
return u;
}
通過上面的代碼可以實現java對象直接可以轉json對象,下面是項目中的配置
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService"/>
</bean>
</property>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
<bean class="org.springframework.http.converter.StringHttpMessageConverter" >
<property name = "supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
<!-- 注:開啟此類需相關jar包持:javax.xml.bind.JAXBException
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />
-->
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
下面分析@ResponseBody 注解
在SpringMVC中可以在Controller的某個方法上加@ResponseBody注解,表示該方法的返回結果直接寫入HTTP response body中。
但是實際使用中發現最后生成的response中"Content-Type"的值不正確。
Spring使用AnnotationMethodHandlerAdapter來處理@ResponseBody,該類再使用一些HttpMessageConverter來具體處理信息。
AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType進行匹配,然后會用"Accept"的第一個值寫入 response的"Content-Type"。
一般的請求都是通過瀏覽器進行的,request header中"Accept"的值由瀏覽器生成。
Chrome生成的值為application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
IE8生成的值為application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
所以最后寫入response中"Content-Type"的值為"application/xml"或"application/x-ms-application"。
但我們一般會在標注@ResponseBody的方法上返回String或byte[]類型的結果,期望的"Content-Type"的值應為"text/plain"或"application/octet-stream"。
這樣導致了瀏覽器不能正確處理返回的內容。
實際上Spring在用HttpMessageConverter處理的過程中首先會判斷response header中有沒有寫入"Content-Type",如果沒有寫入的話才會使用request header中"Accept"的第一個值。
但是由於Spring對HttpServletResponse進行了封裝,實際上使用的是ServletServerHttpResponse,這個類有一個對真正的HttpServletResponse的引用。
判斷response header的過程中使用的是ServletServerHttpResponse的getHeaders()方法,但該方法並沒有返回真正的HttpServletResponse中的header。(這應該有問題吧?)
所以我們雖然可以在Controller的方法中加入對HttpServletResponse的引用,然后設置"Content-Type"的值,但是並不會起作用。
通過上面的分析,@ResponseBody看來是無法使用了。
還可以參考下面文章: http://www.iteye.com/topic/1124054
http://www.360doc.com/content/12/0809/11/9600761_229177035.shtml
<bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /><!-- json轉換器 -->
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
<bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /><!-- json轉換器 -->
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
需要以下兩個jar包:
Xml代碼
<dependency org="org.codehaus.jackson" name="jackson-core-asl" rev="1.5.5" conf="runtime->default" />
<dependency org="org.codehaus.jackson" name="jackson-mapper-asl" rev="1.5.5" conf="runtime->default" />
<dependency org="org.codehaus.jackson" name="jackson-core-asl" rev="1.5.5" conf="runtime->default" />
<dependency org="org.codehaus.jackson" name="jackson-mapper-asl" rev="1.5.5" conf="runtime->default" />
Java代碼
@RequestMapping(value="/nogood", method=RequestMethod.GET)
public @ResponseBody CmUser execute(String userid) {
CmUser u = new CmUser();
u.setAge(16);
u.setName("測試用戶");
return u;
}
通過上面的代碼可以實現java對象直接可以轉json對象,下面是項目中的配置
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService"/>
</bean>
</property>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
<bean class="org.springframework.http.converter.StringHttpMessageConverter" >
<property name = "supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
<!-- 注:開啟此類需相關jar包持:javax.xml.bind.JAXBException
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />
-->
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
下面分析@ResponseBody 注解
在SpringMVC中可以在Controller的某個方法上加@ResponseBody注解,表示該方法的返回結果直接寫入HTTP response body中。
但是實際使用中發現最后生成的response中"Content-Type"的值不正確。
Spring使用AnnotationMethodHandlerAdapter來處理@ResponseBody,該類再使用一些HttpMessageConverter來具體處理信息。
AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType進行匹配,然后會用"Accept"的第一個值寫入 response的"Content-Type"。
一般的請求都是通過瀏覽器進行的,request header中"Accept"的值由瀏覽器生成。
Chrome生成的值為application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
IE8生成的值為application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
所以最后寫入response中"Content-Type"的值為"application/xml"或"application/x-ms-application"。
但我們一般會在標注@ResponseBody的方法上返回String或byte[]類型的結果,期望的"Content-Type"的值應為"text/plain"或"application/octet-stream"。
這樣導致了瀏覽器不能正確處理返回的內容。
實際上Spring在用HttpMessageConverter處理的過程中首先會判斷response header中有沒有寫入"Content-Type",如果沒有寫入的話才會使用request header中"Accept"的第一個值。
但是由於Spring對HttpServletResponse進行了封裝,實際上使用的是ServletServerHttpResponse,這個類有一個對真正的HttpServletResponse的引用。
判斷response header的過程中使用的是ServletServerHttpResponse的getHeaders()方法,但該方法並沒有返回真正的HttpServletResponse中的header。(這應該有問題吧?)
所以我們雖然可以在Controller的方法中加入對HttpServletResponse的引用,然后設置"Content-Type"的值,但是並不會起作用。
通過上面的分析,@ResponseBody看來是無法使用了。
還可以參考下面文章: http://www.iteye.com/topic/1124054
http://www.360doc.com/content/12/0809/11/9600761_229177035.shtml
- 頂
- 0