高山流水
msgbartop
动之则分,静之则合,无过不及,随曲就伸。
msgbarbottom

09 五 07 Millennium系统OPAC整合之四:AJAX基础

因为无知,所以进步,只有努力,才能专业——以此自勉。
对于近乎封闭的OPAC系统来说,AJAX是把利剑。为什么这么说呢?


OPAC系统失败之处:
1、绝大部分基于自有web解析服务器,web页面程序不开放,无法进行数据层面的操作和修改;
2、绝大部分基于封闭的数据库,用户无法直接访问数据库取到相关记录;
3、几乎没有支持用户开发需求的第三方接口。
AJAX的锋利之处:
1、运行在客户端浏览器上,与OPAC平台无关。只要能在OPAC页面中嵌入相关脚本,即可实现相关功能;
2、可以通过DOM操作,获取用户当前页面上的所有信息——包括书名、ISBN号、索书号等等;
3、可以在不影响用户操作的前提下,通过xmlhttprequest对象,向某一服务器发送请求,并得到反馈数据;
4、可以通过DOM操作,无刷新改变当前页面的结构与内容。
由上面的对比,可以看到,要做OPAC资源整合,AJAX是绝妙的武器。那么操作AJAX的基础是不是很简单呢?
是的,下面是一些最基本的操作方式,但这些基本的操作方式,已经足以让我们完成80%的工作。
一、嵌入脚本:

首先,假设有这么一个理想的页面:
sample.html
<html>
<head>
<title>Ajax in
action</title>

</head>
<body>
<table width=”200″
border=”1″>

<tr>

<td>书名:</td>

<!–此处定义了td标签的id–>

<td
id=”t”>Ajax in Action</td>

</tr>

</table>
</body>
</html>

那么我们要嵌入脚本,是很容易的事情,我们可以把脚本直接写到里面,也可以通过外接脚本文件的形式嵌入,例如,在</head>标签之上加上一行:

<script
type=”text/javascript”
src=”ajax_sample.js”></script>
那么为什么要嵌入脚本呢?请接着来~


二、页面信息的读取:
脚本是AJAX的核心,只有通过脚本,才能实现AJAX的操作。
我们现在要实现ajax_sample.js对sample.html页面信息的读取,确切的说,是要得到该页面上的书名。
ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{

//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');


//输出对象内容


alert(objTitle.innerHTML);

}

通过document.getElementById()方法,我们分别获取了sample.html网页中的书名单元格对象,并通过innerHTML属性得到了具体的值——“Ajax
in
Action”——这样,我们初步实现了文档内容的分析操作。

当然,sample.html具有一定的理想性——结构清晰、具有id属性——目前OPAC系统里面,我相信大部分页面的HTML是极其恶心、惨不忍睹的,但是这并不能阻挡AJAX的步伐,除了getElementById()方法,我们还可以通过getElementsByTagName()来实现节点的搜索。

三、发送请求到服务器:
好了,我们顺利的分析了文档的内容,那么在这里首先问大家一下:分析用户文档的意义何在?
意义在于,我们要知道读者正在浏览的信息,比如是哪一本书,这样我们才能针对读者的行为给他们更多的惊喜。
在本例中,得到了书名之后,我们就可以通过xmlhttprequest对象,将书名传送到专门的服务器,由服务器去实现更多的功能。
ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{

//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');


//输出对象内容

//alert(objTitle.innerHTML);

//与服务器通讯

sendRequest(”[服务器处理程序的URL]“,”t=”+objTitle.innerHTML);

}

function
CreateXmlHttpRequest()//创建XmlHttpRequest对象

{

var xRequest=null;//定义


if(window.XMLHttpReqeust)//支持XMLHttpReqeust对象

{

xRequest=new XMLHttpRequest();


}


else if(typeof ActiveXobject !=”undefined”)//支持ActiveX对象

{

xRequest=new
ActiveXobject(”Microsoft.XMLHTTP”);

}

return xRequest;//返回

}

function
sendRequest(url,params)//发送请求函数

{

HttpMethod=”GET”;//传送方式

var
sRequest=CreateXmlHttpRequest();//创建实例

if(sRequest)

{

sRequest.open(HttpMethod,url,true);//打开http访问

sReqeust.send(params);//传送相关参数

}

}

四、服务器的反馈程序:
通过上面的步骤,已经实现了客户端将数据传送到服务器,这时,服务器可以做的事情很多了,比如,检索一下有没有电子图书,并向用户返回相关信息。
ajaxsample.java
//yuanxinz.2007.05.09

package ajaxsample;

import java.io.*;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.servlet.*;

import java.servlet.http.*;
public class ajaxsample extends
HttpServlet

