目录:
1. AJAX的作用
2. XMLHttpRequest
3. AJAX重构
4. 使用AJAX的一般结构
一、AJAX
AJAX(Asynchronous Javascript And XML)是一种不刷新整个页面的情况下,与服务器端交互并动态更新当前页面的技术。目前AJAX已经被广泛使用,如百度地图、进度条显示等都是使用了AJAX技术。
传统的web开发每当页面上有数据更改(来自后台的数据),局需要刷新整个界面,这加大了数据流量,AJAX可以在一定条件下才向服务器发送请求,并获得新数据,刷新部分页面。
AJAX一般是前端展示的界面,涉及到CSS/HTML/JS以及额外的XMLHttpRequest。重点就是这个XMLHttpRequest,用它来实现与服务器的交互,而不是每次点击按钮就自动把request对象发送给服务器。而且获得返回的数据也是部分的数据。
二、XMLHttpRequest
XMLHttpRequest其实是一个类,在IE浏览器和非IE浏览器是不同的类名,但是方法属性都是一样的,在js函数中生成这个类:
req=false;//因为js可以不声明对象的类。
if(windows.XMLHttpRequest){
req=new XMLHttpRequest();//非ie浏览器
}else if(windows.ActiveXObject){
try{
req=new ActiveXObject("Msxml2.XMLHTTP");//IE浏览器的一部分版本
}catch(e){
try{
req=new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器的另一部分版本
}catch(e){}
}
}
if(!req){
alert("生成req失败");
return false;
}
XMLHttpRequest类有一些重要的属性与方法:
1. onreadstatechange
这个属性指向一个不但参数的回调方法,就是当请求成功后,用哪个方法处理返回值,因为函数时不带参数的,但是可以使用匿名函数:
req.onreadstatechange=function(){
deal("参数值")
}
2. readyState
这个属性表示获取请求的状态:
0:为初始化 1:正在加载 2:已加载 3:交互中 4:完成(一般都是请求是否处于整个状态再进行后续动作)
在判断完了请求状态后,还要判断http请求返回的状态:就是req.status是不是等于200。
3.open('GET/POST',url,true)
这个方法发送一个请求,一般在url中包含了action的值,这样服务器可以根据action的值调用相应的方法。url中最好还要包含当前的时间,不然网页可能不刷新。true表示当前是异步方式发送的,异步表示不需要接收服务器的响应就可以继续发送其他数据。
4. send(obj)
这个方法也是想服务器发送数据,因为get方法发送的数据可以直接写在open的url中,所以可以用open方法发送,但是post方法的数据最好用send方法发送。如果方法是get,则send中的obj为null,send方法必须用在open方法后,open方法相当于提供各了连接。
三. AJAX重构
当需要更新网页不同地方的部分内容时,就需要多次生成XMLHttpRequest,这样编写代码很麻烦,所以最好把生成XMLHttpRequest的代码,以及指定处理函数等代码放在一个文件中,需要时就调用,不同部分的内容需指定不同的处理函数,以参数传递的方式指定。
一个XMLHttpRequest使用的js文件为:
参数输入:url(如果是get方法,则url中包含了传递的参数),dealFunName,ErrorFunName,Get/Post,params(如果方法是post,这个里面包含了post想要传递的参数)
生成XMLHttpRequest对象
指定请求响应函数A:deal,deal函数也在该文本中实现,在deal函数中指派成功时执行的函数dealFunName,失败时执行的函数ErrorFunName
设置连接:open(Get/Post,url,true);
如果方法为post,则需要设置请求头:req.setRequestHeader("Content-Type","application/x-www/form-urlencoded")
发送post请求的数据:send(params)
四. 使用AJAX的一般结构
1. 写一个第三部分说的js文件实现XMLHttpRequest的相关功能。
2. 在jsp1页面中实现展示页面,并在需要提交数据或者获取数据的地方生成一个js中的req类;实现获取到返回数据的处理函数dealFunName;实现出错时的处理函数:ErrorFunName
3. 写servlet类或者jsp2页面处理获取前端的数据已经生成返回的数据。
最近试了一下这个,发现有些问题要注意:
1. 在调用变量函数(变量存储的是一个函数)时,用call方法回调,call的第一个实参一定要是this,不然会和形参因为默认的call的第二个参数才对应函数的第一个形参。
2. 只要是函数变量,就一定要用call方法回调,否则会说不存在这个变量或方法
3. ajax需要提供url,这个url只需要写servlet类的名字,不需要写后缀,不论它在哪个包。也可以写jsp,但是可能需要写后缀,书上写了后缀,但是我还没实践。
4. 除了用js来实现ajax外,还可以用jQuery很简介地写ajax,但是需要引入jQuery.js包:
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
具体ajax实现可以在网上找,很多。