Ajax技术应用

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("登录失败");
				}
		});

 

转载于:https://my.oschina.net/ProgramerLife/blog/2055988

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值