详细描述了AJAX的建立过程(简单实现)

今日小弟在学习AJAX时从网上收集资料,调试成功,非常高兴,现将代码共享,望大家多多交流。
并附上从网站: http://www.java3z.com/cwbwebhome/article.jsp获得的帮助
1) HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>AjaxTest.html</title>
<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">-->
</head>
<script type="text/javascript">
var req = false;
function getResult(stateVal) {
   var url = "servlet/SelectCityServlet?state="+stateVal;
/**
* 为了用JavaScript向服务器发出一个HTTP请求,
* 你需要一个类的实例来提供给你这种功能。
* 这个类原本在IE里被作为一个ActiveX对象提出,叫XMLHTTP。
* 然后,Mozilla、Safari以及一些其他的浏览器相继跟随,
* 出现了一个XMLHttpRequest类,其支持微软的ActiveX对象原本的方法和属性。
*/
   if (window.XMLHttpRequest) { //Mozilla, Safari
req = new XMLHttpRequest();
if(req.overrideMimeType){
req.overrideMimeType('text/xml');
}
   }else if (window.ActiveXObject) { //Microsoft IE
   req = new ActiveXObject("Microsoft.XMLHTTP");
try{
req = new ActiveXObject("Msxml2.XMLHTTP");
}catch (e) {
try{
req = new ActiveXObject("Microsoft.XMLHTTP");
}catch (e){}
}
   }
if (!req) {
alert('错误,放弃创建一个 XMLHTTP 实例!');
return false;
}
/**
* 以上申明可确保跨浏览器运行我们的AJAX程序
*/

/**
* 在服务器对你的请求作出响应后,准备做什么。
* 这一阶段,你只需要告诉HTTP请求对象(HTTP request object)
* 用哪一个JavaScript函数来处理这一响应。
* 这一步用设置该对象onreadystatechange属性为相应的JavaScript函数名来实现
*
* 既然已经声明了在接到响应后干什么,现在就需要去发出请求。
* 需要调用HTTP请求类的open()和send()方法
*
* open()方法:
* 第一个参数是HTTP请求的方式——GET、POST、HEAD或者任何其它想使用的,服务器支持的方式。
* 方式的名称要大写,否则有些浏览器(如Firefox)可能就不会处理请求。
* 可以去 W3C specs获取更多的你可以使用的HTTP请求方式的信息。
* 第二个参数是所请求页面的URL。
* 第三个参数是用来设置请求是否为异步的。
* 如果是TRUE,则在服务器尚未返回响应的时候,JavaScript的函数会继续执行。
* 这也就是AJAX中的A的含义。
*
* send()方法:
* 参数可以使任何你希望传递给服务器的数据,数据应该为如下格式的查询串:
* name=value&anothername=othervalue&so=on
*/

   if(req){
   req.open("GET",url, true);
   req.onreadystatechange = complete; //注意,在函数名后面没有加括号
   req.send(null);
   }
}
function complete(){
/**
* 当你向服务器发出了一个请求,你也就发出了一个被设计用来处理响应的JavaScript函数的名字。
* request.onreadystatechange = complete
* 我们来看看这个函数都应该做些什么。
* 首先,其需要检查请求的状态,如果状态的值为4,
* 那么就意味着全部的服务器响应都已接受完毕,可以继续来处理了。
* if (http_request.readyState == 4) { // 一切就绪,相应已接受完成} else { //尚未就绪}readyState全部值的列表如下:
* 0(未初始化/uninitialized)
* 1(正在加载/loading)
* 2(加载完毕/loaded)
* 3(交互/interactive)
* 4(完成/complete)
*
* 下一步是检查HTTP服务器响应的情况代码。
* 所有可能的代码都被列在了W3C的网站上。目前,我们只对200 OK响应感兴趣。
*
* 在检查完请求的状态和HTTP响应情况后,你就可以自己决定对服务器发送给你的数据作什么样的处理了。
* 你有两种途径来访问这些数据:
* request.responseText将会把服务器的响应作为一个文本串返回
* request.responseXML将把响应作为一个XMLDocument对象返回,你可以用JavaScript的文档对象模型(DOM)的函数来处理
*
*
*/
   if (req.readyState == 4) {
   if (req.status == 200) {
//我们获取了responseXML中的XMLDocument对象,并且用DOM方法来访问了XML文档中所包含的某些内容。
   var city = req.responseXML.getElementsByTagName("city");
   file://alert(city.length);
   var str=new Array();
   for(var i=0;i<city.length;i++){
   str[i]=city[i].firstChild.data;
   }
   file://alert(document.getElementById("city"));
   buildSelect(str,document.getElementById("city"));
   }else{
alert('在Request有问题!\n' + req.statusText);
}
   }
}
function buildSelect(str,sel) {
   sel.options.length=0;
   for(var i=0;i<str.length;i++) {
   sel.options[sel.options.length]=new Option(str[i],str[i])
   }
}
</script>
<body>
<select name="state" onChange="getResult(this.value)">
   <option value="">Select</option>
   <option value="zj">ZEHJIANG</option>
   <option value="zs">JIANGSU</option>
</select>
<select id="city">
   <option value="">CITY</option>
</select>
</body>
</html>
2) WEB.XML
<servlet>
<servlet-name>SelectCityServlet</servlet-name>
<servlet-class>com.lzcard.servlet.SelectCityServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SelectCityServlet</servlet-name>
<url-pattern>/servlet/SelectCityServlet</url-pattern>
</servlet-mapping>
3) Servlet
package com.lzcard.servlet;
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;
/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class SelectCityServlet extends HttpServlet{
private static final long serialVersionUID = 3846719385151382073L;
public SelectCityServlet(){
super();
}
public void destroy() {
super.destroy();
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");
String state = request.getParameter("state");
StringBuffer sb=new StringBuffer("<state>");
if ("zj".equals(state)){
sb.append("<city>hangzhou</city><city>huzhou</city>");
}else if("zs".equals(state)){
sb.append("<city>nanjing</city><city>yangzhou</city><city>suzhou</city>");
}
sb.append("</state>");
PrintWriter out=response.getWriter();
out.write(sb.toString());
out.close();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值