Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable(转)

最近需要做些接口服务,服务协议定为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 

  • @RequestBody 将HTTP请求正文转换为适合的HttpMessageConverter对象。

  • @ResponseBody 将内容或对象作为 HTTP
    响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流。

HttpMessageConverter接口,需要开启<mvc:annotation-driven 
/>
。 
AnnotationMethodHandlerAdapter将会初始化7个转换器,可以通过调用AnnotationMethodHandlerAdaptergetMessageConverts()方法来获取转换器的一个集合
List<HttpMessageConverter>

引用

ByteArrayHttpMessageConverter 
StringHttpMessageConverter 
ResourceHttpMessageConverter 
SourceHttpMessageConverter 
XmlAwareFormHttpMessageConverter 
Jaxb2RootElementHttpMessageConverter 
MappingJacksonHttpMessageConverter

可以理解为,只要有对应协议的解析器,你就可以通过几行配置,几个注解完成协议——对象的转换工作! 

PS:Spring默认的json协议解析由Jackson完成。 

二、servlet.xml配置 

Spring的配置文件,简洁到了极致,对于当前这个需求只需要三行核心配置:

Xml代码  

  1. <context:component-scan base-package="org.zlex.json.controller" />

  2. <context:annotation-config />

  3. <mvc:annotation-driven />


三、pom.xml配置 

闲言少叙,先说依赖配置,这里以Json+Spring为参考: 
pom.xml

Xml代码  

  1. <dependency>

  2. <groupId>org.springframework</groupId>

  3. <artifactId>spring-webmvc</artifactId>

  4. <version>3.1.2.RELEASE</version>

  5. <type>jar</type>

  6. <scope>compile</scope>

  7. </dependency>

  8. <dependency>

  9. <groupId>org.codehaus.jackson</groupId>

  10. <artifactId>jackson-mapper-asl</artifactId>

  11. <version>1.9.8</version>

  12. <type>jar</type>

  13. <scope>compile</scope>

  14. </dependency>

  15. <dependency>

  16. <groupId>log4j</groupId>

  17. <artifactId>log4j</artifactId>

  18. <version>1.2.17</version>

  19. <scope>compile</scope>

  20. </dependency>


主要需要spring-webmvcjackson-mapper-asl两个包,其余依赖包Maven会帮你完成。至于log4j,我还是需要看日志嘛。 
包依赖图: 

至于版本,看项目需要吧! 

四、代码实现 

域对象:

Java代码  

  1. public class Person implements Serializable {
  2. private int id;

  3. private String name;

  4. private boolean status;
  5. public Person() {

  6. // do nothing

  7. }

  8. }


这里需要一个空构造,由Spring转换对象时,进行初始化。 

@ResponseBody,@RequestBody,@PathVariable 
控制器:

Java代码  

  1. @Controller

  2. public class PersonController {
  3. /**

  4. * 查询个人信息

  5. *

  6. * @param id

  7. * @return

  8. */

  9. @RequestMapping(value = "/person/profile/{id}/{name}/{status}", method = RequestMethod.GET)

  10. public @ResponseBody

  11. Person porfile(@PathVariable int id, @PathVariable String name,

  12. @PathVariable boolean status) {

  13. return new Person(id, name, status);

  14. }
  15. /**

  16. * 登录

  17. *

  18. * @param person

  19. * @return

  20. */

  21. @RequestMapping(value = "/person/login", method = RequestMethod.POST)

  22. public @ResponseBody

  23. Person login(@RequestBody Person person) {

  24. return person;

  25. }

  26. }


备注:@RequestMapping(value
= "/person/profile/{id}/{name}/{status}", method =
RequestMethod.GET)
中的{id}/{name}/{status}@PathVariable
int id, @PathVariable String name,@PathVariable boolean
status
一一对应,按名匹配。 这是restful式风格。 
如果映射名称有所不一,可以参考如下方式:

