AJAX基础
来源:互联网 发布:瞻博网络工厂 编辑:程序博客网 时间:2024/06/09 15:50
Ajax(Asynchronous JavaScript And Xml)允许浏览器与服务器,在不重新加载整个页面的情况下,交换数据并更新部分网页。Ajax的核心是JavaScript对象XMLHttpRequest,该对象可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。
一、AJAX的原理
AJAX采用异步交互过程。XMLHttpRequest是XMLHTTP组件的对象,通过这个对象,AJAX可以像桌面应用程序一样只同服务器进行数据层面的交换。
二、XMLHttpRequest对象的创建
XMLHttpRequest 对象用于在后台与服务器交换数据。可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
//创建一个XMLHttpRequest对象var ajax = new XMLHttpRequest();
但是,某些浏览器是不支持创建XMLHttpRequest对象的,则我们则可以创建ActiveXObject 对象。
//编写一个方法来创建XMLHttpRequest对象function createAJAX(){ var ajax = null; if(window.XMLHttpRequest){ ajax = new XMLHttpRequest() }eles if(){ ajax = new ActiveXObject("Microsoft.XMLHTTP"); }eles{ alert("该浏览器不支持AJAX"); } return ajax;}
三、XMLHttpRequest对象的方法
(一)open(method,url,async)
规定请求的类型、URL 以及是否异步处理请求。
- method:设置请求的类型,GET 或 POST
- url:提交请求目的的url。在多次提交请求的时候,有些浏览器对于同一个URL的请求会就会,调用上一次的请求的缓冲。把当前时间戳追加到URL的最后,就能确保URL的惟一性,从而避免获得浏览器缓存结果。
- async:表示请求是否要异步传输,默认值为true(异步)。指定true,在读取后面的脚本之前,不需要等待服务器的相应。指定false,当脚本处理过程经过这点时,会停下来,一直等到Ajax请求执行完毕再继续执行。
(二)send(string)
将请求发送到服务器。该方法的string参数,只用于post提交方式。因为POST方法的参数是在当请求体当中的,get方法的提交的参数是在url当中的。
(三)setRequestHeader(“header”, “value”)
向请求添加 HTTP 头。
- header: 规定头的名称
- value: 规定头的值
当浏览器向服务器请求页面时,它会伴随这个请求发送一组首部信息。这些首部信息是一系列描述请求的元数据(metadata)。首部信息用来声明一个请求是 GET 还是 POST。Ajax 请求中,发送首部信息的工作可以由 setRequestHeader完成。
如果用 POST 请求向服务器发送数据,需要将 “Content-type” 的首部设置为 “application/x-www-form-urlencoded”.它会告知服务器正在发送数据,并且数据已经符合URL编码了。该方法必须在open()之后才能调用。
(四)方法的使用
下面,在一个jsp页面,使用了XMLHttpRequest对象的方法实现了GET和POST提交请求到服务器。
这里使用了 jQuery基础、javascript基础、jsp基础,不懂的话可以查看我相应的博客。
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Insert title here</title><script src="js/jquery-3.2.1.js"></script></head><body> <button id="b1">点击</button> <button id="b2">点击</button> </body><script> //创建一个XMLHttpReques对象 function createAJAX(){ var ajax = null; //如果支持XMLHttpReques对象,则创建。反之,则创建ActiveXObject对象 if(window.XMLHttpRequest){ ajax = new XMLHttpRequest(); }else{ ajax = new ActiveXObject("Microsoft.XMLHTTP"); } return ajax; }; //b1点击事件函数 $("#b1").click(function(){ //1、用GET方法发送带参数的请求到服务器 //获得ajax对象 var ajax = createAJAX(); //提交到一个Servlet中,GET方法在url中提交参数。并且防止获得缓存结果,加上一个time参数,保证url的唯一性。 ajax.open("GET","Servlet?param1=value1¶m2=value2&time="+new Date()getTime(),true); ajax.send(); }); //b2点击事件函数 $("#b2").click(function(){ //1、用POST方法发送带参数的请求到服务器 //获得ajax对象 var ajax = createAJAX(); //提交到一个Servlet中 ajax.open("POST","ProcessingServlet",true); //使用 setRequestHeader() 来添加 HTTP 头。 ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded"); //POST方法在请求体当中提参数 ajax.send("param1=value1¶m2=value2"); }); </script></html>
四、XMLHttpRequest对象的属性
(一)onreadystatechange事件触发器(实际上不属于属性)
在 Ajax 执行过程中,服务器会通知客户端当前的通信状态。这依靠更新 XMLHttpRequest 对象的 readyState 来实现。改变 readyState 属性是服务器对客户端连接操作的一种方式。
每次 readyState 属性的改变都会触发 readystatechange事件。该事件处理函数由服务器触发,而不是用户
<script>//部分代码 //创建一个XMLHttpReques对象 function createAJAX(){ var ajax = null; //如果支持XMLHttpReques对象,则创建。反之,则创建ActiveXObject对象 if(window.XMLHttpRequest){ ajax = new XMLHttpRequest(); }else{ ajax = new ActiveXObject("Microsoft.XMLHTTP"); } return ajax; }; ajax = createAJAX(); //当服务做出相应的时候,就会调用该方法 ajax.onreadystatechange = function(){ alert("ajax状态改变了!"); }</script>
(二)readyState状态属性、status状态码、statusText状态文本信息
1、readyState 属性表示Ajax请求的当前状态。它的值用数字代表。
每次 readyState 值的改变,都会触发 readystatechange 事件。readyState 值的变化会因浏览器的不同而有所差异。当请求结束的时候, readyState 的值统一为 4。
- 0 代表未初始化。 还没有调用 open 方法
- 1 代表正在加载。 open 方法已被调用,但 send 方法还没有被调用
- 2 代表已加载完毕。send 已被调用。请求已经开始
- 3 代表交互中。服务器正在发送响应
- 4 代表完成。响应发送完毕
2、status
服务器发送的每一个响应也都带有首部信息。三位数的状态码是服务器发送的响应中最重要的首部信息,并且属于超文本传输协议中的一部分。在 XMLHttpRequest 对象中,服务器发送的状态码都保存在 status 属性里。通过把这个值和 200 比较,可以确保服务器是否已发送了一个成功的响应。
常用状态码及其含义:
- 404 没找到页面(not found)
- 403 禁止访问(forbidden)
- 500 内部服务器出错(internal service error)
- 200 一切正常(ok)
- 304 没有被修改(not modified)(服务器返回304状态,表示源文件没有被修改 )
3、statusText
服务器返回的状态文本信息。
(三)responseText、responseXML响应属性
1、responseText
responseText 属性包含了服务器返回字符串形式的响应。当 readyState 属性值变成 4 时, responseText 属性才可用,表明 Ajax 请求已经结束。
2、responseXML
如果服务器返回的是 XML, 那么数据将储存在 responseXML 属性中。只要服务器发送了带有正确首部信息的数据时, responseXML 属性才是可用的。 MIME 类型必须为 text/xml
(三)XMLHttpRequest对象属性的使用
- AJAX实质上也是遵循B/S模式,所以这个框架基本的流程是:
- 对象初始化
发送请求
服务器接收
服务器响应
客户端接收
修改客户端页面内容。
现在,我们试着用ajax来和一个servlet服务端来请求当前时间。并将服务器返回的时间,显示出来。
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Insert title here</title><script src="js/jquery-3.2.1.js"></script></head><body> <button id="b1">点击</button> <span id="s1">当前时间为:</span></body><script> function createAJAX(){ var ajax = null; //如果支持XMLHttpReques对象,则创建。反之,则创建ActiveXObject对象 if(window.XMLHttpRequest){ ajax = new XMLHttpRequest(); }else{ ajax = new ActiveXObject("Microsoft.XMLHTTP"); } return ajax; }; $("#b1").click(function(){ var ajax = createAJAX(); if(ajax!=null){ //准备发送 ajax.open("GET","${pageContext.request.contextPath}/Servlet"); //发送到服务端,假如请求体没有数据则参数为null ajax.send(null); //ajax异步对象不断监听服务器响应 ajax.onreadystatechange = function(){ //判断ajax异步对象的的状态变化 // readyState 属性值变成 4 时,表明 Ajax 请求已经结束 //status为200时,表忙Ajas的请求一切都完好 if(ajax.readyState ==4 &&ajax.status==200){ //从ajax异步对象中获取服务端的响应信息 var date = ajax.responseText; //这里就完整地实现了与服务器之间进行了数据的交流,不用刷新整个页面,却改变html页面部分 $("#s1").html("当前时间为:"+date); } } } });</script></html>
servlet对ajax的请求做出的响应
package servlet;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Date;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/Servlet")public class Servlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取当前的时间,返回给ajax SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String date = sdf.format(new Date()); //设置编码格式 response.setContentType("text/html;charset=utf-8"); //返回给ajax数据,是需要使用输出流的 PrintWriter pw = response.getWriter(); pw.write(date); pw.flush(); pw.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
五、jQuery.ajax(url,[settings])(jQuery 底层 AJAX 实现)
很明显,使用AJAX步骤比较繁琐,我们可以使用jQuery的ajax(url,[settings])减少一些步骤。 JQuery的ajax(url,[settings])
方法,简单易用的高层实现见
该方法返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该函,除非你需要操作不常用的选项,以获得更多的灵活性。最简单的情况下,$.ajax()
可以不带任何参数直接使用。
注意,所有的选项都可以通过$.ajaxSetup()函数来全局设置。
- url:一个用来包含发送请求的URL字符串。
- settings:AJAX 请求设置。所有选项都是可选的。
(一)回调函数
如果要处理$.ajax()
得到的数据,则需要使用回调函数。beforeSend、error、dataFilter、success、complete。
- beforeSend 在发送请求之前调用,并且传入一个XMLHttpRequest作为参数。
- error 在请求出错时调用。传入XMLHttpRequest对象,描述错误类型的字符串以及一个异常对象(如果有的话)
- dataFilter 在请求成功之后调用。传入返回的数据以及”dataType”参数的值。并且必须返回新的数据(可能是处理过的)传递给success回调函数。
- success 当请求之后调用。传入返回后的数据,以及包含成功代码的字符串。
- complete 当请求完成之后调用这个函数,无论成功或失败。传入XMLHttpRequest对象,以及一个包含成功或错误代码的字符串。
(二)一些settings选项的介绍
1、async
(默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。
2、complete(XHR, TS)
请求完成后回调函数 (请求成功或失败之后均调用)。参数: XMLHttpRequest 对象和一个描述成功请求类型的字符串。 Ajax 事件。
function (XMLHttpRequest, textStatus) { // }
3、statusCode
一组数值的HTTP代码和函数对象,当响应时调用了相应的代码。例如,如果响应状态是404,将触发以下警报:
$.ajax({ statusCode: {404: function() { alert('page not found'); }});
4、success(data, textStatus, jqXHR)
请求成功后的回调函数。参数:由服务器返回,并根据dataType参数进行处理后的数据;描述状态的字符串。还有 jqXHR(在jQuery 1.4.x的中,XMLHttpRequest) 对象 。每个函数将被依次调用。 Ajax 事件。
function (data, textStatus) { //}
5、type
(默认: “GET”) 请求方式 (“POST” 或 “GET”), 默认为 “GET”。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。
6、url
(默认: 当前页地址) 发送请求的地址。
7、data
发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:[“bar1”, “bar2”]} 转换为 “&foo=bar1&foo=bar2”。
8、error
请求失败时调用此函数。有以下三个参数:XMLHttpRequest 对象、错误信息、(可选)捕获的异常对象。如果发生了错误,错误信息(第二个参数)除了得到null之外,还可能是”timeout”, “error”, “notmodified” 和 “parsererror”。Ajax 事件。
function (XMLHttpRequest, textStatus, errorThrown) { // }
9、dataType
预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如XML MIME类型就被识别为XML。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:
- “xml”: 返回 XML 文档,可用 jQuery 处理。
- “html”: 返回纯文本 HTML 信息;包含的script标签会在插入dom时执行。
- “script”: 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了”cache”参数。”’注意:”’在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(因为将使用DOM的script标签来加载)
- “json”: 返回 JSON 数据 。
- “jsonp”: JSONP 格式。使用 JSONP 形式调用函数时,如 “myurl?callback=?” jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
- “text”: 返回纯文本字符串
(三)ajax(url,[settings])方法的使用
前面,我们使用ajax想服务器请求当前的时间,需要写一大段代码,限制我们使用ajax(url,[settings])方法。
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Insert title here</title><!-- 导入jQuery包 --><script src="js/jquery-3.2.1.js"></script></head><body> <form id="form1"> <input name="username" type="text" /> <input name="password" type="password" /> <button id="b1" type="submit">登陆</button> </form></body><script> //1、现在我们只需要少量的代码就能实现,前面想服务器请求当前的时间的功能 $.ajax({ //设置请求类型,get类型是默认类型,可以省略 type:"GET", //设置请求url url:"Servlet", //请求成功回调函数,用于显示服务的响应 success: function(data){ alert(data); }, //请求失败回调函数 error: function(){ alert("请求失败"); } }); //这里也可以使用ajax对象的responseText,来获取服务器的响应 var resp = $.ajax({ url:"Servlet", //同步加载数据。发送请求时锁住浏览器。需要锁定用户交互操作时使用同步方式。 async: false, }).responseText; alert(resp); //2、向服务器提交参数 $.ajax({ //设置请求方式 type: "POST", //设置请求url url: "Servlet", //提交发送到服务器的数据 data: "name=John&location=Boston", success: function(msg){ alert( "Data Saved: " + msg ); } }); //提交一个表单到servlet $("#b1").click(function(){ $.ajax({ //设置请求方式 type:"POST", //设置请求url url:"Servlet", //提交发送到服务器的数据,将表单内容序列化为字符串,用于 Ajax 请求。 data:$("#form1").serialize(), success: function(){ alert("请求成功"); } }) });</script></html>
更过详细信息参考 jQuery api
注:ajax请求到后台的servlet类中,servlet类转发请求,和重定向都不会生效。至于为什么不能跳转不是很清楚。但是可以从ajax的应用上去解释,之所以用ajax就是为了页面不刷新的状态下,改变页面局部。所以当然也就不能跳转。
当然,也可以通过ajax的回调函数,来获取servlet的输入的url,通过widow.location.href来进行页面的转发。
- Ajax 基础
- Ajax基础
- Ajax基础
- AJAX基础
- AJAX基础
- ajax基础
- ajax基础
- Ajax 基础
- ajax基础
- AJAX基础
- AJAX 基础
- Ajax基础
- Ajax基础
- AJAX 基础
- ajax基础
- AJAX基础
- Ajax基础
- Ajax基础
- 关于数据库备份
- POJ 3083 Children of the Candy Corn 笔记
- java中数组的定义及其基础应用
- android仿微信消息长按根据触摸位置弹出对话框
- 1032. Sharing (25)
- AJAX基础
- 170718 python3.x install PIL
- Crazy Learning for Day 19
- 一次关于ETCD客户端(ETCD4J)问题的定位
- 一分钟了解“c语言printf函数”
- TCP-IP学习笔记(三)——概述
- C语言32个关键字(分类)
- 正则ES5-6
- mysql触发器的一个小栗子