22
2020
05

SpringMVC 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

  1. spring 给我们提供了 ContentNegotiationManagerFactoryBean这是推荐的方式。 配置上类似。

    1. 复制代码
      <bean id= =>
              <property name= value=/>
              <property name= value=/>
              <property name= value=/>
              <property name= value=/>
              <property name=>
                  <map>
                      <entry key= value=/>
                      <entry key= value=/>
                      <entry key= value=/>
                  </map>
              </property>
          </bean>
      复制代码

       

    2. 复制代码
      <bean id=
                =>
              <property name= =/>
              <property name=><!-- 针对freemarker的视图配置 --> 
                  <list>
                      <bean =>
                          <property name= value=/>
                          <property name= value=/>
                          <property name= value=/>
                          <property name= value= />
                          <property name= value= />
                          <property name= value= />
                          <property name= value=/>
                      </bean>
                      <bean =>
                          <property name= value=></property><!-- 配置页面路径 -->
                          <property name= value=></property><!-- 文件以value值结尾 -->
                      </bean>
                  </list>
              </property>
              <property name=>
                  <list>
                      <bean =>
                          <!-- <property name= value=/> -->
                          <property name= value=/>
                          <property name= value=/>
                      </bean>
                      <bean =>
                          <constructor-arg =>
       
                          </constructor-arg>
                      </bean>
                      <bean =/>
                  </list>
              </property>
          </bean>
      复制代码

       

    3. defaultViews的作用:在defaultViews里注册的视图会在ContentNegotiationViewResolver中注册自己支持的内容类型

    4. ContentNegotiationManagerFactoryBeanmediaTypes决定响应的内容类型

    5. 当contentNegotiationManager决定好响应的内容类型后,ContentNegotiationViewResolver就会根据该内容类型选择一个兼容的View进行渲染输出

    6. 一旦有View对请求内容匹配,就直接渲染输出,不会进行ViewResolver的查询。

    7. 当注册的内容类型都不兼容时,会查询viewResolver中的ViewResolver是否支持该请求,如果ViewResolver表示支持该请求,那么就由该ViewResolver负责视图渲染,如果ViewResolver表示不支持该请求,则查询下一个ViewResolver,直至所有的ViewResolver查询完毕。

    8.  

  2. 默认是支持path 后缀拓展方式, 也支持accept 请求头,但不支持 format 参数的

« 上一篇下一篇 »

相关文章:

SpringMVC中EL表达式不起作用  (2018-10-18 15:50:38)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。