Ajax

本文介绍了一个简单的Ajax应用案例,包括Ajax的基本使用方法、HTTP状态码的处理、异步与同步的区别、GET与POST请求参数的传递方式,以及如何封装Ajax操作。

testAjax.jsp

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'MyJsp.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
<script>
	function test() {
		//第一步:创建XMLHttpRequest对象
		var request;
		if (window.XMLHttpRequest) {
			request = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			request = new ActiveXObject("Msxml2.XMLHTTP");
		}

		//第二步:使用XMLHttprequest创建请求
		request.open("get", "AjaxServlet");
		//request.open(method, url, async, username, password)后面两个可以不填,其中的url是web.xml中的servlet-mapping的ur
		//asyncl是否异步,默认是true

		//第三部:写回调函数处理服务器返回的数据
		request.onreadystatechange = function() { //onreadystatechange是当readystate改变时触发这个函数
			if (request.readyState == 4) { //request.readyState返回1,2,3,4分别代表不同的含义,其中4是传输成功的意思
				var result = request.responseText; //得到服务器返回的数据
				document.getElementById("show").innerHTML = result;
			}
		}
		request.send(null);  //如果不加null火狐会报错
	}
</script>
</head>

<body>
	<div id="show"></div>
	<input type="button" value="测试" onclick="test()" />
</body>
</html>

AjaxServlet

package action;

import java.io.IOException;
import java.io.PrintWriter;

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

public class AjaxServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		out.println("Hello Ajax !");
		out.flush();
		out.close();
	}

}

关于HTTP状态码(其实就是一个status方法)

修改testAjax.jsp中的JS

<script>
	function test() {
		//第一步:创建XMLHttpRequest对象
		var request;
		if (window.XMLHttpRequest) {
			request = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			request = new ActiveXObject("Msxml2.XMLHTTP");
		}

		//第二步:使用XMLHttprequest创建请求
		request.open("get", "AjaxServlet");
		//request.open(method, url, async, username, password)后面两个可以不填,其中的url是web.xml中的servlet-mapping的ur
		//asyncl是否异步,默认是true

		//第三部:写回调函数处理服务器返回的数据
		request.onreadystatechange = function() { //onreadystatechange是当readystate改变时触发这个函数
			if(request.status==200){  //Http状态码 200为请求成功
				if (request.readyState == 4) { //request.readyState返回1,2,3,4分别代表不同的含义,其中4是传输成功的意思
					var result = request.responseText; //得到服务器返回的数据
					document.getElementById("show").innerHTML = result;
				}
			}else if(request.status==404){  //想测试404的话可以修改创建请求时的路径
				document.getElementById("show").innerHTML = "请求资源未找到!";
			}else if(request.status==500){
				document.getElemenById("show").innnerHTML = "内部服务器错误 !";
			}
		}
		request.send(null);
	}
</script>

异步同步的表达

修改testAjax.jsp中的JS

<script>
	function test() {
		//第一步:创建XMLHttpRequest对象
		var request;
		if (window.XMLHttpRequest) {
			request = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			request = new ActiveXObject("Msxml2.XMLHTTP");
		}

		//第二步:使用XMLHttprequest创建请求
		request.open("get", "AjaxServlet", true);
		//request.open(method, url, async, username, password)后面两个可以不填,其中的url是web.xml中的servlet-mapping的ur
		//asyncl是否异步,默认是true

		//第三部:写回调函数处理服务器返回的数据
		request.onreadystatechange = function() { //onreadystatechange是当readystate改变时触发这个函数
			if (request.readyState == 4) { //request.readyState返回1,2,3,4分别代表不同的含义,其中4是传输成功的意思
				var result = request.responseText; //得到服务器返回的数据
				document.getElementById("show").innerHTML = result;
			}

		}
		request.send(null);
		alert("异步的操作!");//设置为异步之后可以比作为同时运行,而不会等待其中一个返回再接着运行
	}
</script>

在AjaxServlet返回数据前加一句


try {
	Thread.sleep(3000);
} catch (InterruptedException e) {
	e.printStackTrace();
}

Get,Post传参

AjaxServlet

public void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	response.getWriter().println(request.getParameter("a"));
}
Get传参

request.open("get", "AjaxServlet?a=123", true);


Post传参

request.open("post", "AjaxServlet", true);
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
request.send("a=123");


Ajax的封装

封装过程

<script>
	function createAjaxObj() {
		var requset;
		if (window.XMLHttpRequest) {
			request = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			request = new ActiveXObject("Msxml2.XMLHTTP");
		}
		return request;
	}

	function test() {
		var request = createAjaxObj();

		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				if (request.status == 200) {
					handle200(request);
				} else if (request.status == 404) {
					handle404(request);
				} else if (request.status == 500) {
					handle500(request);
				}else{
					loading();
				}
			}
		}
		request.open("post", "aAjaxServlet", true);
		request.setRequestHeader("Content-Type",
				"application/x-www-form-urlencoded");
		request.send("a=123");
	}
	
	function handle200(request) {
		var result = request.responseText;
		document.getElementById("show").innerHTML = result;
	}

	function handle404(request) {
		document.getElementById("show").innerHTML = "No find !";
	}
	
	function handle500(request) {
		document.getElementById("show").innerHTML = "Server is busy !";
	}
	
	function loading(){
		document.getElementById("show").innerHTML = "Finding !";
	}
	
</script>

封装结果 ajaxUtil.js

function createAjaxObj() {
	var requset;
	if (window.XMLHttpRequest) {
		request = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		request = new ActiveXObject("Msxml2.XMLHTTP");
	}
	return request;
}

function test(method, url, data, asychn, loading, handle200, handle404,
		handle500) {
	var request = createAjaxObj();

	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				if (handle200) { //如果为空则不处理
					handle200(request);
				}
			} else if (request.status == 404) {
				if (handle404) {
					handle200(request);
				}
			} else if (request.status == 500) {
				if (handle500) {
					handle500(request);
				}
			} else {
				if (loading) {
					loading();
				}
			}
		}
		//下面处理get和post
		if ("get" == method.toLowerCase()) {
			if (data == null || data == "") {
				request.open(method, url, asychn);
			} else {
				request.open(method, url + "?" + data, asychn);
			}
			request.send(null);
		} else if ("post" == method.toLowerCase) {
		}
		request.open("post", url, asych);
		request.setRequestHeader("Content-Type",
				"application/x-www-form-urlencoded");
		request.send(data);
	}
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值