1. 相关概述
1. ajax:即异步js与xml,可以实现客户端与服务端之间数据的异步交互。对于普通的B/S 模式是采用的同步方式,即一次请求必须等待一次服务器响应完成,而异步则是客户端发送请求后,不需要等待服务器响应,浏览器此时可以继续发送其他请求。
2. ajax技术可以与服务端数据交互:数据类型有
- 传输纯文本 text
- 传输xml
- 传输json数据(常用)
3. ajax简单开发步骤(接受纯文本数据响应):在js中编写代码
- 首先获取XMLHttpRequest对象xhr,通过该对象来进行数据交互
- 通过XMLHttpRequest对象与服务器建立连接,使用xhr.open()方法,方法中有3个参数,第一个是请求方式(比如"GET"或"POST"),第二个参数是请求资源地址(比如"/Servlet/ajax/demo1"),第三个为true或false,表示是否为异步请求
- 通过XMLHttpRequest对象发送请求数据,调用 xhr.send()方法,方法中参数代表请求体的内容,比如"username=vn&password=1"
- 如果是get请求,则send(null),请求参数直接在open()方法的路径中拼接参数;
- 如果是post请求,则send("username=vn&password=1"),此外还需要设置一个请求头xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
- 接受服务器做出的响应,通过xhr.onreadystatechange来监听xhr的状态变化,状态用xhr.readyState来表示,其值用0-4五个数字表示,0表示刚创建XMLHttpRequest对象,1表示连接服务器,但是没有发送请求,2表示发送完请求但服务端还未响应,3表示服务端响应还未完成,4表示响应完成。用xhr.status表示响应状态码,比如200、302、304、500等。
- 获取相应内容,通过xhr.responseText来获取响应体中的纯文本内容;xhr.responseXML获取响应体中的xml内容,实际上也是一串字符串,但浏览器会自动解析为Document对象;
<!DOCTYPE html>
<html>
<head>
<title>Ajax1.html</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
//ajax异步请求实现步骤
//首先得到XMLHttpRequest对象
function createXMLHttpRequest() {
try {
//大多数浏览器通过该方法来获取
return new XMLHttpRequest();
} catch (e) {
try {
//IE6
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
//IE5以下版本
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("浏览器不支持");
}
}
}
}
function send(){
var xhr=createXMLHttpRequest();
//建立连接
xhr.open("GET", "/Servlet/ajax/ajax1", true);
//发送数据
xhr.send(null);
//通过XMLHttpRequest对象的状态监听器接收响应
xhr.onreadystatechange=function(){
//判断是否接受到响应
if(xhr.readyState==4&&xhr.status==200){
//获取响应体中的纯文本内容
var text=xhr.responseText;
var h=document.getElementById("h");
h.innerHTML=text;
//获取响应体中的xml内容,实际上也是一串字符串,但浏览器会自动解析为Document对象
//var doc=xhr.responseXML;
//获取响应体中的json数据
//var =xhr.responseType;
}
};
}
</script>
</head>
<body>
<button onclick="send()">发送请求</button>
<h3 id="h"></h3>
</body>
</html>
4. ajax接受响应的xml数据:xml数据实际上也是一个字符串,比如"<user><name>vn</name></user>"
- 服务端:需要将响应头设置为resp.setHeader("Content-Type", "text/xml;charset=utf-8");
- 客户端接受数据通过xhr.responseXML获取响应体中的xml内容,实际上也是一串字符串,但浏览器会自动解析为Document对象
<!DOCTYPE html>
<html>
<head>
<title>Ajax1.html</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
//ajax异步请求实现步骤
//首先得到XMLHttpRequest对象
function createXMLHttpRequest() {
try {
//大多数浏览器通过该方法来获取
return new XMLHttpRequest();
} catch (e) {
try {
//IE6
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
//IE5以下版本
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("浏览器不支持");
}
}
}
}
function getxml(){
var xhr=createXMLHttpRequest();
//建立连接
xhr.open("GET", "/Servlet/ajax/ajax2", true);
//发送数据
xhr.send(null);
//通过XMLHttpRequest对象的状态监听器接收响应
xhr.onreadystatechange=function(){
//判断是否接受到响应
if(xhr.readyState==4&&xhr.status==200){
//获取响应体中的xml内容,得到的是一个document对象,代表着xml文件中的根节点
var doc=xhr.reresponseXML;
var user=doc.getElementsByTagName("user")[0];//获取user标签节点
var name=user.getAttribute("name");//获取user标签的name属性值
var age=user.getElementsByTagName("age")[0];
var text=age.textContent;//获取age标签内的文本内容
var h=document.getElementById("h");
h.innerHTML=name+" "+text;
}
};
}
</script>
</head>
<body>
<button onclick="getxml()">获取xml数据</button>
<h3 id="h"></h3>
</body>
</html>
public class AjaxServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("Content-Type", "text/xml;charset=utf-8");
resp.getWriter().write("<users><user name='vn'><age>18</age></user></users>");
}
}
5. 使用Xstream工具类将javaBean转换为xml格式的字符串:需要导入xstream的相关jar包
import org.junit.Test;
import com.thoughtworks.xstream.XStream;
import servlet.JSP.User;
public class XtreamTest {
@Test
public void test(){
XStream xs=new XStream();
User user=new User();
user.setName("vn");
user.setPassword("123456");
String xml=xs.toXML(user);//通过该方法可以将一个对象转换为xml格式的字符串,但各个标签名可能不是想要的所以进行改造
System.out.println(xml);
//不经改造得到的字符串为
/*
* <servlet.JSP.User>
<name>vn</name>
<password>123456</password>
</servlet.JSP.User>
*/
//改造标签节点名
xs.alias("user", user.getClass());
xml=xs.toXML(user);
System.out.println(xml);
//改造后
// <user>
// <name>vn</name>
// <password>123456</password>
// </user>
}
}
6. ajax通过json数据交互:json数据可以由js来直接解析,这是最常用的一种方式。var json={},即json是一个对象,json对象有属性名与属性值,属性名必须用双引号;属性值包括null,数值,单引号或双引号括起来的字符串,用[ ]括起来的数组,以及bool值true或false,如果json对象中的属性还是一个json对象,那么就再嵌套一个 { }来表示。比如
{
"user":{"username":"vn","age":18},
"password":"123456",
"hobby":["篮球","足球"]
"isStudent":true
}
前端js解析json格式字符串代码
<script type="text/javascript">
function createXMLHttpRequest() {
try {
//大多数浏览器通过该方法来获取
return new XMLHttpRequest();
} catch (e) {
try {
//IE6
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
//IE5以下版本
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("浏览器不支持");
}
}
}
}
function send(){
var xhr=createXMLHttpRequest();
//建立连接
xhr.open("GET", "/Servlet/ajax/ajax3", true);
//发送数据
xhr.send(null);
//通过XMLHttpRequest对象的状态监听器接收响应
xhr.onreadystatechange=function(){
//判断是否接受到响应
if(xhr.readyState==4&&xhr.status==200){
//获取响应体中的json格式文本内容
var text=xhr.responseText;
//解析json格式字符数据,使用eval()进行解析成一个json对象
var user=eval("("+text+")");
var h=document.getElementById("h");
h.innerHTML=user.name+":"+user.age;
}
};
}
</script>
后端可以使用工具类JavaBean对象转换成为一个json格式字符串,不需要手动拼接
import org.junit.Test;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import servlet.JSP.User;
public class JavaBeanToJson {
@Test
public void javaBeanToJson(){
//JsonArray相当于java中的Map
JSONObject obj=new JSONObject();
obj.put("name", "vn");
obj.put("age", 20);
String json=obj.toString();
System.out.println(json);
//将JavaBean对象转换为json数据
User user=new User();
user.setName("vn");
user.setPassword("123456");
obj=JSONObject.fromObject(user);
System.out.println(obj.toString());
//JsonArray相当于java中的List
JSONArray array=new JSONArray();
array.add(user);
System.out.println(array.toString());
}
}
5. 在一些js框架中,对ajax技术进行了封装,比如在jQuery中,可以通过以下方式来进行ajax异步交互
$.ajax({url:"/cloud_note/user/login.do",//填写请求路径
type:"post",//填写请求方式
data:{"name":name,"password":password},//请求参数,即要发送的请求数据
dataType:"json",//发送的请求数据的类型
//如果请求发送成功,并且接收到响应数据时,响应数据存储在方法参数result中,然后调用此函数
success:function(result){
if(result.status==0){
$("#count_span").html(result.msg);
}else if(result.status==1){
$("#password_span").html(result.msg);
}else{
var userId=result.data.cn_user_id;
addCookie("userId",userId,2);
window.location.href="edit.html";
}
},
//请求发送失败,调用此函数
error:function(){
alert("登录失败");
}
});