CSK.Blog--个人原创Weblog

« 心灵的疲倦不想让这些成为以往的回忆 »

ajax缺陷的解决和自动xml分析器

可恶……你现在看到的文章之前我已经写过几乎一样的一篇,但随着IE突然崩溃,我也只好重新打了一篇,也就是你看到的……

最近要同时开发PRP的“强人隧道”网站、法学院网站的第2期开发,同时要管理计协,当然还有学业。所以基本上时间要精确到秒来用了。不过周末还是能和gf稍微过一点悠闲的生活,哪怕那只有短暂的2小时。

那么这个blog似乎又要死下去了,不过我承诺过每周至少一篇文章,所以就把最近开发中对ajax的体会和一些作品发布出来吧。

首先允许我评论下这个目前正被捧得大红大紫的AJAX技术。如果你不知道他是什么就先去google以下,关于他的教程和介绍到处都是。

ajax并不是最近才有的,更不是有些人所说的在asp.net中附带而来的。她很早就被MS采用,大家看看msdn网站的那个树形目录,如果你展开一个分支,它就会“非同步的”去更新这个分支的内容。我想似乎也只有js+xml才能做到吧。而且在我上高一时,第一次上msdn就有这个功能了,我现在读大二,那么就算算这项技术出现了多少年吧……

那么为什么他现在如此的红火呢?我想其中一个原因是gmail,他的web管理界面就是彻底的ajax应用。google似乎正企图破坏微软帝国的神话,成为新一代霸主,他对新技术的使用自然是空前的。第二个原因就是企图用这个技术来达到Flash网站同样的效果。也就是不需要刷新页面来获取新内容。Flash中可以采用loadMovie方法来加载新的对象,同时也支持xml文报(我的ReformPost就是很好的例子)。我想比起asp.net中的采用,更多的可能应该是需要模拟出和flash具有同样效果的页面罢了。

不过ajax似乎并没有传说的那么十全十美。

首先

它需要浏览器支持,并不是所有平台和所有浏览器都能显示ajax页面,而且一但不支持,整个页面可能都无法显示。

第二个缺陷

由于它不需要刷新页面而获得新的数据,很多人认为这有违于利用URL来唯一定位资源的规范。因为同一个url指向的页面可以用ajax显示截然不同的数据。那么你如果需要把你正在浏览的信息给别人看的话,复制url给他显然就是没有用的。

不过我并不这样认为,首先这并不是ajax才有的问题,使用flash的页面也是如此。而且所谓“有违于利用URL来唯一定位资源的规范”是错误的。我见过很多聪明的flash网站已经做到了解决方法,下面我稍微介绍一下:

如果你原先采用静态页面,那么很自然,每篇文章都是和url地址挂钩的:

比如本文保存在:http://www.csksoft.net/blog/post/XML_Parser_and_comments.html

那么用url地址就能来访问本文。

现在我把文章保存在数据库,采用asp页面动态的显示本文,那么利用QueryString还是能用url地址唯一的去定义本文:

http://www.csksoft.net/blog/cmd.asp?act=tb&id=84

那么在ajax和flash网站的情况下,我们也可以采用类似于QueryString的做法:把上面的?改为#即可

众所周知,url字符串中#字符之后的内容都会在发送http请求时被略去,所以网页的书签就是在页面url后面加上一个以#为前缀的参数,这样一方面不影响服务器获取正确的参数,另一方面可以在客户端利用JS来获取#之后的参数。

那么,在今后的flash网站中,或者今后本blog采用了ajax,这篇文章也能采用如下的url地址获得了:

http://www.csksoft.net/blog/index.asp#act=tb&id=84

不过这个页面目前是不起作用的。

下面提供一个能从像上面url地址格式中提取像指定参数数据的函数,它本是action代码,相信稍作修改就能用于js。

使用和转载时请保留我的作者信息。

//from ReformCore::mainsite

//Copyrights 2005-2006 CSK,csk@citiz.net

