- 浏览: 16094 次
- 性别:
- 来自: 北京
文章分类
最新评论
springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】
restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式。
描述资源的三种形式
一、使用扩展名
http://localhost:8080/test/user.xml 以xml格式呈现
http://localhost:8080/test/user.json 以json格式呈现
http://localhost:8080/test/user 以默认视图呈现,如jsp
二、使用http request header的Accept
GET /user HTTP/1.1
Accept:application/xml 请求时设置返回形式是xml,如使用ajax请求,则需要设置contentType:application/xml
GET /user HTTP/1.1
Accept:application/json 请求时设置返回形式是json,如使用ajax请求,则需要设置contentType:application/json
三、使用参数
http://localhost:8080/test/user?format=json
http://localhost:8080/test/user?format=xml
上面了解了同一种资源的三种呈现方式,即json、xml、jsp,那么我们要如何使用ContentNegotiatingViewResolver类配置,使客户端请求的方式不同,返回同一种资源的三种方式呢?
ContentNegotiatingViewResolver配置
ContentNegotiatingViewResolver是视图解析器,我们在使用jsp这个视图的时候也配置了一个视图解析器InternalResourceViewResolver,他们都是视图解析器,后者着重在配置一个默认的视图解析即jsp;ContentNegotiatingViewResolver本身不会解析,他会分配其他的viewResolver去解析,并选择一个看起来像是客户端请求需要返回的一种 View 返回。
下面是ContentNegotiatingViewResolver的具体配置
复制代码
<!--springmvc中根据后缀不同返回不同格式的配置
如,XXX.json 返回json格式
XXX.xml 返回xml格式
xxx 返回jsp
-->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<!--这里是解析器的执行顺序,如果有多个的话,配置的数值越小,则越早执行-->
<property name="order" value="1" />
<!--
这里是是否启用扩展名支持,默认就是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>
<!--
这里是扩展名到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>
<!--视图-->
<property name="defaultViews">
<list>
<!--json视图-->
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean>
<!--xml视图-->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView"
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.cn.my.entity.Course</value>
<value>com.cn.my.entity.CourseList</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
</list>
</property>
</bean>
复制代码
order:如果存在多个viewResolver则order值小的被使用,如果没有合适的viewResolver则会使用另外的;
favorPathExtension:是否支持扩展名,默认为true(支持),扩展名指的xxx.json、xxx.xml等形式
favorParameter:是否启用参数支持,默认为true(支持),即xxx?format=json、xxx?format=xml等形式,这里的参数名默认为format,可以通过配置改变。
ignoreAcceptHeader:是否忽略accept header,默认是false(不忽略),即请求时指定的contentType:application/json等,由于我这里要使用扩展名的形式返回,所以把另外两项都关闭了,可视不同情况,使用不同设置;
mediaTypes:配置扩展名到mimeType的映射,这里配置了json和xml的映射;
defaultViews:配置视图,这里配置了json和xml的视图,json使用的jackson;
最后,我还配置一个另外一个视图解析器,InternalResourceViewResolver,
复制代码
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="order" value="2" />
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>
复制代码
这是jsp的视图解析器,order属性配置为了2,在无法匹配到json、xml的情况下,会返回jsp的视图。
下面是controller的方法
复制代码
package com.cn.my.controllor;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import com.cn.my.entity.Course;
import com.cn.my.entity.CourseList;
@Controller
@RequestMapping("/mul")
public class MultiView {
@RequestMapping("/simple/{coursId}")
public String method1(@PathVariable("coursId") String coursId,ModelMap model){
Course c=new Course();
c.setId(coursId);
c.setContent("这是测试内容");
c.setName("李四");
model.put("course", c);
return "course";
}
}
复制代码
这里使用的restful服务中的uri的格式,用到了@PathVariable注解,这里方法返回的String,且没有@ResponseBody注解,在前边的返回json一文中有返回json的配置,需要@ResponseBody注解,详细的可以参看前边,同时在方法参数中有ModelMap,为什么这里要返回一个字符串呢,目的是为了统一,我们知道如果要返回到jsp视图,那么这里要返回的一个代表逻辑视图名的字符串,为了使三种方式统一,这里返回的是字符串,如果不返回到jsp也可以返回一个实际的对象。
下面看测试结果,
请求:http://localhost:8081/springmvc/mul/simple2/1212.json
请求:http://localhost:8081/springmvc/mul/simple2/1212.xml
请求:http://localhost:8081/springmvc/mul/simple2/1212
最后一个jsp的视图,本来是要在jsp页面中输出内容的,我这里没做,只是输出了一段话。请谅解!
从上边的测试结果来看,我们分别使用了三种不同的请求方式去请求同一个资源,返回了各自的形式,这种方式很适合用在不同的系统调用同一个系统时,可能别的系统处理数据的方式不一样,我们使用上边的配置可以实现一套代码,返回不同的形式。
最后
在配置默认的jsp解析器的时候也可以照下面的配置方式,
复制代码
<!--springmvc中根据后缀不同返回不同格式的配置
如,XXX.json 返回json格式
XXX.xml 返回xml格式
xxx 返回jsp
-->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<!--这里是解析器的执行顺序,如果有多个的话,配置的数值越小,则越早执行-->
<property name="order" value="1" />
<!--
这里是是否启用扩展名支持,默认就是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>
<!--
这里是扩展名到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>
<!--视图解析器-->
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>
</list>
</property>
<!--视图-->
<property name="defaultViews">
<list>
<!--json视图-->
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean>
<!--xml视图-->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView"
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.cn.my.entity.Course</value>
<value>com.cn.my.entity.CourseList</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
</list>
</property>
</bean>
restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式。
描述资源的三种形式
一、使用扩展名
http://localhost:8080/test/user.xml 以xml格式呈现
http://localhost:8080/test/user.json 以json格式呈现
http://localhost:8080/test/user 以默认视图呈现,如jsp
二、使用http request header的Accept
GET /user HTTP/1.1
Accept:application/xml 请求时设置返回形式是xml,如使用ajax请求,则需要设置contentType:application/xml
GET /user HTTP/1.1
Accept:application/json 请求时设置返回形式是json,如使用ajax请求,则需要设置contentType:application/json
三、使用参数
http://localhost:8080/test/user?format=json
http://localhost:8080/test/user?format=xml
上面了解了同一种资源的三种呈现方式,即json、xml、jsp,那么我们要如何使用ContentNegotiatingViewResolver类配置,使客户端请求的方式不同,返回同一种资源的三种方式呢?
ContentNegotiatingViewResolver配置
ContentNegotiatingViewResolver是视图解析器,我们在使用jsp这个视图的时候也配置了一个视图解析器InternalResourceViewResolver,他们都是视图解析器,后者着重在配置一个默认的视图解析即jsp;ContentNegotiatingViewResolver本身不会解析,他会分配其他的viewResolver去解析,并选择一个看起来像是客户端请求需要返回的一种 View 返回。
下面是ContentNegotiatingViewResolver的具体配置
复制代码
<!--springmvc中根据后缀不同返回不同格式的配置
如,XXX.json 返回json格式
XXX.xml 返回xml格式
xxx 返回jsp
-->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<!--这里是解析器的执行顺序,如果有多个的话,配置的数值越小,则越早执行-->
<property name="order" value="1" />
<!--
这里是是否启用扩展名支持,默认就是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>
<!--
这里是扩展名到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>
<!--视图-->
<property name="defaultViews">
<list>
<!--json视图-->
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean>
<!--xml视图-->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView"
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.cn.my.entity.Course</value>
<value>com.cn.my.entity.CourseList</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
</list>
</property>
</bean>
复制代码
order:如果存在多个viewResolver则order值小的被使用,如果没有合适的viewResolver则会使用另外的;
favorPathExtension:是否支持扩展名,默认为true(支持),扩展名指的xxx.json、xxx.xml等形式
favorParameter:是否启用参数支持,默认为true(支持),即xxx?format=json、xxx?format=xml等形式,这里的参数名默认为format,可以通过配置改变。
ignoreAcceptHeader:是否忽略accept header,默认是false(不忽略),即请求时指定的contentType:application/json等,由于我这里要使用扩展名的形式返回,所以把另外两项都关闭了,可视不同情况,使用不同设置;
mediaTypes:配置扩展名到mimeType的映射,这里配置了json和xml的映射;
defaultViews:配置视图,这里配置了json和xml的视图,json使用的jackson;
最后,我还配置一个另外一个视图解析器,InternalResourceViewResolver,
复制代码
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="order" value="2" />
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>
复制代码
这是jsp的视图解析器,order属性配置为了2,在无法匹配到json、xml的情况下,会返回jsp的视图。
下面是controller的方法
复制代码
package com.cn.my.controllor;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import com.cn.my.entity.Course;
import com.cn.my.entity.CourseList;
@Controller
@RequestMapping("/mul")
public class MultiView {
@RequestMapping("/simple/{coursId}")
public String method1(@PathVariable("coursId") String coursId,ModelMap model){
Course c=new Course();
c.setId(coursId);
c.setContent("这是测试内容");
c.setName("李四");
model.put("course", c);
return "course";
}
}
复制代码
这里使用的restful服务中的uri的格式,用到了@PathVariable注解,这里方法返回的String,且没有@ResponseBody注解,在前边的返回json一文中有返回json的配置,需要@ResponseBody注解,详细的可以参看前边,同时在方法参数中有ModelMap,为什么这里要返回一个字符串呢,目的是为了统一,我们知道如果要返回到jsp视图,那么这里要返回的一个代表逻辑视图名的字符串,为了使三种方式统一,这里返回的是字符串,如果不返回到jsp也可以返回一个实际的对象。
下面看测试结果,
请求:http://localhost:8081/springmvc/mul/simple2/1212.json
请求:http://localhost:8081/springmvc/mul/simple2/1212.xml
请求:http://localhost:8081/springmvc/mul/simple2/1212
最后一个jsp的视图,本来是要在jsp页面中输出内容的,我这里没做,只是输出了一段话。请谅解!
从上边的测试结果来看,我们分别使用了三种不同的请求方式去请求同一个资源,返回了各自的形式,这种方式很适合用在不同的系统调用同一个系统时,可能别的系统处理数据的方式不一样,我们使用上边的配置可以实现一套代码,返回不同的形式。
最后
在配置默认的jsp解析器的时候也可以照下面的配置方式,
复制代码
<!--springmvc中根据后缀不同返回不同格式的配置
如,XXX.json 返回json格式
XXX.xml 返回xml格式
xxx 返回jsp
-->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<!--这里是解析器的执行顺序,如果有多个的话,配置的数值越小,则越早执行-->
<property name="order" value="1" />
<!--
这里是是否启用扩展名支持,默认就是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>
<!--
这里是扩展名到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>
<!--视图解析器-->
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>
</list>
</property>
<!--视图-->
<property name="defaultViews">
<list>
<!--json视图-->
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean>
<!--xml视图-->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView"
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.cn.my.entity.Course</value>
<value>com.cn.my.entity.CourseList</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
</list>
</property>
</bean>
发表评论
-
SpringMVC+ajaxFileUpload上传图片 IE浏览器弹下载框问题解决方案
2017-05-08 08:42 286SpringMVC+ajaxFileUpload上传图片 IE ... -
简单webservice(cxf)实例
2017-04-11 08:56 347我们的环境是eclipse , maven。 在开发java ... -
网站架构之架构演化
2017-03-30 13:50 296http://www.cnblogs.com/pflee/p/ ... -
线程,
2017-03-10 09:07 271http://www.cnblogs.com/wxd0108/ ... -
<context-param>与<init-param>的区别与作用(转载)
2017-02-28 13:45 360<context-param>的作用: web.x ... -
sqlserver日期格式化函数
2016-09-21 10:16 428Sql Server 中一个非常强大的日期格式化函数 ... -
http://blog.csdn.net/zuoluoboy/article/details/19766131(转载)
2016-07-12 10:04 854Spring工作流程描述 ... -
玩转cookie(转载度娘http://jingyan.baidu.com/article/7c6fb4281f4e5580642c90d0.html)
2015-11-09 10:53 706怎么在java中增加一个cookie; 怎么在java中修改 ... -
jquery插件开发(http://www.poluoluo.com/jzxy/201204/163035.html)
2015-01-25 21:40 496一.介绍 插件编写的目 ... -
hibernate各种查询汇总(转载)
2014-12-23 15:16 3331. 查询整个映射对象所有字段 Java代码 // ... -
hibernate各种查询汇总(转载)
2014-12-23 15:16 01. 查询整个映射对象所有字段 Java代码 // ... -
JAVA多线程实现和应用总结(转载自http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.)
2014-12-22 15:27 474JAVA多线程实现和应用总 ... -
ResultSet rs 之 rs.next()(转载自百度一哥们)
2014-12-16 15:10 756ResultSet rs是结果集。查询出的记录是一个列表,初始 ... -
ResultSet rs 之 rs.next()
2014-12-16 15:10 803ResultSet rs是结果集。查询出的记录是一个列表,初始 ... -
java substring
2014-12-15 17:12 495java substring 方法 str=str.subst ... -
PLSQL插入数据中文乱码的问题(转)
2014-11-26 16:33 3893PLSQL插入数据中文乱码的问题 www.111cn.net ... -
遍历Map的四种方法 (转载)
2014-11-25 10:21 370public static void main(String[ ... -
sql执行顺序
2014-10-08 09:57 271SQL Select语句完整的执行顺序:1、from子句组装来 ... -
jms简明学习教程(转载)
2014-09-04 15:55 416基础篇 JMS是应用系统或组件之间相互通信的应用程序接口,利 ... -
MYSQL数据库事务处理和锁机制(转载)
2014-09-03 14:37 764一、数据库事务的百科 数据库事务(Database Tran ...
相关推荐
该资源为SpringMVC中json转换所需要的Maven仓库,如果maven下载包的时候速度太慢,可以使用我的这个资源,把这个直接考到本地Maven仓库即可。 对应的Maven依赖如下: <dependency> <groupId>org.codehaus.jackson</...
<artifactId>swagger-springmvc</artifactId> <version>1.0.2</version> </dependency> <!--jackson依赖--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-...
SpringMVC入门->网站的初级框架 输入URL:localhost:8080/ws/web/login
<body> <form action="${pageContext.request.contextPath}/my/login" method="post"> <div>${message }</div> 邮箱:<input type="text" name="name"> <br> 密码: <input type="password" name="pwd"> ...
一、准备校验时使用的JARvalidation-api-1.1.0.Final.jar:JDK的接口;hibernate-validator-5.2.4.Final.jar是对上述接口的实现;或者在Maven中添加依赖:1.<dependency> 2. <groupId>org.hibernate</groupId> 3. ...
第一个Spring-SpringMVC-Mybatis项目记录 基本功能点有: 分页 数据校验jquery初步验证+ JSR303初步验证 阿贾克斯 Rest风格的URI,即使用HTTP协议请求方式的动词,来表示对资源的操作 技术点: 基础框架-ssm...
详细的介绍了SpringMVC中文件的上传和下载
SpringMVC是一个项目团队非常喜欢的框架。 本工程主要是一个练手,里面对web.xml和applicationContext-base.xml有一个详细的说明。 <servlet> <servlet-name>Dispatcher</servlet-name> <servlet-class>org....
这是一个 springmvc + mybatis + jdbc 的基础项目 这里使用了 jackson-databind 包, spring-mvc转json的包 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</...
SpringMVC-Freemarker_Sitemesh3例子, maven构建。
枪支V2.5 新版Guns基于SpringBoot... < artifactId>mapper-spring-boot-starter</ artifactId> < version>${mapper-starter.version}</ version> </ dependency> < dependency> < groupId>com.github.pagehelper</
SpringMVC访问静态资源SpringMVC访问静态资源SpringMVC访问静态资源
17 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 18 </listener> 19 20 <filter> 21 <filter-name>encodingFilter</filter-name> 22 <filter-class>org.spring...
spring配置(xml配置或javabean方式配置任选一种) 微信小程序: 1. 书写连接 java后台 1.添加maven依赖 <!-- websocket --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-...
本篇文章主要介绍了防止SpringMVC拦截器拦截js等静态资源文件的解决方法,具有一定的参考价值,有兴趣的同学可以了解一下
SpringMVC---->自我实现底层机制(吃透springMVC)配套代码 SpringMVC---->自我实现底层机制(吃透springMVC)配套代码 SpringMVC---->自我实现底层机制(吃透springMVC)配套代码 SpringMVC---->自我实现底层机制...
----linux类系统需要修改mysql的配置文件,改为数据库表名不区分大小写(lower_case_table_names=1) <br /> 环境要求 ------------ 1.jdk要求1.7及以上;<br /> 2.tomcat6或tomcat7; <br /> 3.eclipse版本4.4以上...
前台<pre><ul id="ttt" checkbox="true"></ul></pre>,js代码:<pre>function treeload(){ //树加载 $("#ttt").tree({ url:"tree_data2.do", });...}</pre>,通过调用Springmvc从后台返回tree
idea+maven环境下整合activiti到基于springMVC架构的业务系统
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。 SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring...