09springMVC对ajax的支持
- 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也支持这个功能。
09springMVC对ajax的支持的更多相关文章
- MVC4 5分页控件,支持Ajax AjaxOption支持
MVC4 5分页控件,支持Ajax AjaxOption支持 /// <summary> /// MVC4 5分页控件,支持Ajax AjaxOption支持 beta 1.0 /// 用 ...
- Struts2对AJAX的支持
一.简介 struts2确实一个非常棒的MVC框架.这里部分记述一下struts2对AJAX的支持.实现AJAX有两种方式,一种是使用原生的javascript代码实现,一种是使用第三方 ...
- Unit02: JSON 、 使用JSON实现数据交换 、 jQuery对AJAX的支持,编码问题
Unit02: JSON . 使用JSON实现数据交换 . jQuery对AJAX的支持 1. 编码问题 (1)发送get请求 为什么会产生乱码? ie浏览器提供的ajax对象,对中文会使用gbk来编 ...
- IT兄弟连 JavaWeb教程 jQuery对AJAX的支持
jQuery对AJAX的支持 jQuery对Ajax请求的创建.发送.响应.注册数据处理函数.JSON的解析和缓存以及传参等都进行了相应的封装,同时也考虑了浏览器的兼容性问题. jQuery中对AJA ...
- jquery ajax中支持哪些返回类型以及js中判断一个类型常用的方法?
1 jquery ajax中支持哪些返回类型在JQuery中,AJAX有三种实现方式:$.ajax() , $.post , $.get(). 预期服务器返回的数据类型.如果不指定,jQuery 将自 ...
- 【JavaWeb】jQuery对Ajax的支持
jQuery对Ajax的支持 jQuery对Ajax进行封装,提供了$.ajax()方法 语法:$.ajax(options) 常用设置项 说明 url 发送请求地址 type 请求类型get|pos ...
- jquery.form.js官方插件介绍Form插件,支持Ajax,支持Ajax文件上传
jquery.form.js官方插件介绍Form插件,支持Ajax,支持Ajax文件上传 http://www.malsup.com/jquery/form/#getting-started [JQu ...
- 微信支付之微信H5支付(坑,ajax不支持重定向跳转)
这里讲的是 微信h5支付, 是微信以外的手机浏览器调用微信h5支付 h5支付: H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起 ...
- MvcPager 概述 MvcPager 分页示例 — 标准Ajax分页 对SEO进行优化的ajax分页 (支持asp.net mvc)
该示例演示如何使用MvcPager最基本的Ajax分页模式. 使用AjaxHelper的Pager扩展方法来实现Ajax分页,使用Ajax分页模式时,必须至少指定MvcAjaxOptions的Upda ...
随机推荐
- bzoj3661
网络流/贪心 网络流做法是对于每一列,如果一个兔子下一天继续可以存在,那么连一条容量为1的边,然后设立一个中转站,来控制可以换的数量,容量限制l.时限100s,能跑过去我的太慢了,一个点100s 正解 ...
- [Apple开发者帐户帮助]七、注册设备(3)禁用或启用设备
您可以禁用和启用设备,但不能从开发者帐户中删除它.您可以禁用不再用于开发或测试的设备.但是,这样做会使包含设备的配置文件无效,并且不会增加当年设备的总数. 所需角色:帐户持有人或管理员. 在“ 证书” ...
- BZOJ DZY Loves Math系列
⑤(BZOJ 3560) $\Sigma_{i_1|a_1}\Sigma_{i_2|a_2}\Sigma_{i_3|a_3}\Sigma_{i_4|a_4}...\Sigma_{i_n|a_n}\ph ...
- Codeforces 769D
太久没写搜索因为递归边界问题卡了很久.. 题意:定义k-interesting:如果两个数的二进制形式有k位不相同,则称之为k-interesting.给出n和k,输入n个大小在[0,10000]之间 ...
- ACM_ZHANGZHANG喜欢手表
ZHANGZHANG喜欢手表 Time Limit: 2000/1000ms (Java/Others) Problem Description: ZHANGZHANG刚过生日,收到了好朋友NENGN ...
- C#学习-程序集和反射
准备项目 1.新建一个空的解决方案MyProj.sln 2.在该解决方案下,建一个控制台项目P01.csproj 3.在该项目下,自己新建一个类MyFirstClass.cs 查看解决方案MyProj ...
- conda python虚拟环境
#查看已安装的python包 conda list #查看当前有哪些虚拟环境 conda env list 或者 conda info -e #更新conda conda update conda # ...
- Android 解决ScrollView嵌套RecyclerView导致滑动不流畅的问题
最近做的项目中遇到了ScrollView嵌套RecyclerView,刚写完功能测试,直接卡出翔了,后来通过网上查找资料和 自己的实践,找出了两种方法解决这个问题. 首先来个最简单的方法: recyc ...
- java与javascript之间json格式数据互转
javascript中对象与字符串的互转 对象转为字符串:通过JSON.encode方法,这个是json.js里面的方法,引入到当前文件就可以了. 字符串转换为对象:①使用JSON.decode方法, ...
- C#的一些知識點
不能將屬性以ref或out的方式傳遞 看上去屬性和字段差不多,可是屬性本質上是個方法,并不是真正指向一個内存位置,所以不能像字段那樣能以ref或out方式傳遞. Lookup運行一個鍵對應多個值,但無 ...