从Hello World开始深入Ajax
关键字: Ajax1. 初始化XMLHttpRequest对象 通过这一步,我们可以得到浏览器的支持方式,这里我的浏览器是Microsoft.XMLHTTP方式(IE6),事实上在IE7之前的版本中,浏览器都是采用"Microsoft.XMLHTTP方式,只有在IE7中,才会使用Http Request方式。因此在以下的说明中,我都将以我的浏览器版本为依据进行阐述。 -------------------------------------------------------------------------------- Hello World -------------------------------------------------------------------------------- 是不是相当简单!
2. 向服务器端发出请求
在AJAX中,许多使用XMLHttpRequest的请求都是从一个HTML事件(例如一个调用JavaScript函数的按钮点击(onclick)或一个按键(onkeypress))中被初始化的。AJAX支持包括表单校验在内的各种应用程序。有时,在填充表单的其它内容之前要求校验一个唯一的表单域。但是目前我们最好还是简单一点的好^^。首先说明一下XMLHttpRequest对象的属性onreadystatechange。这个属性能辨识readyState 属性的改变,无论readyState值何时发生改变,XMLHttpRequest对象都会激发一个readystatechange事件。其中,onreadystatechange属性接收一个EventListener值,该值向该方法指示无论readyState值何时发生改变,该对象都将激活。
表格1.XMLHttpRequest对象的ReadyState属性值列表。
取值 描述
0 描述一种"未初始化"状态;此时,已经创建一个XMLHttpRequest对象,但是还没有初始化。
1 描述一种"发送"状态;此时,代码已经调用了XMLHttpRequest open()方法并且XMLHttpRequest已经准备好把一个请求发送到服务器。
2 描述一种"发送"状态;此时,已经通过send()方法把一个请求发送到服务器端,但是还没有收到一个响应。
3 描述一种"正在接收"状态;此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束。
4 描述一种"已加载"状态;此时,响应已经被完全接收。
如果你是一个细心的读者你就会发现这里似乎还要在增加一个JSP页面来处理我们发出的请求信息。为此,我们在这里我们对calculator.jsp进行定义,页面全部内容如下:
3. 接收请求信息
在startRequest函数中,我们声明了要使用handleStateChange对象来标识readyState。通过令xmlHttp.onreadystatechange=handleStateChange,我们就成功注册了一个事件处理器。下面就需要对handleStateChange进行具体的是实现,代码如下:
4. 第一个Ajax页面全貌(赶紧执行一把吧)
事实上,一个完整的打开服务器链接的通讯方法的定义约定格式如下:
xmlHttp.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword)
其中:
bstrMethod: 连接方式,可用的有GET, POST, PUT, or PROPFIND
bstrUrl: 服务器的url
varAsync(可选): 调用是否异步,默认为true(调用立即返回)
bstrUser(可选):用户名,如果url需要验证时附上
bstrPassword(可选):密码,如果url需要验证时附上
但是通常情况下我们只需要提供前3个参数就足够了。
修改handleStateChange方法,修改后的结果如下:
- <%@ page contentType="text/html; charset=GBK" %>
- <html>
- <head>
- <title>test</title>
- <script language="javascript">
- var xmlHttp;
- function createXMLHttpRequest(){
- if(window.ActiveXObject){
- xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
- //alert("Microsoft.XMLHTTP");
- str=document.getElementById("mydiv_01").innerText;
- document.getElementById("mydiv_01").innerText="【运算结束】";
- }else if(window.XMLHttpRequest){
- xmlHttp=new XMLHttpRequest();
- //alert("Http Request");
- }
- }
- function startRequest(){
- createXMLHttpRequest();
- xmlHttp.onreadystatechange=handleStateChange;
- xmlHttp.open("GET","calculator.jsp",true);
- xmlHttp.send(null);
- }
- function handleStateChange(){
- if(xmlHttp.readyState==4){
- if(xmlHttp.status==200){
- document.getElementById("mydiv_01").innerText=xmlHttp.responseText;
- }
- }
- }
- </script>
- </head>
- <BODY>
- <font size="+6">First Samples for Ajax</font><br>
- <input type="button" name="subButton" value="获取数据" onclick="startRequest();">
- <center><div id="mydiv_01">【等待触发】</div></center>
- </BODY>
5. 用Ajax实现与服务器的交互
修改index页面,在其中增加以下HTML代码:
- <center>
- <form>
- <input type="text" name="val_01" size="10" value="5">*
- <input type="text" name="val_02" size="10" value="8">=
- <input type="text" name="val_03" size="10" value="0">
- </form>
- </center>
修改startRequest方法,修改后结果如下:
- function startRequest(){
- createXMLHttpRequest();
- xmlHttp.onreadystatechange=handleStateChange;
- var val_01=document.forms[0].val_01.value;
- var val_02=document.forms[0].val_02.value;
- xmlHttp.open("GET","calculator.jsp?val_01="+val_01+"&val_02="+val_02,true);
- xmlHttp.send(null);
- }
- function handleStateChange(){
- if(xmlHttp.readyState==4){
- if(xmlHttp.status==200){
- document.getElementById("mydiv_01").innerText=xmlHttp.responseText;
- document.forms[0].val_03.value=xmlHttp.responseText;
- }
- }
- }
最后,运行查看结果。
发表评论
- 浏览: 39841 次

- 详细资料
搜索本博客
链接
最新评论
-
OSGi之前世今生
不得不收藏一下了
-- by lggege -
OSGi与JSF结合开发Java W ...
呵呵,不知道有人把RichFace和 OSGi集成没
-- by gembin -
管窥Java开发中OSGi组件的 ...
不解eclipse的插件为什么可以称“热插拔”,明明每装一个插件都要重启,应该是 ...
-- by Sam1860 -
管窥Java开发中OSGi组件的 ...
学习,学习
-- by zhuyx808 -
管窥Java开发中OSGi组件的 ...
经典收藏
-- by bengan






评论排行榜