一、了解spring注解@ResponseBody,@RequestBody和HttpMessageConverter
@RequestBody
i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
简单说就是前台只需要向 Controller 提交一段符合格式的 JSON,Spring 会自动将其拼装成 bean。
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
即可以将返回的对象(带有数据的javabean的集合List或Map)转换成JSON。
HttpMessageConverter接口,需要配置<mvc:annotation-driven />,就默认配置了RequestMappingHandlerAdapter。
二、代码实现
2.1 导入包
2.2 创建实体类Person,命名为Person.java
2.3 创建控制器,命名为PersonController.java,代码如下
<span style="font-family:SimSun;">@Controller
public class PersonController {
@RequestMapping(value="/person/query/{id}/{name}/{status}",method=RequestMethod.GET)
public @ResponseBody Person query(@PathVariable int id,@PathVariable String name,@PathVariable boolean status){
return new Person(id,name,status);
}
@RequestMapping(value="/person/login",method=RequestMethod.POST)
public @ResponseBody Person login(@RequestBody Person person){
return person;
}
}</span></span>
2.4 前台测试页面,代码如下
<span style="font-family:SimSun;"><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
<title>首页</title>
</head>
<body>
<table align="center">
<tr>
<td>id</td>
<td><input id="id" value="001" /></td>
</tr>
<tr>
<td>name</td>
<td><input id="name" value="molly" /></td>
</tr>
<tr>
<td>status</td>
<td><input id="status" value="true" /></td>
</tr>
<tr>
<td><input type="button" id="query" value="get" /></td>
<td><input type="button" id="login" value="post" /></td>
</tr>
</table>
</body>
<script type="text/javascript">
$(document).ready(function() {
$("#query").click(function() {
query();
});
$("#login").click(function() {
login();
});
});
function query() {
var url = 'person/query/';
var query = $('#id').val() + '/' + $('#name').val() + '/'
+ $('#status').val();
url += query;
alert(url);
$.getJSON(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 : 'person/login',
processData : false,
dataType : 'json',
data : mydata,
success : function(data) {
alert("id: " + data.id + "\nname: " + data.name + "\nstatus: "
+ data.status);
},
error : function() {
alert('Error...');
}
});
}
</script>
</html></span>
三、测试结果
四、总结
我在做这个实验的时候遇到的问题:
4.1 调试js页面没反应,也没有错误提示。Java控制台输出:WARN [PageNotFound] No mapping found for HTTP request with URI##
原因是在web.xml配置了
<span style="font-family:SimSun;"><span style="font-family:SimSun;font-size:14px;"><span style="color:#333333;"><servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
</span><span style="color:#ff0000;"><url-pattern>/</url-pattern></span><span style="color:#333333;">
</servlet-mapping></span></span></span>
通过<url-pattern>/</url-pattern>将所有请求都交给spring去处理了,而所有的请求都是在Controller里用注解@RequestMapping("/login")配置的,这样的话对js/css/jpg/gif等静态资源就访问不到。
解决的方法有几种:
1. web.xml里加上配置
<span style="font-family:SimSun;"><span style="font-family:SimSun;font-size:14px;"><servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping></span></span>
2. spring 3.0.5以上版本,在spring的配置文件中加上
<mvc:default-servlet-handler />
4.2 参照网上的demo,之前写成url='http://localhost:8080/smvc/person/query/'的形式,用火狐Firebug进行调试,出现惊叹号提示:
jackson jar包下载