Ajax相关总结

前后端的传输方式

前端和服务器数据的传输方式 常用 的两种,

       1.一种是以表单的形式提交,此时可以利用jqueryserialize()方法将表单内容转为a=1&b=2&c=3&d=4&e=5这样的格式传输过去,接收端则可以用javabean直接接收。

     2.还有一种方式是以json格式传输,接收时若直接用bean接收则接收不到,此时应该用@RequestBody方式,需要注意的是接收的需要是json串,而不是json对象,可以在发送前使用JSON.stringify函数进行处理。

表单提交(返回值类型为String)

后台

@ResponseBody

public String phoneyanzheng(HttpServletRequest request,HttpServletResponse response)  {

Map<String, Object> map = new HashMap<String, Object>();

String info=”测试使用”;

map.put("msg", info);

return new Gson().toJson(map);//回到原页面}

前台

<c:set var="ctx" value="${pageContext.request.contextPath}" />

$.ajax({

type : "POST",

dataType: "json",

url : "${ctx}/bbs/login/getCode",

data : $("#userform").serialize(),//userform为表单id

success : function(result) {

alert(result.msg);}

});

JSON提交

(返回值为bean)

后台
@RequestMapping(value="/testConverter.html")
@ResponseBody //只有是键值对的形式的数据,map,json,对象,ajax不能回调不是键/值对形式的参数,如返回类型是String,xmlHTTP.responseText得到始终是字符串或者文本流,看了一些资料基本上返回的流都是{"a": 1, "b": 2} 这种类型的字符串,在这里利用该注解把对象转换为json数据,在前台就无需再转换
  public User testConverter(@RequestBody User  user){

//参数user会自动回显到页面不需要springMVCaddobject()方法;

        user.setUserName("testname");       
        return user;       
   }

 

前台
var url=path+'testConverter.html';
   $.ajax( {
      url : url,
     type : "POST", 
      dataType:"json",
     contentType:'application/json;charset=UTF-8',很重要
    data:JSON.stringify({“userId”:”1”,”userName”:”hello”,”password”:”test”},
    success : function(data) {
         alert(data.userName); //date 就相当于返回的user  
    },
}); 

@RequestBody注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上,再把HttpMessageConverter返回的对象数据绑定到controller中方法的参数上,在本例中,把前台的json字符串数据绑定到对象的相应属性,@RequestBody注解根据request对象header部分的Content-Type类型逐一匹配合适的HttpMessageConverter来读取数据,

Json对象转换字符串可以使用到json2.jsJSON.stringify()方法

@responseBody用于将controller方法返回的对象通过适当的HttpMessageConverter转换为指定的个时候写入response对象的body数据区,使用时机是返回的数据不是html标签页面(跳转路径),而是某种其他格式的数据,(json,XML)使用,一般在异步获取数据时使用,@responseBody注解根据request对象header部分的Accept属性(逗号隔开)逐一按accept中的类型,去遍历找到冷处理的HttpMessageConverter

如果返回的对象是已经格式化好的json,不使用@requestBody注解,而应该这样处理,response.setContentType(“application/json”;charset=UTF-8);response.getWriter().print(jsonstr)直接输出到body,然后视图为void,见下例

上面例子中服务端返回的是个对象,@ResponseBody函数会自动将其转换为客户端要求的‘ dataType:"json",’格式。

另类传输

1.Get方式提交并向前台拼接字符串

(返回值为void)

后台

@RequestMapping("/replacement")

public void replacement(HttpServletRequest request,HttpServletResponse response, String email) {

email = new String(email.getBytes("ISO-8859-1"), "UTF-8");//解决get提交的乱码问题

......

msg ="{"success": false,"msg":"此保单号不存在"}";//这个msg可以在dao层定义根据业务的不同返回相应的提示信息,

response.getWriter().write(msg);//发送前台,Ajax获取,适合在返回类型为void时使用这种方法,msg为json格式的字符串

response.setCharacterEncoding("UTF-8");

response.getWriter().flush();

}

var date = $("#username").val();

var aa = {username : date};

2.Jquery 的其他方法

$.post("${ctx}/AjaxTest",aa,function(data){

alert(data);

}); //或者$.get

 

前台

$.ajax({

url : projectName+ "replacement.action?policyID="+policyID+"&email="+email,

dataType: "json",

success: function(data) {

alert(data.msg);

},

});

Ajax核心

AjaxAsynchronous Javascript and XML(异步javascriptXML)的缩写,ajax核心规范的名称继承与你用来建立和发起请求的javascript对象:XMLHttpRequest,这一规范有两个等级,第一等级代表了基础级别的功能,第二等级扩展了最初的规范,纳入额外的事件和一些功能来让它更容易与form元素协作

var httprequest=new XMLHttpRequest();//创建对象

httprequest.onreadystatechange=handResponse

httprequest.open(“GET”,url)//open 方法指定http方法和需要请求的url

httprequest.send()向服务器发送请求,可带参数

使用FormData对象发送表单数据

var form  =document.getElementById(“fruitform”)

var formData=new FormData(form)

....

httprequest.send(formData)

其对象有一个append方法可以向服务器添加 名称/值 对

Ajax发送JSON数据

Java不止可以发送表单,而且包括javascript的对象表示法(javascript Object Notation,JSON)数据

XMLHttpRequest对象有setRequestHeader方法可以把请求的标头Content-Type设置为application/json

setRequestHeader(“Content-Type”,”application/json ”)

接收JSON数据

Var data =JSON.parse(httprequest.responseText)

Ajax事件

abort在请求被终止时触发

error在请求失败时触发

load在请求完成时触发

loadend在请求已完成时触发,无论成功还是失败

loadstart在请求开始时触发

progress 触发以提示请求的进度

readystatechange在请求生命周期的不同阶段触发

timeout如果请求超时则触发

以上事件大多数会在请求的某一个特定点上触发,Readystatechangeprogress事件是个例外,可以多次触发提供进度更新

以上事件除了readystatechange使用常规的Event对象,其他的都是使用ProgressEvent对象,progressEvent 对象定义了Event对象的所有成员,并且还有如下的额外的属性

lengthComputable计算数据流的总长度

loaded返回当前已经载入的数据量

total 返回可用的数据总量

考虑到第二级事件的实现还不到位,readystatechange是目前唯一能可靠追踪请求进度的事件

例如

<div id=”target”> press a button </div>

 httprequest.onreadystatechange=handResponse//handResponse为方法名

Function handResponse(e){

If(e.target.readyState==XMLHttpRequest.DONE&&e.target.status==200){

document.getelEmentById(“target”).innerHTML=e.target.responseText

}

}

onreadystatechange事件被触发后,浏览器会把一个Event对象传给指定的函数,target属性会被设为与此事件关联的XMLHttpRequest

XMLHttpRequest readyState属性的值

数值

说明

UNSEND  

0

已创建XMLHttpRequest对象

OPEND

1

已调用open方法

HEADERS_RECEIVED

2

已收到服务器响应的表头

LOADING

3

已收到服务器响应

DONE

4

响应完成或已失败

XMLHttpRequest.responseText属性获得服务器发送的数据

追踪上传进度

可以在数据发送到服务器时追踪它的进度,可以使用 XMLHttpRequest对象的upload属性,调用属性会返回一个可用于监控进度的对象XMLHttpRequestUpload对象,这个对象只定义了注册事件处理器所需的属性比如上面提到的onprogress,onload,

例子

<progress id=”prog” value=”0”/>

var progress=document.getElementById(“prog”)

var httprequest=new XMLHttpRequest();

var httprequest.upload

upload.onprogress=function (e){

progress.max=e.total;

progress.value=e.loaded

}

upload.onload=function(e){

progress.value=1;

progress.max=1;

}

.....

httprequest.send(formData)

事件

上文提及事件的知识有很多,在这里做下补充

Onmouseover事件属性对应全局事件mouseover

事件属性=”javascript语句”当事件被触发,浏览器会执行你提供的javascript语句

例如

<p onmouseover=”this.style.color=”’black’”>.......</p>

This.style属性返回元素的CSSStyleDeclaration对象

使用DOM和事件对象

var elem =document.getElementById(“id”)

elem.onmouseover=handleMouseOver  //handleMouseOver  是函数名

Function handleMouseOve(e){...}

处理事件的函数定义一个名为e的参数,他会被设为浏览器所创建的一个Event对象用于在事件触发时代表该事件,这个Event对象向你提供了所发生的事件信息,事件属性以on开头,onclick

Event对象的常用属性

名称

说明

返回

type

事件的名称如mouseover

字符串

target

事件指向的元素

HTMLElement

使用HTML事件

文档和窗口事件

 

Document对象事件

readystatechange readystate属性的值发生改变时触发

Window对象事件

onload在文档或资源加载完触发

......

鼠标事件

click 在点击并释放鼠标时触发

.......

键盘焦点事件

blur/focus/....

键盘事件

keyup在用户释放某个键时触发

....

表单事件

submit 在表单提交时触发

...

在使用事件属性时加on

ajax过程

(1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.

 

(2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.

 

(3)设置响应HTTP请求状态变化的函数.

 

(4)发送HTTP请求.

 

(5)获取异步调用返回的数据.

 

(6)使用JavaScriptDOM实现局部刷新.

GETPOST的区别,何时使用POST

 

    GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符

    POST:一般用于修改服务器上的资源,对所发送的信息没有限制。

 

    GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,

    也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。

 

然而,在以下情况中,请使用 POST 请求:

无法使用缓存文件(更新服务器上的文件或数据库)

向服务器发送大量数据(POST 没有数据量限制)

发送包含未知字符的用户输入时,POST GET 更稳定也更可靠