ajax主要用于与服务器进行异步交互数据(当然技术上也能做同步处理)。
因为传统的非ajax的web交互,是整个浏览器将数据传到后台处理,而后台处理时,用户只能等待,这样就非常效率低下。而且服务器会返回整个html页面,用户还得等待整个页面加载。这样是非常浪费资源。
ajax就可以做到在用户触发ajax请求的同时,任然能够进行操作,并且服务处理且返回数据时不进行页面重新加载,而用户也可以得到想要的数据。
以下直接通过代码和相应注释解释ajax请求过程
1 function buttonOnClick() {
2 // 页面数据
3 var info = 'content=' + document.getElementById('contentId').value;
4 // xhr对象
5 var xhr;
6 /*
7 * XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力。
8 * XMLHttpRequest 可以同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。
9 * XMLHttpRequest 得到了所有现代浏览器较好的支持。唯一的浏览器依赖性涉及 XMLHttpRequest 对象的创建。 在 IE 5 和
10 * IE 6 中,必须使用特定于 IE 的 ActiveXObject() 构造函数 以上说明来自W3school
11 */
12 if (window.XMLHttpRequest) {
13 xhr = new XMLHttpRequest();
14 } else {
15 xhr = new ActiveXObject('Microsoft.XMLHTTP');
16 }
17 xhr.onreadystatechange = function() {
18 /*
19 * 0 Uninitialized 初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置。 1 Open
20 * open() 方法已调用,但是 send() 方法未调用。请求还没有被发送。 2 Sent Send() 方法已调用,HTTP
21 * 请求已发送到 Web 服务器。未接收到响应。 3 Receiving 所有响应头部都已经接收到。响应体开始接收但未完成。 4 Loaded
22 * HTTP 响应已经完全接收。 readyState 的值不会递减
23 */
24 if (xhr.readyState == 4) {
25 // status为http状态码,内容过多,不详细展开,大体分为五类
26 /*
27 * 1XX 100-101 信息提示 2XX 200-206 成功 3XX 300-305 重定向 4XX 400-415 客户端错误
28 * 5XX 500-505 服务器错误
29 */
30 if (xhr.status == 200) {//表示成功
31 /*
32 * responseText 响应内容作为文本
33 *
34 * responseXML 响应内容作为xml文档
35 */
36 return ajaxsuccess(xhr.responseText);
37 }
38 }
39 }
40 /*
41 * 第一个参数为发送请求方式,常用POST/GET,不区分大小写,但是通常大写。
42 * ‘GET’用于常规请求,它适用于URL完全指定的资源。当请求对服务器没有任何副作用是可缓存的情况下,
43 * ‘POST’常用于含有额外的数据的请求
44 *
45 * 第二个参数为url
46 *
47 * 第三个参数为是否异步请求,默认为true,异步请求
48 */
49 xhr.open('POST', '/WebDemo/ServletDemoA', true);
50
51 /*
52 * Http Header里的Content-Type一般有这三种:
53 *
54 * application/x-www-form-urlencoded:数据被编码为名称/值对。这是标准的编码格式。
55 *
56 * multipart/form-data: 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain:
57 *
58 * 数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。postman软件里标的是RAW。
59 *
60 * form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。
61 *
62 * 上传文件时。
63 * 也就是有type=file控件,要用multipart/form-data了,指定传输数据为二进制类型
64 *
65 * 当action为post且Content-Type类型是multipart/form-data,浏览器会把整个表单以控件为单位分割,
66 * 并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
67 *
68 * 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串追加到url后面,用?分割,加载这个新的url。
69 *
70 * 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。
71 * 因为url长度有限所以get请求的数据是有限的,而post无限
72 */
73 // Content-type详细内容见Content-type对照表
74 xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
75 xhr.send(info);
76 }
77
78 function ajaxsuccess(resTxt) {
79 console.log('成功');
80 console.log(resTxt);
81 }
简单且常用的原生ajax过程
以下是servlet代码
1 /**
2 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
3 * response)
4 */
5 protected void doPost(HttpServletRequest request, HttpServletResponse response)
6 throws ServletException, IOException {
7 /*
8 * 本例中
9 * 分号之前
10 *'/'之前 媒体格式,常见text application
11 * text/plain 为普通文本
12 *
13 *'/'之后 常用的有
14 * html html代码
15 * xml xml
16 * javascript js
17 * json json对象
18 * 详细见content-Type对照表
19 *
20 * utf-8 为编码格式,不详细展开,都懂。。。。
21 */
22 response.setContentType("text/plain;charset=utf-8");
23 // 传输的数据到前台
24 // response.getWriter().write("success");
25 // 完成操作的对象为java.io.PrintWriter,通过io输出流传递数据
26 PrintWriter writer = response.getWriter();
27 writer.write("success");
28 }
补充说明
contentType是向服务器说明输出的数据是什么。
而在jqeury中的ajax有一个属性dataType,是用于说明要接受的数据类型,并强制转换,并且可能导致失败。
当dataType没指定时,将会自动推断并将返回数据转型,特别是contentType中指明数据类型时。
要是dataType有指定,则无论contentType内容,都将返回的数据转换为dataType指定类型。