Ajax

1、概念

Ajax,Asynchronous JavaScript And Xml。异步的javascript和XML
JavaScript负责发送请求,XML作为一种响应的数据

Ajax主要用来增强用户体验。因为它是浏览器与服务器之间进行异步交互,而无需刷新页面的技术
它只会局部更新页面,而不用刷新整个窗口

2、异步和同步

⑴ 同步请求
当向服务器发请求时,必须得到响应成功后,才能发送其他的请求,有一个等待的过程,而且响应成功后会刷新整个页面

⑵ 异步请求
当向服务器发请求时,不用等响应成功,就可以发送其他请求,不需要等待,而且响应成功后局部刷新页面

3、发送Ajax请求

步骤

⑴ 创建XMLHttpRequest对象
Ajax的所有操作,都由该对象完成

⑵ 设置请求信息
⑶ 发送请求
⑷ 接收响应

相关函数和属性

XMLHttpRequest

new XMLHttpRequest();
创建XMLHttpRequest对象

open

open(method, url, async, username, password);
设置请求参数

method:请求方式。可选值有GET和POST,不区分大小写
url:请求地址
async:设置当前请求是否异步【true】;同步【false】。默认是true
username:用户名
password:密码
当发送的请求需要权限时,使用username和password

send

send(body);
发送请求
send方法中传入一个Object类型的请求体。GET请求没有请求体,可以不传

如果是POST请求,则可以在里面写入请求参数字符串,格式:
键1=值1&键2=值2

setRequestHeader

setRequestHeader(header, value);
设置请求头信息
一般用于:
当发送POST请求时,需要设置一个请求头对请求体中的请求参数进行URL编码

setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
注意:
⑴ 这是固定写法, 不能修改,否则无效
⑵ 当发送POST请求时,如果不添加该语句,则服务器将无法获取请求参数(null)
⑶ 该语句需要写在open函数的下面,send函数的上面
⑷ GET请求的参数是写在URL地址中的,故该方法对GET请求的参数无效

这个参数就是form表单中的enctype属性

<form enctype="application/x-www-form-urlencoded" ></form>
enctype属性规定在发送到服务器之前应该如何对表单数据进行编码
application/x-www-form-urlencoded
在发送前编码所有字符(默认)

responseText

XMLHttpRequest的属性
接收响应的文本内容

注意:不是说已发送请求,就可以接收响应。这期间有一个等待的过程。需要给XMLHttpRequest的onreadystatechange,设置一个事件,来监听是否响应已经就绪

onreadystatechange

onreadystatechange
每当 readyState 改变时,就会触发 onreadystatechange 事件

readyState

XMLHttpRequest的属性
存有 XMLHttpRequest 的状态。从 0 到 4 发生变化

0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪
status

XMLHttpRequest的属性

200: "OK"
404: 未找到页面
当 readyState 等于 4 且状态为 200 时,表示响应已就绪:

xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
responseXML

XMLHttpRequest的属性
接收响应的XML数据

同responseText一样,接收数据时,有一个等待的过程

注意:Servlet发送XML的响应时,需要提前声明响应的类型:

response.setContentType("text/xml;charset=UTF-8");
否则xmlhttp.responseXML无法获取响应的内容(null)

获取XML数据中的子元素的文本内容

⑴ 接收响应的XML数据
var docEle = xmlhttp.responseXML;

⑵ 获取子元素标签
var childEle = docEle.getElementsByTagName(“子元素标签名”)[下标];

⑶ 获取子元素标签的第一个子节点(文本节点)
var textNode = childEle.firstChild;

⑷ 获取文本节点的文本内容
var text = textNode.nodeValue;

GET请求示例

【JavaScript代码】

<script type="text/javascript">
window.onload = function(){
var btn = document.getElementById("btn");
btn.onclick = function(){
// 创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();

//设置请求信息
xhr.open("GET", "${pageContext.request.contextPath}/ajaxServlet");

// 发送请求【GET请求没有请求体】
xhr.send();

// 给XMLHttpRequest对象,绑定state改变的函数
xhr.onreadystatechange = function(){
// var readyState = xhr.readyState;
// var statusNum = xhr.status;
// console.log(readyState + " : " + statusNum);

// 当请求已完成,且响应已就绪【readyState等于4】
// 当响应状态码为200时
if (4 == xhr.readyState && 200 == xhr.status) {
// 获取请求内容
var text = xhr.responseText;
var h1 = document.getElementById("h1");
h1.innerHTML = text;
}
};

};
};
</script>
【body内容】

<input id="btn" type="button" value="通过按钮发送GET请求" />
<h1 id="h1"></h1>
【AjaxServlet】

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().println("响应内容");
}
POST请求示例

【JavaScript代码】

