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. <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
         <property name="favorParameter" value="true"/>
         <property name="favorPathExtension" value="true"/>
         <property name="mediaTypes">
               <map>
                  <entry key="xml" value="application/xml"/>   // 
                  <entry key="json" value="application/json"/> // 这里, 对于 json ,必须是application/json
                  <!--<entry key="json" value="text/plain"/>-->
                  <entry key="xls" value="application/vnd.ms-excel"/>
               </map>
         </property>
         <property name="viewResolvers"> 
            <list>
               <ref bean="jaxb2MarshallingXmlViewResolver"></ref>
               <ref bean="jsonViewResolver"></ref>
               <ref bean="excelViewResolver"></ref>
            </list>
         </property>
      </bean>
    3. 上面的 viewResolvers 属性是可以不用配置的, 默认spring 会查找所有 ViewResolver类型的对象。这样, 就同时支持了 parameter参数方式和 后缀拓展名方式。
    4. 这里直接使用了ContentNegotiatingViewResolver, 实际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>
    5. 默认是支持path 后缀拓展方式, 也支持accept 请求头,但不支持 format 参数的

猜你喜欢

转载自www.cnblogs.com/jiangtao1218/p/10205166.html