Java代码  

  1. @RequestMapping(value = "/person/profile/{id}", method = RequestMethod.GET)

  2. public @ResponseBody

  3. Person porfile(@PathVariable("id") int uid) {

  4. return new Person(uid, name, status);

  5. }


  • GET模式下,这里使用了@PathVariable绑定输入参数,非常适合Restful风格。因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险。

  • POST模式下,使用@RequestBody绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。

  • @ResponseBody可以标注任何对象,由Srping完成对象——协议的转换。


做个页面测试下: 
JS

Js代码  

  1. $(document).ready(function() {

  2. $("#profile").click(function() {

  3. profile();

  4. });

  5. $("#login").click(function() {

  6. login();

  7. });

  8. });

  9. function profile() {

  10. var url = ‘http://localhost:8080/spring-json/json/person/profile/‘;

  11. var query = $(‘#id‘).val() + ‘/‘ + $(‘#name‘).val() + ‘/‘

  12. + $(‘#status‘).val();

  13. url += query;

  14. alert(url);

  15. $.get(url, function(data) {

  16. alert("id: " + data.id + "\nname: " + data.name + "\nstatus: "

  17. + data.status);

  18. });

  19. }

  20. function login() {

  21. var mydata = ‘{"name":"‘ + $(‘#name‘).val() + ‘","id":"‘

  22. + $(‘#id‘).val() + ‘","status":"‘ + $(‘#status‘).val() + ‘"}‘;

  23. alert(mydata);

  24. $.ajax({

  25. type : ‘POST‘,

  26. contentType : ‘application/json‘,

  27. url : ‘http://localhost:8080/spring-json/json/person/login‘,

  28. processData : false,

  29. dataType : ‘json‘,

  30. data : mydata,

  31. success : function(data) {

  32. alert("id: " + data.id + "\nname: " + data.name + "\nstatus: "

  33. + data.status);

  34. },

  35. error : function() {

  36. alert(‘Err...‘);

  37. }

  38. });


Table

Html代码  

  1. <table>

  2. <tr>

  3. <td>id</td>

  4. <td><input id="id" value="100" /></td>

  5. </tr>

  6. <tr>

  7. <td>name</td>

  8. <td><input id="name" value="snowolf" /></td>

  9. </tr>

  10. <tr>

  11. <td>status</td>

  12. <td><input id="status" value="true" /></td>

  13. </tr>

  14. <tr>

  15. <td><input type="button" id="profile" value="Profile——GET" /></td>

  16. <td><input type="button" id="login" value="Login——POST" /></td>

  17. </tr>

  18. </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

直接用$.post()直接请求会有点小问题,尽管我标识为json协议,但实际上提交的ContentType还是application/x-www-form-urlencoded。需要使用$.ajaxSetup()标示下ContentType

Js代码  

  1. function login() {

  2. var mydata = ‘{"name":"‘ + $(‘#name‘).val() + ‘","id":"‘

  3. + $(‘#id‘).val() + ‘","status":"‘ + $(‘#status‘).val() + ‘"}‘;

  4. alert(mydata);

  5. $.ajaxSetup({

  6. contentType : ‘application/json‘

  7. });

  8. $.post(‘http://localhost:8080/spring-json/json/person/login‘, mydata,

  9. function(data) {

  10. alert("id: " + data.id + "\nname: " + data.name

  11. + "\nstatus: " + data.status);

  12. }, ‘json‘);

  13. };


效果是一样! 

详见附件! 

相关参考: 
Spring 注解学习手札(一)
构建简单Web应用
 
Spring
注解学习手札(二) 控制层梳理
 
Spring 注解学习手札(三) 表单页面处理 
Spring 注解学习手札(四) 持久层浅析 
Spring 注解学习手札(五) 业务层事务处理 
Spring 注解学习手札(六) 测试 
Spring 注解学习手札(七)
补遗——@ResponseBody,@RequestBody,@PathVariable
 
Spring 注解学习手札(八)
补遗——@ExceptionHandler
 



Spring 注解学习手札(七)
补遗——@ResponseBody,@RequestBody,@PathVariable(转),布布扣,bubuko.com

Spring 注解学习手札(七)
补遗——@ResponseBody,@RequestBody,@PathVariable(转)

时间: 2024-10-07 06:09:53

Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable(转)的相关文章

转-Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable

转-http://snowolf.iteye.com/blog/1628861/ Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable 博客分类: Spring spring@ResponseBody@RequestBody@PathVariableHttpMessageConverter 最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍

Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable (转)

最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一) 构建简单Web应用 Spring 注解学习手札(二) 控制层梳理 Spring 注解学习手札(三) 表单页面处理 Spring 注解学习手札(四) 持久层浅析 Spring 注解学习手札(五) 业务层事务处理 Spring 注解学习手札(六) 测试 Spring 注解学习手札(七) 补遗——@R

Spring 注解学习笔记

声明Bean的注解: @Component : 组件,没有明确的角色 @Service : 在业务逻辑层(service层)使用 @Repository : 在数据访问层(dao层)使用. @Controller : 在展现层(MVC--SpringMVC)使用 注入Bean的注解: @Aautowired : Spring提供的注解. @Inject : JSR-330提供的注解 @Resource : JSR-250提供的注解 配置文件的注解: @Configuration : 声明当前类是

Spring注解学习

@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理. 下面写这个是引入component的扫描组件 <context:component-scan base-package=”com.mmnc”>     其中base-package为需要扫描的包(含所有子包)        1.@Service用于标注业务层组件        2.@Controller用于标注控制层组件(如struts中的action)  

Spring注解驱动开发(七)-----servlet3.0、springmvc

ServletContainerInitializer Shared libraries(共享库) / runtimes pluggability(运行时插件能力) 1.Servlet容器启动会扫描,当前应用里面每一个jar包的 ServletContainerInitializer的实现2.提供ServletContainerInitializer的实现类: 必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer 文件

spring框架学习(七)spring管理事务方式之xml配置

1.DAO AccountDao.java package cn.mf.dao; public interface AccountDao { //加钱 void increaseMoney(Integer id,Double money); //减钱 void decreaseMoney(Integer id,Double money); } AccountDaoImpl.java package cn.mf.dao; import org.springframework.jdbc.core.s

Spring.Net学习笔记七(集合类型的注入)

Spring.NET还支持集合类型的注入.而且使用起来也比较方便. 一.ILIst类型 使用<list>元素作为ILIst的标签,value为集合中元素的值.也可以注入对象,甚至关联其它对象,使用 <ref/>元素表示关联的对象,object 属性为所关联对象的id或name.集合可以为空,用<null/>元素来标记. 在<list>元素中设置 element-type 属性表示泛型T的类型,例如 element-type="int"  

8、spring注解学习(bean的生命周期)——让Bean实现InitializingBean,DisposableBean这两个接口进而实现初始和销毁方法

1.创建Tiger类实现InitializingBean,DisposableBean接口,并通过@Component将该组件注入 @Component public class Tiger implements InitializingBean,DisposableBean{ public Tiger() { System.out.println("Tiger的构造方法执行了..."); } /** * 此方法就是在调用构造方法之后属性都赋完值就执行 */ @Override pub

Spring 注解 @ExceptionHandler

Spring 注解学习手札(一) 构建简略Web使用 Spring 注解学习手札(二) 操控层整理 Spring 注解学习手札(三) 表单页面处置 Spring 注解学习手札(四) 持久层分析 Spring 注解学习手札(五) 事务层事务处置 Spring 注解学习手札(六) 测验 Spring 注解学习手札(七) 补遗--@ResponseBody,@RequestBody,@PathVariable Spring 注解学习手札(八) 补遗--@ExceptionHandler 直接上代码: