您的位置:首页 > 编程语言 > Java开发

springMVC之ContentNegotiatingViewResolver_01

2012-10-14 23:51 183 查看
原文:/article/5568538.html

这个解析器是做什么用的?
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,然后完成前面所说的比较.

<!-- 根据客户端的不同的请求决定不同的view进行响应, 如 /blog/1.json /blog/1.xml -->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<!-- 设置为true以忽略对Accept Header的支持-->
<property name="ignoreAcceptHeader" value="true"/>
<!-- 在没有扩展名时即: "/user/1" 时的默认展现形式 -->
<property name="defaultContentType" value="text/html"/>

<!-- 扩展名至mimeType的映射,即 /user.json => application/json -->
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
<!-- 用于开启 /userinfo/123?format=json 的支持 -->
<property name="favorParameter" value="false"/>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/pages"/>
<property name="suffix" value=".jsp"></property>
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<!-- for application/json -->
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<!-- for application/xml -->
<!--
<bean class="org.springframework.web.servlet.view.xml.MarshallingView" >
<property name="marshaller">
<bean class="org.springframework.oxm.xstream.XStreamMarshaller"/>
</property>
</bean>
-->
</list>
</property>
</bean>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: