吴鹏
总结
同步和异步:
同步:当点击按钮或提交时,整个页面都会刷新等待处理;
异步:通过第三个对象,实现页面局部提交请求,局部刷新,不用整个页面刷新,可以继续浏览网页;
AJAX的功能:实现页面局部刷新,不中断用户体验;
早期JS不受重视,后台经常将其当成是一种玩具式语言;
JS中有一个对象XMLHttpRequest,可以向服务器异步发送请求,
传统的B/S结构软件,所有的功能都要在服务器端编写代码(胖服务器)
有了AJAX后,可以将部分代码写道客户端浏览器(瘦服务器);
RIA:Rich Internet Application;
XML:使用XML作为传递数据的格式;JSON:就是键值对;
XMLHttpRequest:
readyState:XMLHttpRequest的状态;
onreadystatechange:当XMLHttpRequest状态改变时后触发一个函数;
status:获得响应的状态码;0 对象建立,但是没有调用open方法
1 对象建立,但是没有调用send方法
2 send已调用,但是当前的状态及http头未知;
3 已接受部分数据,但是补全,使用下面两个对象获取时,会出错
4 完成;
responseText:异步加载的时候,获得响应的文本数据
responseXML:获得响应的XML的数据;
方法:
open(请求方法,请求路径,是否异步) 异步去向服务器发送请求;
send(请求参数) : 发送请求;
setRequestHeader(头信息,头的值) 处理POST请求方式的中文问题;
不同的浏览器创建该对象的方法不同:
IE:将XMLHttpRequest对象封装在ActiveXObject组件;
Fierfox 直接就可以创建XMLHttpRequest;
AJAX编写的步骤:
1 创建一个异步对象
2 设置对象状态改变时触发的函数
3 设置向后台提交的路径
4 发送请求
--------------------------------------------------------
JQuery中的AJAX
常用的方法:
JQuery的对象.load(路径,参数,回调函数);
$.get(路径,参数,回调函数,数据类型)
$.post(路径,参数,回调函数,数据类型)
$.ajax();
serialize();--JQ的AJAX传递参数的时候需要使用的方法;
--------------------------------------------------------
通过AJAX实现异步:
为了通过AJAX实现异步,需要使用一个第三者对象:XMLHttpRuquest;
通过四个步骤编写AJAX代码:1 创建一个AJAX的对象 ; 2 设置监听(ajax对象的状态发生改变时触发一个函数)
3 设置向后台提交的方式(GET或者是POST),提交的路径以及是否开启异步; 4 发送请求;
每个步骤的方法分别是:
首先,创建异步对象,使用xhr变量引用;
var xhr = ajaxHttpRequest();
1 创建XMLHttpRuquest对象(调用一个给定的方法):
function ajaxFunction(){
var xmlHttp;
try{ // Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e){
try{// Internet Explorer
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){}
}
}
return xmlHttp;
}
2 设置监听(当异步对象的状态发生改变时,执行的函数):
xhr.onreadystatechange()=
3 设置后台传输路径:
xhr.open(请求的方法,提交路径,是否开启异步);
4 发送请求;
xhr.send(null);对于提交方法为"GET"的,send方法括号里面为null,要提交的参数写在open()方法内,而提交方法为"POST"时,
如果有提交的参数,需要先使用.setRequestHeader("Content-type","application/x-www-form-urlencoded");然后把参数
写在send()方法内;
----------------------------------------------------------
通过jq封装后的ajax实现异步:
方法:
jQuery对象.load(url,data,callback);
使用该方法来实现异步校验用户名时,url地址写入处理表单接收用户名的servlet地址,data为传入servlet的参数,
格式为{"参数名(servlet中要接收该参数的名字)":参数名(从网页中获取参数的引用名)};
该方法实现的效果是:将参数(有的话)传入url地址中,然后将结果加载进引用该方法的对象中;
$.get(路径,参数,回调函数,数据类型);该方法已经限定提交的方法是GET类型;
$(selector).get(url,data,function(response,status,xhr),dataType);
其中;
$(selector)为jq的对象;
url为提交的路径;
data为提交时一起传过去的参数;
function(response,status,xhr)为回调函数,其中,response是请求的结果数据;status是i请求的状态,xhr包含XMLHttpRequest的对象
dataType为规定预定要服务器响应的数据类型;
使用该方法来实现用户名校验时,url地址写入处理用户名的servlet地址,传入的参数就是username,然后定义一个回调函数;
函数的内容为判断servlet里面处理完username后传过来的数据,在servlet里面已经有一个判断,内容是,根据username的
值查找在mysql中是否存在该username,不存在的话response.getWriter().print(1),存在的话,response.getWriter().print(2),
这两个就是请求后返回的数据;接下来,回到js中,判断data(请求后处理的数据)的值是1还是2,然后通过id选择器,取得
用户名后面的span标签,再通过jq的html方法,将"<font color = 'green/red'>用户名可以使用/用户名已被注册</font>"
写入到标签中;
-----------------------------------------------------------
$.post(请求路径,参数,回调函数,数据类型);
此方法用法与上面的$.get()一样,就不细说了;
------------------------------------------------------------
在上面两个方法中,还可以将提交按钮的跟用户名校验联立,实现当用户名存在时,提交按钮无法激活;
在判断data内容的语句里,在往span标签写内容的下面,可以添加一句;$("#regbut").attr("disabled",true/false);
这句代码是获取id值为regbut的标签(我们需要在jsp的提交按钮标签中先定义一个id值为regbut),将其属性设置为
"disable",后面设置开启或关闭,当用户名不存在时,设置关闭,存在时,设置开启,就能实现用户名获取和提交按钮的联动;
------------------------------------------------------------
使用jq的ajax模仿百度搜索
首先,在模仿搜索的页面里定义一个搜索栏文本框,还有<div>格子,id值设为"d1",宽度和搜索栏一样的宽度,不定义长度,
实现活动式,搜索栏文本框的id值定义为"word",在页面中引用jquery的js文件和我们自己定义的一个js文件;
先来说说异步实现模仿百度搜索文本框建议栏,在我们定义的js文件中,定义一个页面皆在函数,在里面,获得文本框的id属性
$("#word").keyup,调用keyup方法,实现当在文本框中输入完文字,键盘按键弹起时,调用一个函数,函数内容为,获得文本框
的值:$("#word").val();判断word的值是否有输入数据,若是没有输入,调用hide()方法将div格子隐藏,若是有数据输入,
则调用$.post()方法,将word数据传递到一个servlet文件中进行数据处理,将处理后的数据显示到div格子中,处理的数据是
通过mysql语句的like模糊搜索查找到的数据;传递到servlet时,我们要先获得传递过来的参数,通过方法传递参数,将word
的数据传递到dao层与数据库进行交互,在dao层中,使用"select * from 表格名 where 列名 like word%"进行模糊搜索,
将搜索到的数据封装为word对象,放入list集合中,传递回servlet中;在servlet里,我们或得到包含若干个首字为word里数据的集合,
将集合放进request域中,转发到一个空白的jsp文件;在空白的jsp文件中,我们通过jstl遍历servlet传递过来的集合;再来讲讲
为什么要传递到一个新的空白的jsp集合中,我们使用的是异步,实现局部刷新数据,在js文件中,我们请求结果的路径是servlet文件,
意思就是servlet处理后的结果要返回js中的回调函数里,这样我们就是把一个集合遍历后的结果返回到js文件里,在js文件中
再判断是否有在文本框中输入值,有的话,调用servlet,查找数据库,遍历集合,放回回调函数,回调函数通过show().html(data)方法,
将遍历的结果直接显示到格子中;
|