`
wxyfighting
  • 浏览: 200898 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
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-scanbase-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. publicclassPersonimplementsSerializable{
  2. privateintid;
  3. privateStringname;
  4. privatebooleanstatus;
  5. publicPerson(){
  6. //donothing
  7. }
  8. }


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

@ResponseBody,@RequestBody,@PathVariable
控制器:
Java代码收藏代码
  1. @Controller
  2. publicclassPersonController{
  3. /**
  4. *查询个人信息
  5. *
  6. *@paramid
  7. *@return
  8. */
  9. @RequestMapping(value="/person/profile/{id}/{name}/{status}",method=RequestMethod.GET)
  10. public@ResponseBody
  11. Personporfile(@PathVariableintid,@PathVariableStringname,
  12. @PathVariablebooleanstatus){
  13. returnnewPerson(id,name,status);
  14. }
  15. /**
  16. *登录
  17. *
  18. *@paramperson
  19. *@return
  20. */
  21. @RequestMapping(value="/person/login",method=RequestMethod.POST)
  22. public@ResponseBody
  23. Personlogin(@RequestBodyPersonperson){
  24. returnperson;
  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. Personporfile(@PathVariable("id")intuid){
  4. returnnewPerson(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. functionprofile(){
  10. varurl='http://localhost:8080/spring-json/json/person/profile/';
  11. varquery=$('#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. functionlogin(){
  21. varmydata='{"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><inputid="id"value="100"/></td>
  5. </tr>
  6. <tr>
  7. <td>name</td>
  8. <td><inputid="name"value="snowolf"/></td>
  9. </tr>
  10. <tr>
  11. <td>status</td>
  12. <td><inputid="status"value="true"/></td>
  13. </tr>
  14. <tr>
  15. <td><inputtype="button"id="profile"value="Profile——GET"/></td>
  16. <td><inputtype="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. functionlogin(){
  2. varmydata='{"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 注解学习手札(二) 控制层梳理

    这篇“Spring注解学习手札(二)控制层梳理”主要聚焦于如何利用注解来构建和理解Spring MVC的控制层,即Controller。Spring MVC是Spring框架的一部分,专门用于处理Web应用程序的请求和响应。 一、@RestController...

    Spring 注解学习手札(一) 构建简单Web应用

    在本篇《Spring注解学习手札(一)构建简单Web应用》中,我们将深入探讨如何使用Spring框架的注解来构建一个基本的Web应用程序。Spring框架是Java开发中的核心工具,尤其在企业级应用中广泛应用。它简化了依赖注入、...

    Spring 注解学习手札

    【Spring注解学习手札】 在现代Java Web开发中,Spring框架因其强大的功能和灵活性而备受推崇。Spring注解的引入极大地简化了配置文件,提高了开发效率。本篇将聚焦于Spring MVC中的注解,通过构建一个简单的Web...

    Spring 注解学习手札(四) 持久层浅析

    在本篇《Spring注解学习手札(四)持久层浅析》中,我们将深入探讨Spring框架在持久层的应用,特别是如何通过注解简化数据库操作。Spring作为一个强大的轻量级框架,提供了丰富的功能来处理数据访问,使得开发者可以...

    Spring 注解学习手札(三) 表单页面处理

    在本篇《Spring注解学习手札(三)表单页面处理》中,我们将深入探讨Spring框架中关于处理Web表单的关键注解和技术。在实际的Web开发中,表单处理是用户交互的重要组成部分,Spring提供了强大的支持,使得开发者能够...

    Spring 注解学习手札(六) 测试

    在本篇《Spring注解学习手札(六)——测试》中,我们将深入探讨Spring框架中的测试支持,尤其是如何利用注解进行单元测试和集成测试。Spring为开发者提供了丰富的注解,使得测试代码更加简洁、易读且易于维护。本文...

    Spring 注解学习手札(五) 业务层事务处理

    这篇“Spring注解学习手札(五)——业务层事务处理”深入探讨了如何使用注解来管理应用程序中的事务,确保数据的一致性和完整性。Spring提供了声明式事务管理,使得开发者无需编写繁琐的事务控制代码,只需在方法上...

    Perl_学习手札

    这份"Perl学习手札"是为那些想要深入理解Perl语言特性和应用的初学者或有一定经验的开发者准备的宝贵资源。 首先,Perl的核心特性在于其灵活性和表达力。Perl语法受到了C、sed、awk等多种语言的影响,这使得它在...

    spring 的详细使用

    - "spring-reference.pdf" 和 "Spring注解手札.pdf" 可能是详细的 Spring 参考文档和注解指南,对于深入学习 Spring 极为有用。 以上内容只是 Spring 框架的冰山一角,想要精通 Spring,还需要通过阅读文档、实践...

    perl学习手札中文

    "Perl学习手札中文"是一份专为初学者设计的学习资料,旨在帮助读者快速掌握Perl语言的基础和高级特性。以下是对这些文件内容的概览: 1. **word.css**: 这个文件可能是样式表,用于定义文档中的排版和格式。在学习...

    perl学习手札(简体中文)_简信昌

    关于作者: 简信昌 “傲尔网”专案经理 博仲法律事务所资讯部门 台北Perl推广组 (Taipei.pm) 召集人 Newzilla召集人 目前专案: Open Source Foundry (OSSF) Newzilla 线上杂志 ...“Perl学习手札”

    Perl学习手札.chm

    Perl学习手札.chmPerl学习手札.chmPerl学习手札.chm

    hibernate学习手札.z03

    hibernate学习手札.z03

    hibernate学习手札.z01

    hibernate学习手札.z01

    Perl 学习手札.pdf

    ### Perl学习手札知识点概述 #### 1. 关于Perl - **1.1 Perl的历史**:Perl由Larry Wall在1987年创建,旨在为文本处理提供一种更强大的工具。随着时间的发展,Perl逐渐成为了脚本编程领域的领导者之一。 - **1.2 ...

    高级Perl编程(黑豹书)+学习手札

    "高级Perl编程(黑豹书)"和"Perl_学习手札"这两本书籍是深入理解并掌握Perl编程的重要资源。 《高级Perl编程》(黑豹书)是Perl编程领域的经典之作,它不仅适合初学者作为进阶读物,也对有经验的Perl程序员提供了...

    Perl 学习手札

    通过深入学习“Perl学习手札”,你可以系统地掌握这些概念,并逐步成长为一个熟练的Perl程序员。记住,实践是检验知识的最好方式,所以不仅要理解理论,还要动手编写代码,解决实际问题。祝你在Perl的学习之旅中取得...

Global site tag (gtag.js) - Google Analytics