{

public void init(ServletConfig config) throws
ServletException

{

//…..

}

protected void doGet(HttpServletRequest
request,HttpServletResponse response) throws
ServletException,IOException

{

String s =
request.getParameter(”s”);//获取参数

//执行电子图书数据库检索

……

rs = pool.getRs(”select * from
表 where 题名 like ‘%”+s+”%’);

try{

if(rs.next())

{

rs.previous();

//将结果输出为文本

PrintWriter
out = response.getWriter();

response.setContentType(”text/plain;charset=gb2312″);

response.setHeader(”Cache-Control”,
“no-cache”);

response.setHeader(”Pragma”,
“no-cache”);

String
outstr=”";

int
i = 0;

while(rs.next())

{

outstr
= outstr + rs.getString(”题名”) + “|” + rs.getString(”url”) +
“\n”;

i++;

}

out.println(outstr);

out.close();

}

else

{

response.setStatus(HttpServletResponse.SC_NO_CONTENT);

}

//关闭数据库连接之类的….

…….

}

catch(SQLException e)

{

e.printStackTrace();

}

}

}

上面的servlet在接到用户请求后,将进行相关检索,并返回一个文本:

Ajax in Action|http://******

……

Ajax in action
**|http://*****

AJAX可以返回多种类型的数据,包括html、XML文档和javascript脚本等等。
五、接收反馈数据,并修改当前文档:
现在一切又回到了用户浏览器,首先,我们要通过定义回调处理函数,来确定服务器已经将相关的数据返回。
ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{

//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');


//输出对象内容


//alert(objTitle.innerHTML);

//与服务器通讯

sendRequest(”[服务器处理程序的URL]“,”t=”+objTitle.innerHTML);

}

function
CreateXmlHttpRequest()//创建XmlHttpRequest对象

{
var
xRequest=null;//定义


if(window.XMLHttpReqeust)//支持XMLHttpReqeust对象

{

xRequest=new XMLHttpRequest();

}
else if(typeof
ActiveXobject !=”undefined”)//支持ActiveX对象

{

xRequest=new
ActiveXobject(”Microsoft.XMLHTTP”);

}
return
xRequest;//返回

}

function
sendRequest(url,params)//发送请求函数

{

HttpMethod=”POST”;//传送方式

var
sRequest=CreateXmlHttpRequest();//创建实例

if(sRequest)

{

//这里调用回调

sRequest.onreadystatechange=onReadyState;

sRequest.open(HttpMethod,url,true);//打开http访问

sReqeust.send(params);//传送相关参数
}
}

function
onReadyState()

{

var redy=sRequest.readyState;//获取sRequest实例的状态

var data=null;

if(ready=4)//完成状态

{

data=xRequest.responseText;

}

else


{


data=”正在读取相关数据….”

}
}

用户浏览器收到服务器反馈的文本后,就可以通过createElement()等方法来实现文档的修改。

ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{

//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');


//输出对象内容


//alert(objTitle.innerHTML);

//与服务器通讯
var
empty=document.getElementById(’empty’);//定义一个空节点


sendRequest(”[服务器处理程序的URL]“,”t=”+objTitle.innerHTML);

}

function
CreateXmlHttpRequest()//创建XmlHttpRequest对象

{
var
xRequest=null;//定义


if(window.XMLHttpReqeust)//支持XMLHttpReqeust对象

{

xRequest=new XMLHttpRequest();

}
else if(typeof
ActiveXobject !=”undefined”)//支持ActiveX对象

{

xRequest=new
ActiveXobject(”Microsoft.XMLHTTP”);

}
return
xRequest;//返回

}

function
sendRequest(url,params)//发送请求函数

{

Tags: , ,



Reader's Comments

  1. |

    看不懂,沙发还要坐哦,哈哈。

  2. |

    俺菜,汗

  3. |

    崇拜,基础教程啊。还没真正做过,不过看起来确实不错。顺便问一句,应该在什么时候调用onReadyState()呢?赞一下,大小写和附注都写那么标准!

  4. |

    onReadyState()应该在发送请求的时候初始化,这样浏览器就可以进行回调处理。if(sRequest)  {    //这里调用回调    sRequest.onreadystatechange=onReadyState;    sRequest.open(HttpMethod,url,true);//打开http访问    sReqeust.send(params);//传送相关参数  }

  5. |

    呵呵不懂.

  6. |

    听上去,很多工作还是交给了服务器。可是Kelvin得文中提到ajax的优点是可以

  7. |

    听上去,很多工作还是交给了服务器。可是Kelvin得文中提到ajax的优点是可以减轻服务器负担,能否解释一下? 谢谢!



Leave a Comment