1. 程式人生 > >spring ContentNegotiationManagerFactoryBean 內容協商

spring ContentNegotiationManagerFactoryBean 內容協商

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 內容協商