ContentNegotiatingViewResolver

   ContentNegotiatingViewResolver支持在Spring MVC下输出不同的格式;

   ContentNegotiatingViewResolver是ViewResolver的一个实现

   ContentNegotiatingViewResolver使用request的媒体类型,根据扩展名选择不同的view输出不同的格式

   ContentNegotiatingViewResolver不是自己处理view,而是代理给不同的ViewResolver来处理不同的view;

   

   Spring在解析视图的时候有两个重要的接口:ViewResolver 和 View
   ViewResolver 中只有一个方法 resolveViewName ,提供 view name 和 实际 view的映射;
   View 中两个方法 getContentType render ,解析请求中的参数并把这个请求处理成某一种 View.

 

   对于一个请求,应该返回什么样的视图是 ViewResolver 来决定的,spring3.0提供的 ViewResolver 包括 AbstractCachingViewResolver,XmlViewResolver,ResourceBundleViewResolver,UrlBasedViewResolver,InternalResourceViewResolver,VelocityViewResolver/FreeMarkerViewResolver,ContentNegotiatingViewResolver等

     ContentNegotiatingViewResolver 

 根据官方文档:The ContentNegotiatingViewResolver does not resolve views itself but rather delegates to other view resolvers,就是说ContentNegotiatingViewResolver 本身并不自己去解析,只是分配给其他的ViewResolver 去解析。并选择一个看起来像是客户端请求需要返回的一种 View  返回。

    1. spring检查setFavorPathExtension(boolean) ,如果这个属性为true(默认为true),检查请求的后缀名,来返回一种 mediaType ,而后缀名和mediaType是通过ContentNegotiatingViewResolver  配置中的mediaTypes指定的

   2、spring检查 setFavorParameter(boolean) 这个属性是否为true(默认为false),而如果你打开这个属性,那么默认的参数名应为 format 

   3、没有找到合适的mediaType,并且 ignoreAcceptHeader 这个属性为false(默认为false),spring则根据  你请求头里面设置的  ContentType 来找适合的 mediaType

   要想返回JSON数据所代表的MappingJacksonJsonView   ,要么在请求头中设置contentType为application/json,要么使用 **.json   或者  **?format=json 

例子:

  /user/showUserListMix.html     返回一个html的页面显示用户列表

 /user/showUserListMix.html ?content=xml   返回一个xml的页面显示用户列表

 /user/showUserListMix.html ?content=json   返回一个json的页面显示用户列表

User

public class User {
    private String username;
    private String realName;
    private Date   birthday;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

UserController

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping(path = "/showUserList")
    public String showUserListMix(ModelMap map){
        GregorianCalendar calendar = new GregorianCalendar();
        List<User> userList= new ArrayList<User>();

        User user_1 = new User();
        user_1.setUsername("Jim");
        user_1.setRealName(" Son");
        calendar.set(2000,1,1);
        user_1.setBirthday(calendar.getTime());
        userList.add(user_1);

        User user_2=new User();
        user_2.setUsername("Lucy");
        user_2.setRealName(" Lily");
        calendar.set(2010,2,1);
        userList.add(user_2);

        map.addAttribute("userList",userList);
        return "userListMix";
    }
}

WebApplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        ">
     <context:component-scan base-package="com.smart.web"/>

     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
           p:viewClass="org.springframework.web.servlet.view.JstlView"
           p:prefix="/WEB-INF/views/"
           p:suffix=".jsp"/>

     <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"
           p:ignoreAcceptHeader="true"
           p:favorPathExtension="false"
           p:favorParameter="true"
           p:parameterName="format"
           p:defaultContentType="text/html">
          <property name="mediaTypes">
               <value>
                    html=text/html
                    xml=application/xml
                    json=application/json
               </value>
          </property>
     </bean>

     <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="0">
          <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
          <property name="defaultViews">
               <list>
               <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" p:modelKey="userList"/>
               <bean class="org.springframework.web.servlet.view.xml.MarshallingView" p:modelKey="userList" p:marshaller-ref="xmlMarshaller"/>
               </list>
          </property>
     </bean>

     <bean id="xmlMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
          <property name="streamDriver">
               <bean class="com.thoughtworks.xstream.io.xml.StaxDriver"/>
          </property>
          <property name="annotatedClasses">
               <list>
                    <value>com.smart.domain.User</value>
               </list>
          </property>
     </bean>

     <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
          <property name="basenames">
               <list>
                    <value>i18n/messages</value>
                    <value>i18n/content</value>
               </list>
          </property>
     </bean>

     <mvc:annotation-driven/>
</beans>

 

posted on 2018-12-31 15:31  溪水静幽  阅读(382)  评论(0)    收藏  举报