<script type="text/javascript">
window.onload = function(){
document.getElementById("btn").onclick = function(){
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "${pageContext.request.contextPath}/ajaxServlet");
// 对POST的请求参数进行URL编码
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// 发送请求参数
xmlhttp.send("name=张三&password=1234");
xmlhttp.onreadystatechange = function(){
if (4 == xmlhttp.readyState && 200 == xmlhttp.status) {
var text = xmlhttp.responseText;
alert(text);
}
};
};
};
</script>
【body内容】

<button id="btn">发送POST请求</button>
【AjaxServlet】

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置解析请求参数的编码格式
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String password = request.getParameter("password");
System.out.println("name: " + name + ", password: " + password);

// 设置响应编码
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("响应POST请求");
}
示例响应数据是XML

【JavaScript代码】

<script type="text/javascript">
window.onload = function(){
document.getElementById("btn").onclick = function(){
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "${pageContext.request.contextPath}/ajaxServlet");
xmlhttp.send();
xmlhttp.onreadystatechange = function(){
if (4 == xmlhttp.readyState && 200 == xmlhttp.status) {
// 接收响应的XML数据
var DocEle = xmlhttp.responseXML;
// 获取第一个name子元素
var nameEle = DocEle.getElementsByTagName("name")[0];
// 获取name元素的第一个子节点
var nameNode = nameEle.firstChild;
// 获取节点值
var name = nameNode.nodeValue;
alert("name: " + name);
}
};
};
};
</script>
【body内容】

<button id="btn">获取XML响应</button>
【AjaxServlet】

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体类型为XML
response.setContentType("text/xml;charset=UTF-8");
String xml =
"<person>" +
"<name>张三</name>" +
"<age>14</age>" +
"</person>";
response.getWriter().write(xml);
}
4、兼容IE5和IE6

问题

由于IE5和IE6不认识XMLHttpRequest,所以IE5和IE6无法使用XMLHttpRequest

IE5找不到XMLHttpRequest

这时就需要使用ActiveX 对象

new ActiveXObject("Microsoft.XMLHTTP");
通过这种方式得到的对象,就可以使用Ajax了

封装一个函数,用来创建对象

function createXMLHttp() {
var xmlhttp;
try {
xmlhttp = new XMLHttpRequest();
} catch (e) {
// 出错了,就创建ActiveXObject对象
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("您的浏览器不支持Ajax!");
}
}

return xmlhttp;
};
再创建对象的时候,就调用函数即可:

var xmlhttp = createXMLHttp();
5、JSON

概念

JavaScript Object Notation,JavaScript的对象表示法。是一种轻量级的数据交换格式
它是一种可以跨平台,跨语言的数据交换格式
由于XML格式的数据,解析复杂、性能查,所以现在基本已被JSON所代替

对比:
【XML格式数据】

<person>
<name>张三</name>
<age>14</age>
</person>
【JSON格式数据】

{"name":"张三", "age":14}
JSON格式

JSON对象

{“属性名1”:”属性值1”, “属性名2”:”属性值2”, …}

注意事项:
⑴ 属性名必须使用双引号(”“)引起来
⑵ 属性名和属性值之间用冒号(:)分割
⑶ 多个属性之间,用逗号(,)分割

JSON数组

[属性值1, 属性值2, 属性值3, …]

多个属性值之间用逗号(,)分割

JSON属性可以使用的类型

字符串
数字
布尔类型
null
对象
数组
在JavaScript中JSON对象与JSON字符串互转

JSON字符串转JSON对象

JSON.parse(JSON字符串);
得到一个Object类型的JSON对象

JSON对象转JSON字符串

JSON.stringify(JSON对象);
得到一个JSON字符串

使用示例

// 创建JSON字符串
var jsonStr = '{"name":"张三", "age":14}';
// 创建JSON对象
var jsonObj = {
"name":"李四",
"age":12
};

// 将JSON字符串转换为JSON对象
var Object = JSON.parse(jsonStr);
// 获取name属性值
alert(Object.name);

// 将JSON对象转换为JSON字符串
var str = JSON.stringify(jsonObj);
alert(typeof str);
alert(str);
在Java中JSON对象与JSON字符串互转

方法

需要调用Gson类里的方法,导入gson-2.2.4.jar包

new Gson();
创建一个Gson对象

public String toJson(Object src) {}
将Object对象转换为JSON字符串

public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException {}
将JSON字符串转换为Object类型的对象

使用示例

【Person(JavaBean)】

String类型的name和age,提供有参构造,重写toString方法
【JavaScript代码】

<script type="text/javascript">
window.onload = function(){
document.getElementById("btn").onclick = function(){
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "${pageContext.request.contextPath}/ajaxServlet");
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// 创建JSON字符串
var jsonStr = '{"name":"张三", "age":14}';
// 发送请求
xmlhttp.send("jsonStr=" + jsonStr);
xmlhttp.onreadystatechange = function(){
if (4 == xmlhttp.readyState && 200 == xmlhttp.status) {
var respJSONStr = xmlhttp.responseText;
alert(respJSONStr);
// 将获取到的JSON字符串转换为JSON对象
var jsonObj = JSON.parse(respJSONStr);
alert(jsonObj.name);
}
};
};
};
</script>
【body内容】

<button id="btn">发送JSON对象,获取JSON字符串</button>
【AjaxServlet】

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置请求字符集编码
request.setCharacterEncoding("UTF-8");
// 设置相应字符类型
response.setContentType("text/html;charset=UTF-8");

// 获取请求参数【JSON字符串】
String jsonStr = request.getParameter("jsonStr");
// 创建Gson对象
Gson gson = new Gson();
// 转换为Object
Object obj = gson.fromJson(jsonStr, Person.class);
System.out.println(obj);

// 创建一个Person对象
Person person = new Person("李四", "12");
// 将对象转换为JSON字符串
String respJSONStr = gson.toJson(person);
response.getWriter().write(respJSONStr);
}
测试将Map集合转换为JSON字符串

Map<String, Person> map = new HashMap<String, Person>();
map.put("p1", new Person(1, "张三", 14));
map.put("p2", new Person(2, "李四", 17));
map.put("p3", new Person(3, "王五", 12));

Gson gson = new Gson();

/*
* {
* "p1":{
* "id":1,
* "name":"张三",
* "age":14
* },
* "p2":{
* "id":2,
* "name":"李四",
* "age":17
* },
* "p3":{
* "id":3,
* "name":"王五",
* "age":12
* }
* }
*/
String jsonStr = gson.toJson(map);
System.out.println(jsonStr);

/*
* {
* p1={
* id=1.0,
* name=张三,
* age=14.0
* },
* p2={
* id=2.0,
* name=李四,
* age=17.0
* },
* p3={
* id=3.0,
* name=王五,
* age=12.0
* }
* }
*/
Object obj = gson.fromJson(jsonStr, Map.class);
System.out.println(obj);
6、使用jQuery发送Ajax请求

发送GET请求

$.get(url, [data], [callback], [type]);
url:待载入页面的URL地址
data:待发送 Key/value 参数。一个Object类型的对象
callback:载入成功时回调函数
type:返回内容格式,xml, html, script, json, text, _default

发送POST请求

$.post(url, [data], [callback], [type]);
其参数和get函数里的参数一样

默认获取的响应类型为JSON

$.getJSON(url, [data], [callback]);
其参数和get函数里的前三个参数一样

Tips:该函数等同于

$.get(url, [data], [callback], "json");
即最后一个参数【获取到的响应的格式】指定为了json

注意:
⑴ 该函数需要调用Servlet中的doGet方法来处理请求
⑵ 响应参数是JSON字符串,其会被自动转换为JSON对象[object Object]

测试GET和POST请求

【jQuery代码】

<script type="text/javascript">
$(function(){
$("#getBtn").click(function(){
// 请求地址
var url = "${pageContext.request.contextPath}/ajaxServlet";
// 请求参数
var data = {
"name":"张三",
"age":14
};
// 响应成功的回调函数
var fun = function(data){
alert(data);
};
// 响应类型
var type = "text";
$.get(url, data, fun, type);
});

$("#postBtn").click(function(){
var url = "${pageContext.request.contextPath}/ajaxServlet";
$.post(url, function(data){
alert(data);
}, "text");
});
});
</script>
【body内容】

<input id="getBtn" type="button" value="发送GET请求" /><br /><br />
<input id="postBtn" type="button" value="发送POST请求" />
【AjaxServlet】

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println("name: " + name + ", age: " + age);

response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("响应GET请求");
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("响应POST请求");
}
测试接收JSON响应

【Person(JavaBean)】

String类型的name和age,提供有参构造
【jquery代码】

<script type="text/javascript">
$(function(){
$("#getJSONBtn").click(function(){
var url = "${pageContext.request.contextPath}/ajaxServlet";
$.getJSON(url, function(data){
alert(data);
alert(data.name);
});
});

$("#getBtn").click(function(){
var url = "${pageContext.request.contextPath}/ajaxServlet";
$.get(url, function(data){
alert(data);
alert(data.name);
}, "json");
});
});
</script>
【body内容】

<input id="getJSONBtn" type="button" value="通过getJSON函数获取JSON字符串响应" /><br /><br />
<input id="getBtn" type="button" value="通过get函数获取JSON字符串响应" />
【AjaxServlet】

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Person person = new Person("张三", "14");
Gson gson = new Gson();
String jsonStr = gson.toJson(person);

response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(jsonStr);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值