zoukankan      html  css  js  c++  java
  • 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的处理流程(左上角入口)

     

  • 相关阅读:
    继承(JAVA)
    第一个Java应用
    Java面向对象编程
    学生管理系统(分层开发)
    ComboBox的数据联动
    二进制、八进制、十进制、十六进制之间的转换
    C# using的一些事
    JVM最多支持多少个线程?
    Java日志体系居然这么复杂?——架构篇
    java 架构之路(队列)kafka
  • 原文地址:https://www.cnblogs.com/zhaoyang/p/2315428.html
Copyright © 2011-2022 走看看