spring ContentNegotiationManagerFactoryBean 內容協商
阿新 • • 發佈:2018-12-11
fault -- 表現 orm int bsp tor 返回JSON數據 ast
一.什麽是內容協商
簡單點說,就是同一資源,可以有多種表現形式,比如xml、json等,具體使用哪種表現形式,是可以協商的。 這是RESTfull的一個重要特性,Spring Web MVC也支持這個功能。 1.Spring MVC REST是如何決定采用何種方式(視圖)來展示內容呢? 一:根據Http請求的header中的Accept屬性的值來判讀,比如: Accept: application/xml 將返回xml格式數據 Accept: application/json 將返回json格式數據 優點:是這種方式是理想的標準方式 缺點:是由於瀏覽器的差異,導致發送的Accept Header頭可能會不一樣,從而導致服務器不知要返回什麽格式的數據 二:根據擴展名來判斷,比如: /mvc/test.xml 將返回xml格式數據 /mvc/test.json 將返回json格式數據 /mvc/test.html 將返回html格式數據 缺點:喪失了同一URL的多種展現方式。在實際環境中使用還是較多的,因為這種方式更符合程序員的習慣 三:根據參數來判斷 /mvc/test?format=xml 將返回xml數據 /mvc/test?format=json 將返回json數據 缺點:需要額外的傳遞format參數,URL變得冗余繁瑣,缺少了REST的簡潔風範 2.使用內容協商的功能,如果不使用第三種方式的話,3.2的版本可以什麽都不用配置,默認就能支持前面兩種。下面還是看看怎麽配置,示例如下: 需要在spring的配置文件中做配置,示例如下:<!--1、檢查擴展名(如my.pdf);2、檢查Parameter(如my?format=pdf);3、檢查Accept Header--> <bean id= "contentNegotiationManager" class= "org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <!-- 擴展名至mimeType的映射,即 /user.json => application/json --> <property name= "favorPathExtension" value= "true" /> <!-- 用於開啟 /userinfo/123?format=json 的支持 --> <property name= "favorParameter" value= "true" /> <property name= "parameterName" value= "format"/> <!-- 是否忽略Accept Header --> <property name= "ignoreAcceptHeader" value= "false"/> <!--擴展名到MIME的映射;favorPathExtension, favorParameter是true時起作用 --> <property name= "mediaTypes"> <value> json=application/json xml=application/xml html=text/html </value> </property> <!--<property name="mediaTypes">--> <!--<map>--> <!--<entry key="xml" value="application/xml"/>--> <!--<entry key="json" value="text/plain"/>--> <!--<entry key="xls" value="application/vnd.ms-excel"/>--> <!--</map>--> <!--</property>--> <!-- 默認的content type ,在沒有擴展名和參數時即: "/user/1" 時的默認展現形式 --> <property name= "defaultContentType" value= "text/html" /> </bean>
視圖定義:
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="order" value="0"/> <property name="contentNegotiationManager" ref="contentNegotiationManager"/> <property name="viewResolvers"> <list> <!-- 這個類用於jsp視圖解析 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/page/"/> <property name="suffix" value=".jsp"/> </bean> </list> </property> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> </bean> <!-- for application/xml --> <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> <property name="marshaller"> <bean class="org.springframework.oxm.castor.CastorMarshaller"> <property name="validating" value="false"></property> </bean> </property> </bean> </list> </property> </bean>
在mvc:annotation-driven裏面配置使用內容協商
<mvc:annotation-driven conversion-service= "conversionService" content-negotiation-manager= "contentNegotiationManager”/>
spring ContentNegotiationManagerFactoryBean 內容協商