前言

这次主要讲讲 消息转换:一次请求,从请求页面--后台数据处理--返回响应内容.

主要涉及以下几个部分

请求Content-Type:

 1. text/plain
 2. application/json
 3. application/xml
 4. application/x-www-form-urlencoded

 请求正文:(都可以理解为string) 

 1. 普通string
 2. json格式
 3. xml格式
Controller接收 

 1. String
 2. Bean
响应Content-Type:

 1. text/plain
 2. application/x-www-form-urlencoded
 3. application/application+xml

相关流程和转换原理,单独开一篇博文写. 

具体实例

我们讲解的项目是spring-mvc-showcase,如果你有疑问可以参考spring3-mvc的开篇。

该java文件
在包(pkg):  org.springframework.samples.mvc.messageconverters
类名为: MessageConvertersController 


 我抽取部分代码进行讲解

1.   最简单的string请求和响应

第一部分:java代码

  1. @RequestMapping(value="/string"method=RequestMethod.POST)   
  2.     public @ResponseBody String readString(@RequestBody String string) {   
  3.         return "Read string '" + string + "'";   
  4.     }  

这个方法需要注意的展开讲一下,其他大同小异

第二部分:jsp页面

html

  1. <form id="readString" class="textForm" action="<c:url value="/messageconverters/string" />method="post">   
  2.       <input id="readStringSubmit" type="submit" value="Read a String" />   
  3. </form> 

js(在js中,对submit时间做了重写)

  1. $("form.textForm").submit(function(event) {   
  2.         var form = $(this);   
  3.         var button = form.children(":first");   
  4.         $.ajax({ type: "POST", url: form.attr("action"), data: "foo", contentType: "text/plain", dataType: "text", success: function(text) { MvcUtil.showSucce***esponse(text, button); }, error: function(xhr) { MvcUtil.showErrorResponse(xhr.responseText, button); }});   
  5.         return false;   
  6.     });  
  7. 注意:js用到了jquery,所以语法,并且在jsp中做了一定的封装如MvcUtil。

第三部分: 通过jsp发起请求,查看请求信息

Magical Snap - 2012.08.31 23.09 - 001

请求正文:

Magical Snap - 2012.08.31 23.14 - 004

由于注解@RequestBody 存在,String直接被获取,返回值应为Read string 'foo'(上一篇文章我们讲过@ResponseBody )

第四部分: 效果图

Magical Snap - 2012.08.31 23.13 - 003

 2. 从请求中数据,转换成bean,作为参数传入,再以bean作为返回值

  1. @RequestMapping(value="/form"method=RequestMethod.POST)   
  2.     public @ResponseBody String readForm(@ModelAttribute JavaBean bean) {   
  3.         return "Read x-www-form-urlencoded: " + bean;   
  4.     } 

3. map作为返回值

  1. @RequestMapping(value="/form"method=RequestMethod.GET)   
  2.     public @ResponseBody MultiValueMap<String, String> writeForm() {   
  3.         MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();   
  4.         map.add("foo", "bar");   
  5.         map.add("fruit", "apple");   
  6.         return map;   
  7.     }  
  8.  
  9. //注意:返回类型MultiValueMap  

4. 响应一个bean

  1. @RequestMapping(value="/xml"method=RequestMethod.GET)   
  2.     public @ResponseBody JavaBean writeXml() {   
  3.         return new JavaBean("bar", "fruit");   
  4.     }  
  5.  
  6. //注意:返回类型JavaBean  

几个注解

1. @RequestBody 

表示method的参数能够从HTTP请求的body中取得值

2. @ModelAttribute

(我给这个注解加了个红色,就是说,这个注解有点复杂,但别有压力)

@ModelAttribute可以用于方法或者方法参数

     2.1 @ModelAttribute用于方法(method)

一个@ModelAttribute用于方法之上表示这个方法增加一个或者多个model属性,这些方法支持同样的参数类型,但不能直接映射到请求上。所有的@ModelAttribute方法在@RequestMapping的方法之前被调用

     2.2 @ModelAttribute用于method参数

表示这个参数能够从model中检索出来如果不存在与model里,这个参数首次实例化并且加入到model中。一旦存在于model中,这个参数字段会被填充,名字与绑定的请求参数中对应。例如本例中可能Bean有字段foo,则能够填充model

3. @Valid

@Valid注解不是spring的注解,所以需要加入如下配置:

  1. <mvc:annotation-driven/> 

@Valid要求 必须符合输入要求,否则就提示400错误

 

小结

这次简单的阐述了一下请求格式与响应格式。包括string,bean,map.json,xml等多种方式,同时对一些注解做了简单介绍,但基本对理解本文核心内容能有一定帮助。

具体参考spring官方文档,或者关注本博客后面内容。