Spring 梳理 - ContentNegotiatingViewResolver

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

       

       

posted on 2019-01-01 16:48  手握太阳  阅读(1148)  评论(0编辑  收藏  举报

导航