1. ContentNegotiatingViewResolver,这个视图解析器允许你用同样的内容数据来呈现不同的view。它支持如下面描述的三种方式:
    1. 1)使用扩展名
      http://localhost:8080/employees/nego/Jack.xml  返回结果为XML
      http://localhost:8080/employees/nego/Jack.json 返回结果为JSON
      http://localhost:8080/employees/nego/Jack  使用默认view呈现,比如JSP

      2) HTTP Request Header中的Accept,Accept 分别是 text/jsp,  text/pdf,  text/xml,  text/json,  无Accept 请求头

      3) 使用参数
      http://localhost:8080/employees/nego/Jack?format=xml  返回结果为XML
      http://localhost:8080/employees/nego/Jack?format=json 返回结果为JSON

  2.  ContentNegotiatingViewResolver 可以一个@RequestMapping,返回多个view。
  3. 配置
    1. <property name="favorPathExtension" value="true"></property> 是否启用扩展名支持,默认是true

      <property name="favorParameter" value="false"></property> 是否启用参数支持,默认是true

      <property name="ignoreAcceptHeader" value="true"></property> 是否忽略掉accept header,默认就是false

    2. spring 给我们提供了 ContentNegotiationManagerFactoryBean这是推荐的方式。 配置上类似。
      1. <bean id="cnManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <property name="ignoreAcceptHeader" value="true"/>
        <property name="favorPathExtension" value="true"/>
        <property name="defaultContentType" value="text/html"/>
        <property name="favorParameter" value="true"/>
        <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>
        </bean>
      2. <bean id="viewResolver"
        class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="contentNegotiationManager" ref="cnManager"/>
        <property name="viewResolvers"><!-- 针对freemarker的视图配置 -->
        <list>
        <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
        <property name="viewNames" value=".ftl"/>
        <property name="contentType" value="text/html; charset=utf-8"/>
        <property name="cache" value="true" />
        <property name="prefix" value="" />
        <property name="suffix" value="" />
        <property name="order" value=""/>
        </bean>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/jsp/"></property><!-- 配置页面路径 -->
        <property name="suffix" value=".jsp"></property><!-- 文件以value值结尾 -->
        </bean>
        </list>
        </property>
        <property name="defaultViews">
        <list>
        <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
        <!-- <property name="extractValueFromSingleKeyModel" value="true"/> -->
        <property name="prettyPrint" value="true"/>
        <property name="contentType" value="text/plain"/>
        </bean>
        <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
        <constructor-arg ref="jaxb2Marshaller"> </constructor-arg>
        </bean>
        <bean class="com.wonders.stpt.bid.controller.JXLExcelView"/>
        </list>
        </property>
        </bean>
      3. defaultViews的作用:在defaultViews里注册的视图会在ContentNegotiationViewResolver中注册自己支持的内容类型

      4. 由ContentNegotiationManagerFactoryBean的mediaTypes决定响应的内容类型
      5. 当contentNegotiationManager决定好响应的内容类型后,ContentNegotiationViewResolver就会根据该内容类型选择一个兼容的View进行渲染输出
      6. 一旦有View对请求内容匹配,就直接渲染输出,不会进行ViewResolver的查询。
      7. 当注册的内容类型都不兼容时,会查询viewResolver中的ViewResolver是否支持该请求,如果ViewResolver表示支持该请求,那么就由该ViewResolver负责视图渲染,如果ViewResolver表示不支持该请求,则查询下一个ViewResolver,直至所有的ViewResolver查询完毕。
    3. 默认是支持path 后缀拓展方式, 也支持accept 请求头,但不支持 format 参数的

