SpringMVC 4.1 新特性(二)内容协商视图

来源:互联网 发布:php xss过滤 编辑:程序博客网 时间:2024/06/06 05:14

SpingMVC的内容协商支持三种方式:

  1. 使用后缀,如.json.xml后缀和处理类型的关系可以自己定义
  2. 前面说的使用Accept头
  3. 在访问时request请求的参数,比如每次请求request都会加format=xml参数,表示要求返回XML格式数据,默认参数名是format,可以修改。

SpingMVC规定,如果同时开启了上面的部分或全部方式,解析顺序是后缀、参数、Accept头。对我来说,还是比较喜欢用Accept头,用的时间长,比较适应。

SpingMVC文件中的配置方式如下:

  1. <!-- Make this available across all of Spring MVC -->
  2. <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />
  3.  
  4. <!-- Total customization - see below for explanation. -->
  5. <bean id="contentNegotiationManager"
  6. class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
  7. <property name="favorPathExtension" value="true" />
  8. <property name="favorParameter" value="false" />
  9. <property name="parameterName" value="format" />
  10. <property name="ignoreAcceptHeader" value="false"/>
  11. <property name="useJaf" value="false"/>
  12. <property name="defaultContentType" value="text/html" />
  13.  
  14. <property name="mediaTypes">
  15. <map>
  16. <entry key="json" value="application/json" />
  17. <entry key="xml" value="application/xml" />
  18. </map>
  19. </property>
  20. </bean>

  • favorPathExtension参数表示是否开启后缀,默认true。(使用形如/account/a.json/account/a.xml的方式)
  • favorParameter参数表示是否开启request参数识别,默认false。(使用形如/account/a?format=json/account/?format=xml的方式)
  • parameterName参数表示使用参数的名字,默认format,如果配置为mediaType,则请求格式变为/account/a?mediaType=json
  • ignoreAcceptHeader表示是否关闭accept头识别,默认false,即默认开启accept头识别。
  • defaultContentType表示服务器默认的MediaType类型。
  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"><!-- 这里也可以配置viewResolver -->
  5. <list>
  6. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  7. <property name="prefix" value="/WEB-INF/views/" />
  8. <property name="suffix" value=".jsp" />
  9. </bean>
  10. </list>
  11. </property>
  12. <property name="defaultViews">
  13. <list>
  14. <!-- 不加配置返回 {"account":{"username":"admin","password":"123456"}} -->
  15. <!-- 加配置返回 {"username":"admin","password":"123456"}-->
  16. <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
  17. <property name="extractValueFromSingleKeyModel" value="true" />
  18. </bean>
  19. <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
  20. <property name="marshaller">
  21. <bean class="org.springframework.oxm.xstream.XStreamMarshaller"/>
  22. </property>
  23. </bean>
  24. </list>
  25. </property>
  26. </bean>

在Spring4.1之后提供了视图解析器标签,可以用如下方式

  1. <mvc:view-resolvers>
  2. <mvc:content-negotiation>
  3. <mvc:default-views>
  4. <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
  5. <property name="jsonpParameterNames">
  6. <set>
  7. <value>jsonp</value>
  8. <value>callback</value>
  9. </set>
  10. </property>
  11. <!-- 不加配置返回 {"account":{"username":"admin","password":"123456"}}
  12. 加配置返回 {"username":"admin","password":"123456"} -->
  13. <property name="extractValueFromSingleKeyModel" value="true" />
  14. </bean>
  15. <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
  16. <property name="marshaller">
  17. <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
  18. <!-- 启用annotation -->
  19. <property name="autodetectAnnotations" value="true" />
  20. </bean>
  21. </property>
  22. </bean>
  23. </mvc:default-views>
  24. </mvc:content-negotiation>
  25. <mvc:jsp prefix="/WEB-INF/views/" suffix=".jsp" />
  26. </mvc:view-resolvers>

mvc:content-negotiation用于定义内容协商的视图解析器,且内部可以定义默认视图;然后我们又定义了mvc:velocitymvc:groovy两个视图解析器;它们会按照顺序进行解析。另外几个视图解析器是:

mvc:freemarker 
mvc:bean-name 
mvc:jsp

原创粉丝点击