• Spring 3.x MVC 入门3 使用内容协商来实现多视图


    ContentNegotiatingViewResolver

    这个解析器是做什么用的?

    RESTful服务中很重要的一个特性即是同一资源,多种表述我们使用ContentNegotiatingViewResolver就可以做到,这个视图解析器允许你用同样的内容数据来呈现不同的view

    如下面描述的三种方式:

    方式1  使用扩展名

    http://www.test.com/user.xml    呈现xml文件

    http://www.test.com/user.json    呈现json格式

    http://www.test.com/user       使用默认view呈现,比如jsp等

    -----------------------------------------------------------------------------------------------------

    方式2  使用http request header的Accept

    GET /user HTTP/1.1

    Accept:application/xml

    GET /user HTTP/1.1

    Accept:application/json

    ….

    -----------------------------------------------------------------------------------------------------

    方式3  使用参数

    http://www.test.com/user?format=xml

    http://www.test.com/user?format=json

    这三种方式各自的优缺点这里就不再介绍了

    如何使用ContentNegotiatingViewResolver?

    假设我们有这么一个目标:

    /user/{userid}.json    用于返回一个描述User的JSON

    /user/{userid}        用于返回一个展示User的JSP页面

    /user/{userid}.xml     用于返回一个展示User的XML文件

    配置文件说明   (具体例子下篇文章放上)

    我们知道有accept header,扩展名以及参数这三种方式,配置文件中

    这里是解析器的执行顺序,如果有多个的话(前面多次解释过)

    <property name="order" value="1"></property>

    --------------------------------------------------------------------------------------------------------------

     

    如果所有的mediaType都没匹配上,就会使用defaultContentType

    <property name="defaultContentType" value="text/html" />

    这里是是否启用扩展名支持,默认就是true

    例如  /user/{userid}.json

    <property name="favorPathExtension" value="true"></property>

    这里是是否启用参数支持,默认就是true

    例如  /user/{userid}?format=json

    <property name="favorParameter" value="false"></property>

    这里是否忽略掉accept header,默认就是false

    例如     GET /user HTTP/1.1

    Accept:application/json

    <property name="ignoreAcceptHeader" value="true"></property>

    我们的例子是采用.json , .xml结尾的,所以关掉两个

    --------------------------------------------------------------------------------------------------------------

    这里是扩展名到mimeType的映射,

    例如 /user/{userid}.json  中的   .json  就会映射到   application/json

    <property name="mediaTypes">

               <map>

                  <entry key="json" value="application/json" />

                  <entry key="xml" value="application/xml" />                     </map>

    </property>

    注:

    ContentNegotiatingViewResolver是根据客户提交的MimeType(如 text/html,application/xml)来跟服务端的一组viewResover的MimeType相比较,如果符合,即返回viewResover的数据.
    而 /user/123.xml, ContentNegotiatingViewResolver会首先将 .xml 根据mediaTypes属性将其转换成 application/xml,然后完成前面所说的比较.

    ContentNegotiatingViewResolver的处理流程(左上角入口)

     

  • 相关阅读:
    day 29 什么是元类、class底层原理分析、通过元类来控制类的产生、通过元类控制类的调用过程、有了元类之后的属性查找
    day 28 断点调试,反射,内置方法
    day 26 绑定方法,非绑定方法,面向对象串讲
    day 25 类的组合、多太与多态性、封装
    day 24 类的继承
    函数进阶(1)
    函数基础
    文件修改及函数定义
    文件处理
    字典类型内置方法
  • 原文地址:https://www.cnblogs.com/zhaoyang/p/2315428.html
Copyright © 2020-2023  润新知