spring ContentNegotiationManagerFactoryBean 内容协商 2017-07-31 14:25 68人阅读 评论(0) 收藏 举报 一.什么是内容协商 简单点说,

来源:互联网 发布:lamp源码搭建 编辑:程序博客网 时间:2024/05/18 01:01

spring ContentNegotiationManagerFactoryBean 内容协商

  
一.什么是内容协商
简单点说,就是同一资源,可以有多种表现形式,比如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的配置文件中做配置,示例如下:
[html] view plain copy
  1. <!--1、检查扩展名(如my.pdf);2、检查Parameter(如my?format=pdf);3、检查Accept Header-->  
  2.     <bean id"contentNegotiationManager" class"org.springframework.web.accept.ContentNegotiationManagerFactoryBean">  
  3.         <!-- 扩展名至mimeType的映射,即 /user.json => application/json -->  
  4.         <property name"favorPathExtension" value"true" />  
  5.         <!-- 用于开启 /userinfo/123?format=json 的支持 -->  
  6.         <property name"favorParameter" value"true" />  
  7.         <property name"parameterName" value"format"/>  
  8.         <!-- 是否忽略Accept Header -->  
  9.         <property name"ignoreAcceptHeader" value"false"/>  
  10.     <!--扩展名到MIME的映射;favorPathExtension, favorParameter是true时起作用  -->  
  11.         <property name"mediaTypes">   
  12.             <value>  
  13.                 json=application/json  
  14.                 xml=application/xml  
  15.                 html=text/html  
  16.             </value>  
  17.         </property>  
  18.     <!--<property name="mediaTypes">-->  
  19.          <!--<map>-->  
  20.                 <!--<entry key="xml" value="application/xml"/>-->  
  21.                 <!--<entry key="json" value="text/plain"/>-->  
  22.                 <!--<entry key="xls" value="application/vnd.ms-excel"/>-->  
  23.             <!--</map>-->  
  24.     <!--</property>-->   
  25.         <!-- 默认的content type ,在没有扩展名和参数时即: "/user/1" 时的默认展现形式  -->  
  26.         <property name"defaultContentType" value"text/html" />  
  27.     </bean>  

视图定义:
[html] view plain copy
  1.  <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">  
  2.         <property name="order" value="0"/>  
  3.         <property name="contentNegotiationManager" ref="contentNegotiationManager"/>  
  4.         <property name="viewResolvers">  
  5.             <list>  
  6.                 <!-- 这个类用于jsp视图解析 -->  
  7.                 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  8.                     <property name="prefix" value="/WEB-INF/page/"/>  
  9.                     <property name="suffix" value=".jsp"/>  
  10.                 </bean>  
  11.   
  12.             </list>  
  13.         </property>  
  14.         <property name="defaultViews">  
  15.             <list>  
  16.                 <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">  
  17.                 </bean>  
  18.                 <!-- for application/xml -->  
  19.                 <bean class="org.springframework.web.servlet.view.xml.MarshallingView">  
  20.                     <property name="marshaller">  
  21.                         <bean class="org.springframework.oxm.castor.CastorMarshaller">  
  22.                             <property name="validating" value="false"></property>  
  23.                         </bean>  
  24.                     </property>  
  25.                 </bean>  
  26.             </list>  
  27.         </property>  
  28.     </bean>  

在mvc:annotation-driven里面配置使用内容协商
[html] view plain copy
  1. <mvc:annotation-driven  
  2.       conversion-service"conversionService"  
  3.       content-negotiation-manager= "contentNegotiationManager”/> 
阅读全文
0 0