前言
这次主要讲讲 消息转换:一次请求,从请求页面--后台数据处理--返回响应内容.
主要涉及以下几个部分
请求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代码
@RequestMapping(value="/string", method=RequestMethod.POST)
public @ResponseBody String readString(@RequestBody String string) {
return "Read string '" + string + "'";
}
这个方法需要注意的展开讲一下,其他大同小异
第二部分:jsp页面
html
<form id="readString" class="textForm" action="<c:url value="/messageconverters/string" />" method="post">
<input id="readStringSubmit" type="submit" value="Read a String" />
</form>
js(在js中,对submit时间做了重写)
$("form.textForm").submit(function(event) {
var form = $(this);
var button = form.children(":first");
$.ajax({ type: "POST", url: form.attr("action"), data: "foo", contentType: "text/plain", dataType: "text", success: function(text) { MvcUtil.showSuccessResponse(text, button); }, error: function(xhr) { MvcUtil.showErrorResponse(xhr.responseText, button); }});
return false;
});
注意:js用到了jquery,所以语法,并且在jsp中做了一定的封装如MvcUtil。
第三部分: 通过jsp发起请求,查看请求信息
<a href="http://yjplxq.blog.51cto.com/attachment/201208/31/4081353_1346432576GuKh.png"></a>
请求正文:
<a href="http://yjplxq.blog.51cto.com/attachment/201208/31/4081353_1346432577x9UN.png"></a>
由于注解@RequestBody 存在,String直接被获取,返回值应为Read string 'foo'(上一篇文章我们讲过@ResponseBody )
第四部分: 效果图
<a href="http://yjplxq.blog.51cto.com/attachment/201208/31/4081353_13464325785to3.png"></a>
2. 从请求中数据,转换成bean,作为参数传入,再以bean作为返回值
@RequestMapping(value="/form", method=RequestMethod.POST)
public @ResponseBody String readForm(@ModelAttribute JavaBean bean) {
return "Read x-www-form-urlencoded: " + bean;
}
3. map作为返回值
@RequestMapping(value="/form", method=RequestMethod.GET)
public @ResponseBody MultiValueMap<String, String> writeForm() {
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("foo", "bar");
map.add("fruit", "apple");
return map;
//注意:返回类型MultiValueMap
4. 响应一个bean
@RequestMapping(value="/xml", method=RequestMethod.GET)
public @ResponseBody JavaBean writeXml() {
return new JavaBean("bar", "fruit");
//注意:返回类型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的注解,所以需要加入如下配置:
<mvc:annotation-driven/>
@Valid要求 必须符合输入要求,否则就提示400错误
小结
这次简单的阐述了一下请求格式与响应格式。包括string,bean,map.json,xml等多种方式,同时对一些注解做了简单介绍,但基本对理解本文核心内容能有一定帮助。
具体参考spring官方文档,或者关注本博客后面内容。
本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/yjplxq/978957,如需转载请自行联系原作者