Spring 梳理 - ContentNegotiatingViewResolver的更多相关文章

  1. Spring 梳理 - filter、interceptor、aop实现与区别 -第二篇

    spring mvc中的Interceptor可以理解为是Spring MVC框架对AOP的一种实现方式.一般简单的功能又是通用的,每个请求都要去处理的,比如判断token是否失效可以使用spring ...

  2. Spring 梳理 - filter、interceptor、aop实现与区别 -第一篇

    前言 项目中我们经常需要对RESTful api进行拦截,主流实现方法有filter.interceptor.aop,先说一下他们各自的实现. Filter AnimalFilter实现javax.s ...

  3. Spring 梳理 - View - JSON and XML View

    实际案例json <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...

  4. Spring 梳理 - 视图解析器 VS 视图(View,ViewResolver)

    View View接口表示一个响应给用户的视图,例如jsp文件,pdf文件,html文件等 该接口只有两个方法定义,分别表明该视图的ContentType和如何被渲染 Spring中提供了丰富的视图支 ...

  5. Spring 梳理 - javaConfig在App和webApp中的应用

    package com.dxz.demo.configuration; import org.springframework.context.annotation.Configuration; @Co ...

  6. Spring 梳理 - @Component

    使用@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符.如果不指定标识符,默认为首字母小写类名.例如类UserController的标识 ...

  7. Spring 梳理 - @Autowired VS @Resource

    Autowired @Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property.当然,getter看个人需求,如果私 ...

  8. Spring 梳理 - AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

    Spring  AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect)   1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是 ...

  9. Spring 梳理 - JavaConfig、SPI、SCI、SpringSCI、WebApplicationInitializer、AbstractAnnotationConfigDispatcherServletInitializer、WebMvcConfigurationSupport

    总结1: SCI:Servlet容器(Tomcat)提供的初始化Servlet容器本身的接口,可替换web.xml SpringSCI:SpringServletContainerInitialize ...

随机推荐

  1. HDU 1517

    题意略. 思路: 我们分别来考虑n取到的各个区间,从而发现其中的规律: [2,9] 明显 Stan 必胜. 但是当n = 9 + 1时,Stan无论如何也不能取胜,并且此时,假设 Stan 取值 x ...

  2. [翻译] C# 8.0 接口默认实现

    原文: Default implementations in interfaces 随着上周的 .NET Core 3.0 Prview 5 和 Visual Studio 2019 version ...

  3. 深入GPU硬件架构及运行机制

    目录 一.导言 1.1 为何要了解GPU? 1.2 内容要点 1.3 带着问题阅读 二.GPU概述 2.1 GPU是什么? 2.2 GPU历史 2.2.1 NV GPU发展史 2.2.2 NV GPU ...

  4. 证书pfx转jks

    keytool -importkeystore -srckeystore  2756649_order.hanels-home.com.pfx -srcstoretype pkcs12 -destke ...

  5. gym/102021/K GCPC18 背包dp算不同数和的可能

    gym/102021/K 题意: 给定n(n<=60)个直线 ,长度<=1000; 可以转化为取 计算 ans = (sum  + 10 - g) / ( n + 1)  在小于5的条件下 ...

  6. UVALive - 6667 Longest Chain CDQ3维问题

    题意:现在有一个点堆, 一开始先给你m个点,然后再用题目中的rand函数生成剩下的n个点,问在这个点堆中可以找到的最长严格递增序列的长度是多少. 题解: 很常见的一个3维CDQ. 先按照z轴 sort ...

  7. CF1025B Weakened Common Divisor 数学

    Weakened Common Divisor time limit per test 1.5 seconds memory limit per test 256 megabytes input st ...

  8. codeforces 761 C. Dasha and Password(多维dp)

    题目链接:http://codeforces.com/contest/761/problem/C 题意:给出n行的字符串每一列都从第一个元素开始可以左右移动每一行字符串都是首位相连的. 最后问最少移动 ...

  9. 字符串的api (基础)

    一.基础 1.字符串.charAt(index) 根据下标获取字符串的某一个字符 应用: 判断字符串的首字母是否大写 任意给定的一串字母,统计字符串里面的大写字母和小写字母的个数 2.字符串.inde ...

  10. Fire Balls 10——UI界面的制作

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...