function GetQueryString(strURL:String, strStringName:String):String {
if (strURL == undefined || strURL == ) {
strURL = _root._url;
}
var strQueryStub:String;
strQueryStub = strURL.slice(strURL.lastIndexOf(#)+1);
if (strStringName == undefined || strStringName == ) {
return strQueryStub;
}
var nSubPosA:Number, nSubPosB:Number;
strQueryStub = &+strQueryStub;
nSubPosA = strQueryStub.lastIndexOf(&+strStringName+=);
if (nSubPosA == -1) {
return ;
}
nSubPosA += length(&+strStringName+=);
nSubPosB = strQueryStub.indexOf(&, nSubPosA);
if (nSubPosB == -1) {
nSubPosB = strQueryStub.length;
}
return unescape(strQueryStub.slice(nSubPosA, nSubPosB));
};

 

如果要获取www.csksoft.net/mypage#id=3 中的id的内容,只要这样写:

 

var id=GetQueryString(www.csksoft.net/mypage#id=3,id);

用了上述的方法,这个缺陷自然也就不复存在了

第三个缺陷

是由于很多情况下需要对xml文档进行翻译,因而即使像获取服务器时间这样简单的功能,也要专门写xml分析代码来从服务器传回的xml中得到需要的时间信息。

如果flash或者ajax页面需要采用高级的xml文报实现与服务器进行更强大的RPC远程交互(类似于SOAP),那么就需要编写常常的xml分析代码。

对于ReformPost,如果需要获得主服务器的时间,客户端的发送的文报是这样的:

<ReformCorePost>
<Type Ver=1.0>generaPost</Type>
<PosterInfo type=desktop;fla>FlashMainSite</PosterInfo>
<Core_RPC>
<Name>GetServerTime</Name>
<args />
</Core_RPC>
</ReformCorePost>

ReformCore传回的xml文报是这样的:

<ReformCorePost>
<Type Ver=1.0>CmdResponse</Type>
<PosterInfo type=WebCoreServer />
<RPC_result>
<DTYPE>date;servertime</DTYPE>
<CurrentTime>2006-3-5 15:20:09</CurrentTime>
</RPC_result>
</ReformCorePost>

如果要实现上面的xml交互,首先客户端必须编写生成指定格式xml的代码,而对于每种请求xml的不同,也需要不同的代码,同时分析服务器返回的xml也需要相当多的代码来完成。

这样无疑是加重了ajax开发的复杂性和延长了开发周期。

我在开发PRP项目时写了一套函数,它可以做到下面的功能:

1.如果我要生成如下的xml文档:

<MyXML>
<MyItem>
<Item>a</Item>
</MyItem>
</MyXML>

里用接下来提供的函数,开发者只需要写如下代码:

var objXML,objArglist;
objArglist = new Object();
objArglist.MyItem = new Object();
objArglist.MyItem.Item = a;
objXML=ConstructXmlDoc(MyXML,objArguList);

这样,上述xml已经自动产生并保存在objXML中了。这样就免去了繁琐的CreateElements、appendChild之类的操作函数了。

2.如果服务器传回了下面的xml文档:

<ReformCorePost>
<Type Ver=1.0>CmdResponse</Type>
<PosterInfo type=WebCoreServer />
<RPC_result>
<DTYPE>date;servertime</DTYPE>
<CurrentTime>2006-3-5 15:20:09</CurrentTime>
</RPC_result>
</ReformCorePost>
假设采用objResponseXML保存这个文报,那么采用下面代码:
var objParsedXML;
objParsedXML = ParseXml(objResponseXML);
上述XML已经自动转化为等价的object类型,如果我要读取xml中CurrentTime字段的数据,只需用代码:
var strCurrentTime = objParsedXML.RPC_result[0].CurrentTime[0].value;
是不是简单多了?
这两个函数就是将Object对象中的成员数据和xml文档进行了互换,由于篇幅有限,其中的函数我就作为附件给出下载地址。具体的使用可以直接来询问我。对于asp版本暂时不打算公开
转载和修改时请保留原作者信息。
上述函数库js下载地址:
http://www.csksoft.net/data/legacyftp/Products/code_and_lib/reformcore_xmlparser.rar
好了,终于写完了
  • quote 2.旷野无霜
  • 觉得用一些开源的库比较方便,就是和自己系统整合起来也许会有麻烦。
  • 3/8/2006 8:41:29 PM 回复该留言

发表评论:

注意:为了有效防止SPAM,任何含有http://字样的消息会被阻止发布同时,本站仅供技术交流,请不要讨论任何政治敏感话题或者低级趣味问题。

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)