- u 最直接的Ajax处理
- u 数据绑定@RequestBody/@ResponseBody
- u 使用@RequestBody/@ResponseBody来支持Ajax
- u 使用HttpEntity/ResponseEntity来支持Ajax
- u 对Ajax返回xml的支持
- u HttpMessageConverter
- u 内容协商
1 最直接的Ajax处理
只要在Controller的方法里面,直接使用response输出你要返回的的Ajax数据,然后return null就可以了,示例如下:
Controller示例
@RequestMapping(value = "/hello")
public ModelAndView handleRequest(UserModel um,HttpServletResponse response)throws IOException {
response.setCharacterEncoding("utf-8");
response.getWriter().println("{uuid:'"+um.getUuid()+"', name:'"+um.getName()+"'}");
return null;
}
客户端示例,使用jQuery
<%@ page language="java" contentType="text/html; charset=UTF-8 " pageEncoding="UTF-8"%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<script language="javascript“ src="/mvcexample/static/js/jquery-1.3.2.min.js"></script>
<script language="javascript">
$().ready(function(){
$.getJSON('/mvcexample/hello',{uuid:'1',name:'test'},
function(data){
alert(data.uuid+" , "+data.name);
});
});
</script>
</html>
然后就可以启动服务器测试了。
2 数据绑定@RequestBody/@ResponseBody
@RequestBody
功能:用于将HttpServletRequest的getInputStream()内容绑定到入参
例子:
@RequestMapping(value = "/hello") public byte[] handleRequest(@RequestBody String body)
@ResponseBody
功能:用于将ResponseBody方法的返回值作为响应体
例子:
@RequestMapping(value = “/hello") @ResponseBody public byte[] handleRequest(@RequestBody String body)
注意:他们都只能访问报文体,不能访问报文头
3 使用@RequestBody/@ResponseBody来支持Ajax
可以使用@RequestBody来自动获取Ajax上传的数据,同时也可以使用@ResponseBody,把要返回的对象自动拼成JSON的格式返回。当然,需要加入几个jackson的包,这里加入了:
jackson-core-2.1.2.jar、jackson-annotations-2.1.2.jar、jackson-databind-2.1.2.jar
测试使用的Controller的方法:
@RequestMapping(value = "/hello")
@ResponseBody
public UserModel handleRequest(@RequestBody String reqBody, UserModel um){
System.out.println("the reqBody="+reqBody);
um.setName(um.getName()+",server");
return um;
}
测试使用的页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<script language="javascript"src="/mvcexample/static/js/jquery-
1.3.2.min.js">
</script>
<script language="javascript">
$().ready(function(){
$.getJSON('/mvcexample/hello',{uuid:'1',name:'test'},
function(data){
alert(data.uuid+" , "+data.name);
});
});
</script>
去测试看看吧,可以看到Controller的方法直接返回一个um对象,但是@ResponseBody会把这个对象自动变成json格式的,再传回客户端,非常方便。
当然,@ResponseBody也支持集合对象自动变成json格式,比如:
测试使用的Controller方法
@RequestMapping(value = "/hello")
@ResponseBody
public List<UserModel> handleRequest(@RequestBody String reqBody,UserModel um) {
System.out.println("the reqBody="+reqBody);
um.setName(um.getName()+",server");
List<UserModel> list = new ArrayList<UserModel>();
list.add(um);
UserModel um2 = new UserModel();
um2.setUuid("22");
um2.setName("222");
list.add(um2);
return list;
}
测试使用的页面
<%@ page language="java" contentType="text/html; charset=UTF-8 " pageEncoding="UTF-8"%>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<script language="javascript“
src="/mvcexample/static/js/jquery-1.3.2.min.js">
</script>
<script language="javascript">
$().ready(function(){
$.getJSON('/mvcexample/hello',{uuid:'1',name:'test'},
function(data){
$.each(data,function(index,v){
alert("tr="+v.uuid+",v="+v.name);
});
});
});
</script>
4 使用HttpEntity/ResponseEntity来支持Ajax
使用HttpEntity/ResponseEntity不但能访问到报文体,还可以访问报文头
示例,主要的变化在Controller的方法上,页面不用变化,如下:
@RequestMapping(value = "/hello")
public ResponseEntity<List<UserModel>> handleRequest(HttpEntity<String> req, UserModel um) {
System.out.println("req headers="+req.getHeaders()+", reqBody="+req.getBody());
um.setName(um.getName()+",server");
List<UserModel> list = new ArrayList<UserModel>();
list.add(um);
UserModel um2 = new UserModel();
um2.setUuid("22");
um2.setName("222");
list.add(um2);
ResponseEntity<List<UserModel>> ret = new
ResponseEntity<List<UserModel>>(list,HttpStatus.OK);
return ret;
}
5 对Ajax返回xml的支持
前面的Ajax使用的是json格式,下面看看对xml的支持
要让Spring Web MVC支持xml格式,需要加入如下jar包:jaxb-api-2.2.5.jar,jaxb-impl-2.2.5.jar
在要返回的对象头上使用如下注解,例如:
@XmlRootElement(name = "testxml")
public class UserModel {
- u 这表明返回的xml的根元素名称为testxml,注意:由于xml是单根的,所以只能返回一个对象,而不能返回一个list,如果要返回多条值,可以在这个对象中包含多个其他对象
- u 返回的结果同样用@ResponseBody注解即可,这个注解会根据请求的类型,自动决定是返回json还是xml,当然默认是返回json格式的,如果要返回xml格式,那么请求的时候,要指定accept=application/xml
- u 示例的Controller方法
@RequestMapping(value = "/hello")
@ResponseBody
public UserModel handleRequest(HttpEntity<String> req, UserModel um) {
System.out.println("req headers="+req.getHeaders()+", reqBody="+req.getBody());
um.setName(um.getName()+",server");
PhoneNumberModel pnm = new PhoneNumberModel("123","321");
PhoneNumberModel pnm2 = new
PhoneNumberModel("2222","333");
List<PhoneNumberModel> tempList = new
ArrayList<PhoneNumberModel>();
tempList.add(pnm2);
tempList.add(pnm);
um.setPm(tempList);
return um;
}
u 示例的页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<script language="javascript"
src="/mvcexample/static/js/jquery-1.3.2.min.js">
</script>
<script language="javascript">
$().ready(function(){
$.ajax({
url:'/mvcexample/hello',
type: 'POST',
dataType: 'xml',
data: {uuid:'1',name:'test'},
timeout: 1000,
error: function(){ alert('Error loading XMLdocument'); },
success: function(xml){
$(xml).find("testxml").children("pm").each(function(i){
var uuid=$(this).children("areaCode").text();
var name=$(this).children("phoneNumber").text();
alert("uuid="+uuid+",name="+name);
});} });});
</script>
u 返回的xml形如
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<testxml>
<age>0</age>
<name>test,server</name>
<pm>
<areaCode>2222</areaCode>
<phoneNumber>333</phoneNumber>
</pm>
<pm>
<areaCode>123</areaCode>
<phoneNumber>321</phoneNumber>
</pm>
<uuid>1</uuid>
</testxml>
6 HttpMessageConverter
其实前面的程序实现对json和xml的支持,之所以能正常运行,幕后英雄就是HttpMessageConverter,它负责对http传入和传出的内容进行格式转换。比如前面学的@RequestBody是将Http请求正文插入方法中,其实它就会使用适合的HttpMessageConverter将请求体写入某个对象。比如前面学的@ResponseBody是将内容或对象作为Http响应正文返回,使用@ResponseBody将会跳过视图处理部分,直接调用合适的HttpMessageConverter,将返回值写入输出流
现在只要你开启了<mvc:annotation-driven />,它会给AnnotationMethodHandlerAdapter初始化7个转换器,可以通过调用AnnotationMethodHandlerAdapter类的getMessageConverts()方法来获取转换器的一个集合List<HttpMessageConverter>,默认开启的有:
- u ByteArrayHttpMessageConverter
- u StringHttpMessageConverter
- u ResourceHttpMessageConverter
- u SourceHttpMessageConverter<T>
- u XmlAwareFormHttpMessageConverter
- u Jaxb2RootElementHttpMessageConverter
- u MappingJacksonHttpMessageConverter
Spring是如何寻找最佳的HttpMessageConverter呢?
最基本的方式就是通过请求的accept里面的格式来匹配,如果accept=application/json之类的,就使用json的HttpMessageConverter,如果accept=application/xml之类的,就使用xml的HttpMessageConverter。
7 内容协商
什么是内容协商?
简单点说,就是同一资源,可以有多种表现形式,比如xml、json等,具体使用哪种表现形式,是可以协商的。
这是RESTfull的一个重要特性,Spring Web MVC也支持这个功能。
来源:https://www.cnblogs.com/zhouyeqin/p/9008452.html