关闭

SpringMVC之ContentNegotiatingViewResolver解析器之实例分析

标签: spring mvc
927人阅读 评论(0) 收藏 举报
分类:

        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,然后完成前面所说的比较.

 

使用内容协商实现多视图例

根据前篇文件的介绍,这里直接给出例子

 

配置xml

<context:component-scan base-package="com.controls" />

   

    <context:annotation-config />

   

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">

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

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

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

       

        <property name="mediaTypes">

            <map>

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

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

            </map>

        </property>

       

        <property name="defaultViews">

            <list>

                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"></bean>

                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">

                    <constructor-arg>

                        <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">

                             <property name="classesToBeBound">

                                <list>

                                   <value>com.model.User</value>

                                </list>

                             </property>

                        </bean>

                    </constructor-arg>

                </bean>

            </list>

        </property>

    </bean>

    <!-- 上面没匹配到则会使用这个视图解析器 -->

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

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

        <property name="prefix" value="/WEB-INF/views/" />

        <property name="suffix" value=".jsp" />

        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />

    </bean>


 

Model

@XmlRootElement

public class User {

   

    private long userID;

    private String userName;

    private Date birth;

 

    public String getUserName() {

       return userName;

    }

    public void setUserName(String userName) {

       this.userName = userName;

    }

    public Date getBirth() {

       return birth;

    }

    public void setBirth(Date birth) {

       this.birth = birth;

    }

    public long getUserID() {

       return userID;

    }

    public void setUserID(long userID) {

       this.userID = userID;

    }

}


 

 

Contoller

@RequestMapping(value="/user/{userid}")

public String queryUser(@PathVariable("userid")  long userID, ModelMap model)

{

      

       User u = new User();

       u.setUserID(userID);

       u.setUserName("zhaoyang");

       model.addAttribute("User", u);

      

       return "User";

}


 

 

 

 

如果是返回text/html,还需要建立个jsp文件

<body>

    UserName: ${requestScope.User.userID } <br />

    Age: ${requestScope.User.userName }

  </body>

 

测试结果

json

 

xml

 

 

 

jsp

 

 

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

ContentNegotiatingViewResolver解析器

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

SpringMVC之ContentNegotiatingViewResolver详解

诞生自 3.0 的 ContentNegotiatingViewResolver 从字义不太容易知道在做什么或怎么用,那就从 Source code 好好来研究一下。 每个 ViewResolver...
  • zmx729618
  • zmx729618
  • 2016-05-31 14:28
  • 4400

SpringMVC中的ContentNegotiatingViewResolver配置

RESTful服务中很重要的一个特性即是同一资源,多种表述.如 get put post delete head方式提交的请求,或者根据accept,参数,后缀等方式。get、put、post、del...
  • zmx729618
  • zmx729618
  • 2016-05-31 16:31
  • 3946

SpringMVC ContentNegotiatingViewResolver -- 根据请求资源名选择视图

前一篇文章介绍了如何利用@ResponseBody和HTTP Request Header中的Accept属性实现返回结果中自动选择XML或者JSON。 这里介绍另外一种办法,利用使用Conte...
  • z69183787
  • z69183787
  • 2016-10-11 11:54
  • 553

Spring mvc 视图解析器 ContentNegotiatingViewResolver 源码分析

步骤概要: 方法resolveViewName中获取mediaType(由accept-header中获取,springmvc每个view的默认contenttype为text/html),根据访问的...
  • z69183787
  • z69183787
  • 2014-12-03 14:19
  • 26446

springMVC之ContentNegotiatingViewResolver_01

原文:http://www.cnblogs.com/zhaoyang/archive/2012/01/07/2315428.html   这个解析器是做什么用的? RESTful服务中很重要的一个特性...
  • lan861698789
  • lan861698789
  • 2012-10-14 23:51
  • 6829

spring mvc4.2 ContentNegotiatingViewResolver 根据路径后缀,选择不同视图

spring mvc配置文件: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http...
  • npf_java
  • npf_java
  • 2015-10-13 09:23
  • 5697

ContentNegotiatingViewResolver解析器

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

Springmvc同一资源不同描述配置-contentnegotiatingviewresolver

定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 --> 前面 -->
  • VagueCoder
  • VagueCoder
  • 2015-07-26 08:48
  • 2467

java-为指定的图像文件加透明阴影

import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Graphics2D; import java.awt.T...
  • z69183787
  • z69183787
  • 2017-08-17 17:56
  • 350
    个人资料
    • 访问:1483877次
    • 积分:17023
    • 等级:
    • 排名:第678名
    • 原创:155篇
    • 转载:913篇
    • 译文:34篇
    • 评论:212条
    文章分类
    最新评论