- 浏览: 4382688 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (163)
- 职场 && 心情 (22)
- Java/Basic (17)
- Java/Compression (7)
- Java/Security (20)
- Java/Maven (3)
- Java/Cache (11)
- Eclipse (4)
- Spring (19)
- ORM/Hibernate (2)
- ORM/iBatis (3)
- DB/NoSQL (11)
- DB/MySQL (7)
- DB/MS SQL Server (4)
- OS/Linux (11)
- OS/Mac (7)
- C/C++ (4)
- Server Architecture/Basic (13)
- Server Architecture/Distributed (17)
- Moblie/Andriod (2)
- WebService (3)
- Objective-C (1)
- Html (1)
- 设计模式 (1)
- Scala (0)
- Kafka (1)
最新评论
-
w47_csdn:
证书安装:在"浏览"选项中选择" ...
Java加密技术(九)——初探SSL -
w47_csdn:
spiritfrog 写道你好,我按照你的步骤,tomcat中 ...
Java加密技术(九)——初探SSL -
liuyachao111:
11楼说的对 用@ControllerAdvicepublic ...
Spring 注解学习手札(八)补遗——@ExceptionHandler -
irayslu:
作者你好, 我把你的源码放在jdk6, jdk7 中运行正常, ...
Java加密技术(五)——非对称加密算法的由来DH -
夏季浅忆-卖小子:
为什么不能解压rar格式的压缩包呢
Java压缩技术(三) ZIP解压缩——Java原生实现
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
- 博客分类:
- Spring
最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服!
相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler
SpringMVC层跟JSon结合,几乎不需要做什么配置,代码实现也相当简洁。再也不用为了组装协议而劳烦辛苦了!
一、Spring注解@ResponseBody,@RequestBody和HttpMessageConverter
Spring 3.X系列增加了新注解@ResponseBody,@RequestBody
HttpMessageConverter接口,需要开启<mvc:annotation-driven />。
AnnotationMethodHandlerAdapter将会初始化7个转换器,可以通过调用AnnotationMethodHandlerAdapter的getMessageConverts()方法来获取转换器的一个集合 List<HttpMessageConverter>
可以理解为,只要有对应协议的解析器,你就可以通过几行配置,几个注解完成协议——对象的转换工作!
PS:Spring默认的json协议解析由Jackson完成。
二、servlet.xml配置
Spring的配置文件,简洁到了极致,对于当前这个需求只需要三行核心配置:
三、pom.xml配置
闲言少叙,先说依赖配置,这里以Json+Spring为参考:
pom.xml
主要需要spring-webmvc、jackson-mapper-asl两个包,其余依赖包Maven会帮你完成。至于log4j,我还是需要看日志嘛。
包依赖图:
至于版本,看项目需要吧!
四、代码实现
域对象:
这里需要一个空构造,由Spring转换对象时,进行初始化。
@ResponseBody,@RequestBody,@PathVariable
控制器:
备注:@RequestMapping(value = "/person/profile/{id}/{name}/{status}", method = RequestMethod.GET)中的{id}/{name}/{status}与@PathVariable int id, @PathVariable String name,@PathVariable boolean status一一对应,按名匹配。 这是restful式风格。
如果映射名称有所不一,可以参考如下方式:
做个页面测试下:
JS
Table
四、简单测试
Get方式测试:
Post方式测试:
五、常见错误
POST操作时,我用$.post()方式,屡次失败,一直报各种异常:
直接用$.post()直接请求会有点小问题,尽管我标识为json协议,但实际上提交的ContentType还是application/x-www-form-urlencoded。需要使用$.ajaxSetup()标示下ContentType。
效果是一样!
详见附件!
相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler
相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler
SpringMVC层跟JSon结合,几乎不需要做什么配置,代码实现也相当简洁。再也不用为了组装协议而劳烦辛苦了!
一、Spring注解@ResponseBody,@RequestBody和HttpMessageConverter
Spring 3.X系列增加了新注解@ResponseBody,@RequestBody
- @RequestBody 将HTTP请求正文转换为适合的HttpMessageConverter对象。
- @ResponseBody 将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流。
HttpMessageConverter接口,需要开启<mvc:annotation-driven />。
AnnotationMethodHandlerAdapter将会初始化7个转换器,可以通过调用AnnotationMethodHandlerAdapter的getMessageConverts()方法来获取转换器的一个集合 List<HttpMessageConverter>
引用
ByteArrayHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
SourceHttpMessageConverter
XmlAwareFormHttpMessageConverter
Jaxb2RootElementHttpMessageConverter
MappingJacksonHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
SourceHttpMessageConverter
XmlAwareFormHttpMessageConverter
Jaxb2RootElementHttpMessageConverter
MappingJacksonHttpMessageConverter
可以理解为,只要有对应协议的解析器,你就可以通过几行配置,几个注解完成协议——对象的转换工作!
PS:Spring默认的json协议解析由Jackson完成。
二、servlet.xml配置
Spring的配置文件,简洁到了极致,对于当前这个需求只需要三行核心配置:
<context:component-scan base-package="org.zlex.json.controller" /> <context:annotation-config /> <mvc:annotation-driven />
三、pom.xml配置
闲言少叙,先说依赖配置,这里以Json+Spring为参考:
pom.xml
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.1.2.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.8</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>compile</scope> </dependency>
主要需要spring-webmvc、jackson-mapper-asl两个包,其余依赖包Maven会帮你完成。至于log4j,我还是需要看日志嘛。
包依赖图:
至于版本,看项目需要吧!
四、代码实现
域对象:
public class Person implements Serializable { private int id; private String name; private boolean status; public Person() { // do nothing } }
这里需要一个空构造,由Spring转换对象时,进行初始化。
@ResponseBody,@RequestBody,@PathVariable
控制器:
@Controller public class PersonController { /** * 查询个人信息 * * @param id * @return */ @RequestMapping(value = "/person/profile/{id}/{name}/{status}", method = RequestMethod.GET) public @ResponseBody Person porfile(@PathVariable int id, @PathVariable String name, @PathVariable boolean status) { return new Person(id, name, status); } /** * 登录 * * @param person * @return */ @RequestMapping(value = "/person/login", method = RequestMethod.POST) public @ResponseBody Person login(@RequestBody Person person) { return person; } }
备注:@RequestMapping(value = "/person/profile/{id}/{name}/{status}", method = RequestMethod.GET)中的{id}/{name}/{status}与@PathVariable int id, @PathVariable String name,@PathVariable boolean status一一对应,按名匹配。 这是restful式风格。
如果映射名称有所不一,可以参考如下方式:
@RequestMapping(value = "/person/profile/{id}", method = RequestMethod.GET) public @ResponseBody Person porfile(@PathVariable("id") int uid) { return new Person(uid, name, status); }
- GET模式下,这里使用了@PathVariable绑定输入参数,非常适合Restful风格。因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险。
- POST模式下,使用@RequestBody绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。
- @ResponseBody可以标注任何对象,由Srping完成对象——协议的转换。
做个页面测试下:
JS
$(document).ready(function() { $("#profile").click(function() { profile(); }); $("#login").click(function() { login(); }); }); function profile() { var url = 'http://localhost:8080/spring-json/json/person/profile/'; var query = $('#id').val() + '/' + $('#name').val() + '/' + $('#status').val(); url += query; alert(url); $.get(url, function(data) { alert("id: " + data.id + "\nname: " + data.name + "\nstatus: " + data.status); }); } function login() { var mydata = '{"name":"' + $('#name').val() + '","id":"' + $('#id').val() + '","status":"' + $('#status').val() + '"}'; alert(mydata); $.ajax({ type : 'POST', contentType : 'application/json', url : 'http://localhost:8080/spring-json/json/person/login', processData : false, dataType : 'json', data : mydata, success : function(data) { alert("id: " + data.id + "\nname: " + data.name + "\nstatus: " + data.status); }, error : function() { alert('Err...'); } });
Table
<table> <tr> <td>id</td> <td><input id="id" value="100" /></td> </tr> <tr> <td>name</td> <td><input id="name" value="snowolf" /></td> </tr> <tr> <td>status</td> <td><input id="status" value="true" /></td> </tr> <tr> <td><input type="button" id="profile" value="Profile——GET" /></td> <td><input type="button" id="login" value="Login——POST" /></td> </tr> </table>
四、简单测试
Get方式测试:
Post方式测试:
五、常见错误
POST操作时,我用$.post()方式,屡次失败,一直报各种异常:
引用
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
直接用$.post()直接请求会有点小问题,尽管我标识为json协议,但实际上提交的ContentType还是application/x-www-form-urlencoded。需要使用$.ajaxSetup()标示下ContentType。
function login() { var mydata = '{"name":"' + $('#name').val() + '","id":"' + $('#id').val() + '","status":"' + $('#status').val() + '"}'; alert(mydata); $.ajaxSetup({ contentType : 'application/json' }); $.post('http://localhost:8080/spring-json/json/person/login', mydata, function(data) { alert("id: " + data.id + "\nname: " + data.name + "\nstatus: " + data.status); }, 'json'); };
效果是一样!
详见附件!
相关参考:
Spring 注解学习手札(一) 构建简单Web应用
Spring 注解学习手札(二) 控制层梳理
Spring 注解学习手札(三) 表单页面处理
Spring 注解学习手札(四) 持久层浅析
Spring 注解学习手札(五) 业务层事务处理
Spring 注解学习手札(六) 测试
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
Spring 注解学习手札(八) 补遗——@ExceptionHandler
- spring-json.zip (65.1 KB)
- 下载次数: 2100
评论
25 楼
ypcheng
2016-10-25
学习啦~~
24 楼
springdata_springmvc
2015-07-28
23 楼
小样样
2015-07-22
设置字符集的话好像可以在 后面添加 contentType: "application/json; charset=utf-8",
22 楼
AllInNature
2015-07-10
不太管用啊,只能弹出第一个来,get后面弹不出来,post来了个err
21 楼
nbvghost
2015-07-01
我在配置 @RequestBody json 转java 对象时,一直是提示:
415 (Unsupported Media Type)
我的问题是:
1、
@RequestMapping(value = "mail",method = RequestMethod.POST,consumes ="")
@ResponseBody
public CompanyVO changeCompanyVO(@RequestBody CompanyVO companyVO, Model model) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("manager/mail");
return companyVO;
}
我添加了 consumes = "application/json" 在客户端没有针对这个类型进行提交。
2、 我的spring 配制。
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"/>
<entry key="xml" value="application/xml"/>
<entry key="html" value="text/html"/>
</map>
</property>
</bean>
415 (Unsupported Media Type)
我的问题是:
1、
@RequestMapping(value = "mail",method = RequestMethod.POST,consumes ="")
@ResponseBody
public CompanyVO changeCompanyVO(@RequestBody CompanyVO companyVO, Model model) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("manager/mail");
return companyVO;
}
我添加了 consumes = "application/json" 在客户端没有针对这个类型进行提交。
2、 我的spring 配制。
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"/>
<entry key="xml" value="application/xml"/>
<entry key="html" value="text/html"/>
</map>
</property>
</bean>
20 楼
redcoatjk
2015-04-22
使用自动的转换器感觉容易出错. 比如乱码. json格式问题之类的.
如果直接用Jackson 将obj->string 直接返回write 貌似比较简单直接方便.
如果直接用Jackson 将obj->string 直接返回write 貌似比较简单直接方便.
19 楼
zp6361688
2015-04-05
18 楼
shenkun58
2015-03-02
谢谢哈 啥也不说了 干
17 楼
pcaopeng
2014-10-08
HTTP Status 404 - /spring-json/json/person/login 没有出现像你那样的预期效果 只出来了
例如你 讲的 四、简单测试 Get方式测试:的第一张图片; Post方式测试:里的第一张图片 第二张图片显示
例如你 讲的 四、简单测试 Get方式测试:的第一张图片; Post方式测试:里的第一张图片 第二张图片显示
16 楼
pcaopeng
2014-10-08
HTTP Status 404 - /spring-json/json/person/profile/100222/snowolf222/true
15 楼
红色幽丿默
2014-09-16
想请教一下 如果是复合类型的类
比如 User 中有 Role 对象
我查询User 但是不并不需要 Role 但是直接返回 User 就会报错 ,因为 Role对象还是空的, 能提供下 这方面的API么。。 想过滤一个对象的某些属性。
比如 User 中有 Role 对象
我查询User 但是不并不需要 Role 但是直接返回 User 就会报错 ,因为 Role对象还是空的, 能提供下 这方面的API么。。 想过滤一个对象的某些属性。
14 楼
liu_rui_
2014-06-25
index.html中的
var mydata = '{"name":"' + $('#name').val() + '","id":"' + $('#id').val() + '","status":"' + $('#status').val() + '"}';
可以改成:
var mydata= JSON.stringify({ name: $('#name').val(), id: $('#id').val(), status: $('#status').val() });
var mydata = '{"name":"' + $('#name').val() + '","id":"' + $('#id').val() + '","status":"' + $('#status').val() + '"}';
可以改成:
var mydata= JSON.stringify({ name: $('#name').val(), id: $('#id').val(), status: $('#status').val() });
13 楼
倔强的土豆
2014-03-18
很不错的系列,谢谢lz
12 楼
baoqianglang
2014-03-05
灰常好,必须学习...
11 楼
schy_hqh
2014-02-23
10 楼
dazhou600
2013-07-02
学习学习
9 楼
carrotzizi
2013-04-20
8 楼
D.Z
2013-04-12
nice...
7 楼
zhouguoqing917
2013-03-12
6 楼
枫箫子
2013-01-22
啊 精华
发表评论
-
征服 Redis + Jedis + Spring (三)—— 列表操作
2013-03-06 16:16 83970一开始以为Spring下操 ... -
Memcached笔记——(四)应对高并发攻击
2012-09-13 09:48 28936近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意 ... -
征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)
2012-08-29 18:29 82321不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然 ... -
征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)
2012-08-29 16:30 157479有日子没写博客了,真的是忙得要疯掉。 完成项目基础架构搭建 ... -
Spring 注解学习手札(八)补遗——@ExceptionHandler
2012-08-17 18:35 84121Spring注解,改变了我的 ... -
征服 Kestrel + XMemcached + Spring TaskExecutor
2012-07-30 14:43 6207上一篇征服 Kestrel + XMemcached只是对Ke ... -
征服Spring AOP—— @AspectJ
2012-04-10 12:01 18659接N年前写的一篇Spring AOP相关的内容征服Spring ... -
Memcached笔记——(二)XMemcached&Spring集成
2012-04-01 09:55 42323今天研究Memcached的Java的Client,使用XMe ... -
Spring util
2011-02-24 12:02 01,<util:constant/> 取代了之前通 ... -
Spring HttpInvoke实现,以及效率提升!
2010-07-01 17:38 15025最近接手服务器总被人质疑效率问题,说到底是质疑Spring H ... -
Spring 注解学习手札(六) 测试
2010-02-05 16:28 53161既然系统基于注解自成一体,那么基于Spring的测试是否可以依 ... -
Spring 注解学习手札(五) 业务层事务处理
2010-02-04 16:11 25351控制器层、持久层都有 ... -
Spring 注解学习手札(四) 持久层浅析
2010-01-29 11:11 22581今天,我们玩玩数据库,搞搞持久层。不搞太复杂的东西,Sprin ... -
Spring 注解学习手札(三) 表单页面处理
2010-01-26 15:21 40483昨天小歇一天,看着两篇博客迅速飙升的点击率,十分欣慰。今天来研 ... -
Spring 注解学习手札(二) 控制层梳理
2010-01-24 15:53 36570昨天对Spring注解有了一 ... -
Spring 注解学习手札(一) 构建简单Web应用
2010-01-23 13:40 83410近来工作发生了一些变化,有必要学习一下Spring注解了! ... -
征服Spring AOP—— Schema
2008-09-03 17:41 6436自从开始使用Spring,就接触到AOP,但一直未能深入,沉淀 ... -
关于Spring中Commons Validator的使用说明
2008-09-01 09:57 8139关于Spring中Commons Validator的使用说明 ... -
acegi 我该从哪里取到用户的信息
2006-09-21 17:32 5778项目需要 用acegi做为安全屏障,按acegi 1.0.1 ...
相关推荐
Spring 注解学习手札,个人学习Spring mvc的知识总结
NULL 博文链接:https://snowolf.iteye.com/blog/577989
NULL 博文链接:https://snowolf.iteye.com/blog/583161
NULL 博文链接:https://snowolf.iteye.com/blog/578452
NULL 博文链接:https://snowolf.iteye.com/blog/580194
NULL 博文链接:https://snowolf.iteye.com/blog/588351
NULL 博文链接:https://snowolf.iteye.com/blog/587602
分享Perl_学习手札书籍,供大家学习、参考及交流perl。
perl学习手札,共同学习,共同进步。希望你能很快掌握perl。
关于作者: 简信昌 “傲尔网”专案经理 博仲法律事务所资讯部门 台北Perl推广组 (Taipei.pm) 召集人 Newzilla召集人 目前专案: Open Source Foundry (OSSF) Newzilla 线上杂志 ...“Perl学习手札”
Perl学习手札.chmPerl学习手札.chmPerl学习手札.chm
Perl 学习手札,这本书介绍了perl的基本语法及perl的一些用法,想了解perl的就看一看
hibernate学习手札.z03
hibernate学习手札.z01
Perl 学习手札,好东西
打造魅力组合——在iBook 上安装Linux手札.pdf
1-高级perl编程(黑豹书).pdf 2-Perl_学习手札.pdf
非常著名的perl学习手札(初学者有福了),本文档是精美的PDF版,排版精美,是网络上到现在为止能找到的最好的。 全书共分17个小节,通过讲解实例来学习perl,你可以复制这些代码,然后执行。学习非常方便!
8086汇编学习手札及各章节检测题详细答案。 配套书籍 王爽的汇编