2024年6月21日发(作者:)
维普资讯
福建 电脑 2007年第8期
基于Ajax和Servlet实现无刷新动态Web应用
曹红
(丽水学院计算机与信息工程学院浙江丽水323000)
【摘 要1:针对传统Web应用中浏览器和服务器频繁交换数据刷新页面导致执行速度慢问题,简要分析了Ajax-.框架
下的WEB应用模式和传统Web应用模式的区别,并阐述了Ajax技术的核心概念及实现机制,提出一种基于Ajax和Servlet
实现无刷新、按需取数的完整Web应用框架。
~一一
【关键字】:Ajax Servlet XML DOM无刷新
0.前言
随着Intemet技术的发展.Web应用技术也经历了不断的
变化。其中Web开发模型几经发展,Aiax成了当前的主流技术。
结合一定的服务器端技术.Ajax可以在不刷新页面的情况下。实
现与服务器动态交互.更新页面内容.改变了传统Web应用不
断等待的状况.突破了页面重载带来的Web可用性障碍。
1.Aiax与传统Web应用
传统的Web应用是由一系列连续切换的页面组成.其中大
部分页面很小.但是用户绝大部分的交互都是通过HTML表单
的提交而将整个页面切换并刷新.而在这个过程中(下一个页面
完全显示出来之前)。用户只能等待。
Ajax技术出现后.为运行于浏览器中的JavaScript脚本提供
了一种在页面之内与服务器通信的方式一一XMLHttpRequest对
象的运用。页面内的JavaScript可以在不刷新页面的情况下直接
从服务器获取数据.或者向服务器提交数据
传统的Web应用框架和基于Aiax的Web应用框架可以通
过下面的模型图来描述:
典型Web/ ̄'用模型 Ajaxweb应用模型
图一传统Web应用模型和基于Aiax的Web应用模型对比
这里Ajax应用与传统的Web应用区别主要有三点:
第一不刷新整个页面.在页面内直接与服务器通信
第二使用异步方式与服务器通信.不需要打断用户的操
作,具有更加迅速的的响应能力。
第三应用仅由少量页面组成。大部分交互在页面之内完
成,不需要切换整个页面。
这些特性在不同的应用场合都能够得到体现。
2.JAVA Servlet简介
Servlet是位于Web服务器内部的服务器端的Java应用程
序,它的主要功能在于交互式地浏览和修改数据.动态生成Web
内容。
使用Servlet只需要Web服务器包含支持Servlet的Java虚
拟机即可,与操作系统平台和网络协议无关。故使用Java Servlet
投入少,可移植性较好,相比其他类似CGI技术.具有更容易使
用、功能更强大、更节省投资等特点
3.基于Ajax和Servlet构建Web应用
这里我们以建立动态级联下拉列表为例来构建基于Ajax
和Servlet的Web应用模型。
原理:基于Aiax技术是在无刷新页面的情况下交换数据以
及异步通信的特性.系统客户端在用户操作上级下拉列表选项
时。会通过Aiax引擎向服务器请求当前一级项目所属的二级下
拉列表的所有选项。这样.需要什么就取什么数据。用多少就取
多少,减少了数据下载总量,不会有数据的冗余和浪费。而且更
新页面时不用重载页面全部内容.只更新部分页面元素即可。相
对于传统后台处理并重载的方式.该模型缩短了用户等待时间.
也把对资源的浪费降到最低。
图二基于Ajax和Java Servlet的Web应用实现过程时序图
根据上述工作流程图具体实现方法如下:
3.1 ITS--+JSp页面test.jsp,关键是包含如下两个下拉列
表框,并为上级下拉列表指定onChange事件的处理函数getNext
0:
<form nanle=”forml”id=”myform”>
<select rIan =”state”id=”stcteselid”onChange=”getNext0”,>
<option value=”null”/>please select provice
<option value=”10”,>北京
,.option value=”33”,>浙江
……
(上级列表项也可由服务器动态取得)
<select narne=”city”id=”cityselld”,>
</form>
3.2在页面的JavaScript脚本代码中创建Ajax应用的核心
组件XMLHttpRequest对象。为兼容客户端不同浏览器采用不同
的创建方法。典型代码如下:
<script 1al glI且ge=”JavaScript”
function createXMLHttpRequest0 I
Var xmlReq false;
if(window.XMLHttpRequest)f ,,在非IE浏览器中创建XMLHttpRc—
quest对象
xmlReq new XMLHttpRequest0;
l else if( ndow.ActiveXObject)l HIE通过MS AcdveX刨建
XMLHttpRequest
仃y I ,,尝试按新版本IntemetExplorer方法创建
xmlReq=new ActiveXObject(”Msxml2.XMLIflTP”):
}catch(e1)I
仃y I ,,尝试按老版本IntemetExplorer方法创建
xmlReq=new ActlveXObject(”Microsoft.XMIJClTP );
维普资讯
2007年第8期
】catch(e2】I 】
福建 电脑
String search:request.getParan ̄ter(”state”);
87
获得请求中state
】
】
etrurn xmlReq;
参数的值
String sql:”select namecity.idcity from city where inpmid: ’
search+’…;
】
</script>
……
3-3在上级下拉列表的onChange事件处理函数getNext0@
利用创建的xmlHttpRequest对象发送HTI’P请求。设置好用来
java.io.PrintWriter out response.getWriter0;
(连接后台mySQL数据库,并执行sql语句得到结果集rs,代码略)
调用r oXMLO方法将关系数据库结果集转换成XML数据格式,并输}竹
至客户端
从请求对象接收回调通知的回调函数句柄。
function getNext0{
v8r flag--document.getElementById(”stateselid”1.value;
vRr url=”servlet/SyncSelectServlet?state=”+flag;
VSdt"xmlHupReq createXMLHttpRequest0;
xmlHttpReq.open(”GET”,url,true);
v8r callbackFunction=getReadyStateHandler(xmlHttpReq.updateList);
xm|HttpReq onreadystatechange=callbackFunction,
xmlHttpReq.send(nul1);
】
在上述getNext_ 0函数中实现了从创建xmlHttpRequest对
象、创建回调(caUback)函数、注册回调(callback)函数、到分派并
发送HrrP请求的一系列过程。应该注意到的是,xrulHttpReq.
open(”GET”,ur1.true)语句指定了以”GET”的方法打开到目的url
(即为处理请求的Servlet)的连接。并且通过true参数指定了该
连接为异步方式,即发出请求后不用等待服务器返回响应.当服
务器在后台处理该请求的同时用户仍然可以使用表单f甚至调
用其他javaScfipt方法),这也正是Ajax的由来。
XMLHttpRequest的onreadystatechange属性告诉服务器在
运行完成后做什么,而实际上XMLHttpRequest对象从”未初始
化”到”完成”每一次”readvState”的变化都会引发readystate—
change事件,通过onreadystatechange属性配置的回词处理函数
将会被调用。在xmlHttpReq实例中,指定了由getReadyState—
Handler(xmlHttpReq,updateList)函数返回的一个函数句柄caJ1.
backFuncfion为该实例的回调函数.getR.eadyStateHandler(xml—
HttpReq,updateList)返回一个监听XMLHttpRequest实例的匿名
函数,而真正影响用户界面的是作为该函数参数的uDdateList
(xmlDo ̄)函数。实现代码如下:
function getReadyStateHandler(req,handler)I
returnfunction 0I
if(req.readyState==4)f 如果请求的状态是”完成”
if(req.status=:2oo)f 检查是否成功接收了服务器响应
handler(req.responseXML1:,,将响应XML信息传递给hart.
der函数处理
]else I alert(”}rrrP error:”+req.status);】
l
】
}
3.4服务器端请求处理的Java Servlet实现。在本例应用中.
服务器端基于TomCat5提供对JSP的支持和作为Servlet的容
器,后台使用mySQL数据库服务,其中表city结构如下图三所
不
图三city表结构
响应XMLHttpRequest请求的Servlet与处理一个来自浏览
器的普通的HTrP请求基本上相似,关键是实现doGetO方法或
者doPost0方法。程序片断:
import jaVa.io.IOExceptlon;
public class SyncSelectServlet extends HttpServlet I
public void doGet(HttpServletRequest request,HttpServletResponse response)
rawB ServletExeeption,jav丑.io.IOExcepdon I
response.estHeader(”Cache-Control","no-cache”);
out.print(rsToXML( );
out.close0;
】
……
】
Servlet响应返回XML数据.需要setContentType(”applica—
tion/xml;charset=utf-8”)方法将响应内容的类型设置为”applica—
tion/xml“,客户端脚本可以利用DOM(文档对象模型)丰富的
API处理响应信息。本例应用中使用rsToXML(rs)方法将查询关
系数据库的结果集转换成一定格式的XML数据。响应的XML
内容格式如下:
<?xml version=',”l,0、”encoding=\”UTF一8、__?>
<state>
<city>
<namecity>杭州</namecity>
<idcity>3301/<idcity>
/<city>
<city>
<namecity> ̄水</namecity>
<idcity>33 1 l/<idcity>
/<city>
/<state>
3.5页面处理服务器响应.回凋函数更新用户界面的实现
前文已经指出,本例应用中XMLHttpRequcst对象的回调函数是
getReadyStateHandler(xmlHttpReq,updateList)函数返回的函数,
而作为参数的updateList(xmlDoc)i ̄i数才是XMLHttpRequest对
象请求完成并成功接收服务器响应后实现页面内容更新的直接
操作者。
function updateList(xmlDoc){
vat showElements=xmlDoc.getElementsByTagName(”city”);
rag citysel=doeument.getElementByld(”cityselid”);
cityse1.options.1ength=O; , 先将原有下级下拉列表清空
fo 8r i=o;i<showElements.1erIgth;i++)I
v8r xText--showElements[i].childNodes[0].ifrstChild.nodeValue;
v丑r xValue=showElements[i].childNodes[11.ifrstChild.nodeValue;
cityse1.options[il=new Option(xText,xValue);
】
】
运用DOM的标准API对XML数据进行解析。实现起来非
常方便,并且运用DOM操作HTML文档仅仅刷新了页面的一
部分,页面的其他部分在内存的DOM树中完全没有受影响
.
因
此最终实现了无刷新动态更新Web页面,这也正是AiaLx技术展
现给用户的巧妙之处
4.结论
AjaLx中的所有核心技术几乎都是已经成熟而稳定的
.
而a.
jaLx的出现则把这些技术天衣无缝的结合了起来,并展现出了无
与伦比的魅力和强大。再加之与服务器端强大的Java Servlet技
术的结合,更加如虎添翼。减少等待,使用户能够在B/S架构的
浏览器中体会到本地桌面应用般的良好体验
.
这种Web模式将
得到更广泛的应用
参考文献:
1.David Flanagan, ̄davaSc唧t权威指南》【MJ.张铭泽译.,北京:机械工业出
版社.2003.
2.柯自聪,《AJAx开发精要)【M】.:IL ̄:,Eff-工业出版社,2006
.
3.Jason Hunter,william Crawford,lava Servlet编程(第二版)>孙鑫,谢茂
强译,中国电力出版社.2002.
4.作者:MoztwWiki标题:(AJAX上手篇>.
5.作者:Philip McCarthy标题:面向Java开发人员的Ai :构建动态的
Java应用程序.
发布者:admin,转转请注明出处:http://www.yc00.com/news/1718905534a2753446.html
评论列表(0条)