AJAX详解

1.AJAX是什么?
AJAX即“Asynchronous JavaScript and XML”(异步的JavaScript与XML技术),指的是一套综合了多项技术的浏览器端网页开发技术。

2.异步交互和同步交互
同步:
(1)发一个请求,就要等待服务器的响应结束,然后才能发第二个请求!中间这段时间就是一个字“卡”
(2)刷新的是这个页面

异步:
(1)发一个请求后,无需等待服务器的响应,然后就可以发第二个请求!
(2)可以使用js接口服务器的响应,然后使用js来局部刷新

【示例】使用JS点击按钮触发事件,设置内容改变标签内容(局部刷新)

3.AJAX常见应用情景和优缺点
3.1 应用情景
(1)当我们在百度中输入一个"Java"后,会马上出现一个下拉列表!列表中显示的是包含"Java"字的10个关键字。

其实这里就使用了AJAX技术!当文件框发生了输入变化时,浏览器会使用AJAX技术向服务器发送一个请求,查询包含"Java"的前10个关键字,然后服务器会把查询到的结果响应给浏览器,最后浏览器把这10个关键字显示在下拉列表中。

整个过程中页面没有刷新,只是刷新页面中的局部位置而已。
当请求发出后,浏览器还可以进行其它操作,无需等待服务器的响应。

(2)当输入用户名后,把光标移动到其它表单项上时,浏览器会使用AJAX技术向服务器发出请求,服务器会查询名为张三的用户是否存在,最终服务器返回true表示名为张三的用户已经存在了,浏览器在得到结果后显示"用户名已被注册!"。

整个过程中页面没有刷新,只是局部刷新了
在请求发出后,浏览器不用等待服务器响应结果就可以进行其它操作。

=========================================
百度的搜索框
用户注册时(校验用户是否存在)

4.AJAX的优缺点
优点:异步交互:增强了用户的体验
性能:因为服务器无需再响应整个页面,只需要响应部分内容,所以服务器的压力减轻了!

缺点:
ajax不应用在所有场景
ajax无端的增多了对服务器的访问次数,给服务器带来了压力。

5.AJAX发送异步请求(四步操作)
XMLHttpRequest 对象用于在后台与服务器交换数据。

(1)第一步(得到XMLHttpRequest)
ajax其实只需要学习一个对象:XMLHttpRequest,如果掌握了它,就掌握了ajax。
得到XMLHttpRequest
    --》大多数浏览器都支持: var xmlHttp = new XMLHttpRequest();
    --》IE6.0:var xmlHttp = new ActiveXObject("Msml2.XMLHTTP");
    --》IE5.5:var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

**--封装得到XMLHttpRequest的函数
function createXMLHttpRequest() {
	try {
		return new XMLHttpRequest(); //Firefox, Opera 8.0+, Safari
	} catch (e) {
		try {
			return new ActiveXObject("Msml2.XMLHTTP"); // Internet Explorer 6.0
		} catch (e) {
			try {
				return new ActiveXObject("Microsoft.XMLHTTP"); // Internet Explorer 5.5
			} catch (e) {
				alert("哥们儿,你用的是什么浏览器啊");
				throw e;
			}
		}
	}
};


(2)第二步(打开与服务器的连接)
XMLHttp.open():用来打开与服务器的连接,它需要三个参数
---》请求方式:可以是GET或POST请求
---》请求的URL:指定服务器端资源,例如:/demo/LoginServlet
---》请求是否为异步:如果为true表示发送异步请求,否则同步请求

=====》xmlHttp.open("GET","/demo/LoginServlet",true);----GET请求

如果是POST请求如下(如果发送请求时需要带有参数,一般都用POST请求)
=====》open:xmlHttp.open("post",...);
=====》添加一步:设置Content-Type请求头:
	----》xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	---->send: xmlHttp.send("username=zhangsan&password=123");//发送请求时指定的请求体


(3)第三步(发送请求)
---》xmlHttp.send(null):如果不给参数可能会造成部分浏览器无法发送
*****参数:就是请求的内容!如果是GET请求,必须给出null。

(4)第四步()
---》在xmlHttp对象的一个事件上注册监听器:onreadystatechange
---》xmlHttp对象5个状态
0:初始化未完成状态,只是创建了XMLHttpRequest对象,还未调用open()方法
1:请求已开始,open()方法已调用,但还没调用send()方法
2:请求发送完成状态,send()方法已调用
3:开始读取服务器响应
4:读取服务器响应结束(通常我们只关心这个状态)

----》得到xmlHttp对象的状态
---------》var state = xmlHttp.readyState;//可能是0 1 2 3 4

----》得到服务器响应的状态码
---------》var status = xmlHttp.status;//200    404    500

----》得到服务器响应的内容
---------》var content  = xmlHttp.responseText;//得到服务器的响应的文本格式的内容
---------》var content =  xmlHttp.responseXML;//得到服务器的响应的xml响应的内容,document对象

xmlHttp.onreadystatechange = function(){//xmlHttp的5种状态都会调用本方法
	if(xmlHttp.readyState == 4 && xmlHttp.status == 200){//双重判断:判断是否为4状态,而且还要判断是否为200
		//获取服务器的响应内容
		var content  = xmlHttp.responseText;
	}
};

6.经典案例
(1)点击按钮,使用ajax响应内容在客户端某标签中显示响应的内容
(2)发送POST请求
(3)用户名是否已被注册

jsp页面代码:

function mys(v){
		var va=$(v).html();
		$("#wd").val(va);
	}
	$(function(){
		$("#mysele").hover(function(){
			$("#mysel").show();
			var name=$(this).val();
			var mysele="";
			$.ajax({
				url:"Select",//请求地址
				type:"post",//访问方式
				data:"name="+name,//请求参数
				datatype:"text",//预计返回类型
				async:true,
				success:function(message){//回调函数
					var list=$.parseJSON(message);
					
					$.each(list,function(index,value){
						mysele+="<a  οnclick='mys(this)'>"+value+"</a><br>";
					})
					$("#mysel").append(mysele);
				}
			})
			
		},function(){
			$("#mysel").hide();
			$("#mysel").empty();
		}
		
		
		)
	})

Servlet页面:

package com.zking.servelt;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;
import com.zking.biz.Goodsbiz;
import com.zking.biz.Goodsbiziml;
import com.zking.entity.Goods;

/**
 * Servlet implementation class Select
 */
@WebServlet("/Select")
public class Select extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=UTF-8");
		
		String name=request.getParameter("name");
		String message="";
		List<String> lls=new ArrayList<String>();
		if(name!=null) {
			Goodsbiz ig=new Goodsbiziml();
			List<Goods> ls= ig.findGoodsAll(1, 4, name);
			for(Goods l:ls) {
				lls.add(l.getGname());
			}
			message=JSON.toJSONString(lls);
			
		}
		
		
		
		//响应给用户
		PrintWriter out=response.getWriter();
		out.println(message);
		
		//session
		//request.getSession().setAttribute(arg0, arg1);
		//this.getServletContext().setAttribute(arg0, arg1);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值