Ajax一统天下之Dojo整合篇

随着Ajax应用越来越多,各种Ajax Library(Prototype),Ajax Framework(DWR),Ajax Toolkit(Dojo,YUI)也日渐丰富起来,有没有办法将这些结合起来呢?类似Spring的做法,当然我没法整出一个IoC的微内核将各种Ajax“粘合”起来,但是将这些Ajax可重用的组件加以整合应该是没有问题的,这样即可以避免重复发明轮子,还可以针对各种Ajax进行扬长避短,形成一套比较全面的Ajax解决方案。同时也增加了开发人员选择自己熟悉Ajax组件的灵活性。

目前我们公司已经形成一套基于Ajax的完整的产品,封装了自己的Ajax前后台通讯机制以及提供了可重用的客户端组件,我尝试了一下将我们的产品与Dojo Toolkit进行整合。下面是我的做法,整合的是Dojo ComboBox Widget,它实际上是一个Auto Completion组件,类似Google Suggest。

从Dojo提供的测试类test_ComboBox.html入手,加debugger进行跟踪调试,理清Dojo Widget的加载流程。

经过跟踪调试,对Dojo的Widget有了一个大致的了解:首先是加载当前需要的JavaScript文件,然后对整个html页面进行解析。在页面上使用widget有三种方式:一种就是在html元素上添加一些dojo能解析的属性,如

<select dojoType="combobox" style="width: 300px;" name="foo.bar1" autocomplete="false"

onValueChanged="setVal1"

>

其中的dojoType,autocomplete, onValueChanged都是dojo能够识别的属性,这个有些类似typestry的做法。第二种就是使用DojoML的写法:

<dojo:combobox style="width: 300px;" name="foo.bar1" autocomplete="false"

onValueChanged="setVal1"

/>

这种写法有些变态,跟jsp中的自定义标签基本就是一回事,只是把解析的过程从后台移到了前台来做,后来看到有些框架也这么干,也就没话说了。

还有一种写法是使用javascript在页面加载完成之后,在指定的html元素创建widget:

var combo;

dojo.addOnLoad(init);

function init(){

combo = dojo.widget.createWidget("dojo:ComboBox", {name:"prog",autocomplete:false,dataUrl:"comboBoxData.js"}, dojo.byId("progCombo"));

}

在对元素解析创建的时候同时利用dojo定义的combobox html模版以及css模版完成在页面中插入最终的combobox控件的目的。

接下来看看Dojo ComboBox如何通过ajax与后台通讯,Dojo ComboBox提供了两种自动完成方式:一种是将所有的数据下载到前台缓存,然后在前台根据用户输入的数据从缓存中匹配出自动完成所需要的数据列表。另外一种就是根据用户每次输入的数据实时向后台发送请求获得要自动完成的数据,当然这个数据也会以用户输入的内容为key,以得到的数据为value进行缓存。对于两种方式,Dojo通过不同的DataProvider来实现(dojo.widget.incrementalComboBoxDataProvider和dojo.widget.basicComboBoxDataProvider),这一点非常精妙,让我非常佩服。而这两个类都是通过dojo.declare(“className”, “parentClassName”, constructor, declarationBody)这种方式来做的,这个也和我们以往的做法有别。总之就是比较精妙啦!

Dojo向后台发送请求的过程封装在dojo.io.bind()这个方法中,而我们有自己的一套前后台通讯机制,因为必须想办法将dojo.io.bind()替换成我们的做法来达到最终整合的目的,因为Dojo ComboBox的数据交互都是封装在DataProvider里面的,因为我们只需要实现自己的DataProvider就可以搞定了,这样我们无须修改Dojo的源,而且还可以使用Dojo的继承机制,从已有的DataProvider集成复写掉我需要替换的方法,这让我有了写Java的感觉。

dojo.declare(

"dojo.widget.incrementalDoradoComboBoxDataProvider",

dojo.widget.incrementalComboBoxDataProvider,

null,

{

//要替换的方法,使用自己的通讯机制

startSearch: function(/*String*/ searchStr, /*Function*/ callback){

if(this._inFlight){

// FIXME: implement backoff!

}

var cmd = getControl(this.searchUrl);

cmd.parameters().setValue("searchString", searchStr);

var _this = this;

EventManager.addDoradoEvent(cmd, "onSuccess", function(command){

_this._inFlight = false;

//convention:

//1.the key must be "result"

//2.the data format must be [["Alabama","AL"],["Alaska","AK"]] or [{"Alabama":"AL"},{"Alaska":"AK"}]

var data = dj_eval(command.outParameters().getValue("result"));

if(!dojo.lang.isArray(data)){

var arrData = [];

for(var key in data){

arrData.push([data[key], key]);

}

data = arrData;

}

_this._addToCache(searchStr, data);

callback(data);

}

);

cmd.execute();

this._inFlight = true;

}

}

);

通过上面的处理,就可以使用我们自己的前后台通讯机制来完成请求数据的目的。

接下来就是生成我们的页面,添加dojo加载js的脚本:

<script type="text/javascript" src="./dojo/dojo.js"></script>

<script type="text/javascript">

dojo.require("dojo.widget.ComboBox");

// 注意这里有一个定位的问题,查找路径必须加"..",

// 因为dojo在查找DoradoComboBox.js的时候会从"/dojo"而不是"/"目录开始查找

// 最终使用xmlhttp加载的路径是/dojo/../adapter/dojo/widget/DoradoComboBox.js

dojo.setModulePrefix("adapter.dojo.widget","../adapter/dojo/widget");

dojo.require("adapter.dojo.widget.DoradoComboBox");

</script>

下面要加载的控件部分html:

<input dojoType="ComboBox"

dataUrl="cmdComboboxSearch"

dataProviderClass = "dojo.widget.incrementalDoradoComboBoxDataProvider"

style="width: 200px;"

name="sample2"

autocomplete="false"

>

这样我们的整合工作就完成了,对了还有文件的目录结构:

Webapp

|--adapter(存放所有用于整合的js文件)

|------dojo

|---------widget

|-----------DoradoComboBox.js

|--dojo(dojo的所有js文件)

|------src

|------dojo.js

|--js(我们自己组件库的js文件)

|--WEB-INF

结论

通过扩展之后还是发现了不少问题:

1、由于集成的两套东西都会在Object.prototype, Array.prototype, Function.prototype上加一些自己的东西,因此这样非常容易带来命名上的冲突,已经碰到这个问题。

2、由于二者都会使用一些全局性的函数,变量等,这样也会存在潜在的冲突,不过目前还没有碰到。

3、多套js库要同时加载,客户端的压力是不是大了些?性能可以接受吗?目前还没有测试不得而知。

(0)

相关推荐

  • Ajax一统天下之Dojo整合篇

    随着Ajax应用越来越多,各种Ajax Library(Prototype),Ajax Framework(DWR),Ajax Toolkit(Dojo,YUI)也日渐丰富起来,有没有办法将这些结合起来呢?类似Spring的做法,当然我没法整出一个IoC的微内核将各种Ajax"粘合"起来,但是将这些Ajax可重用的组件加以整合应该是没有问题的,这样即可以避免重复发明轮子,还可以针对各种Ajax进行扬长避短,形成一套比较全面的Ajax解决方案.同时也增加了开发人员选择自己熟悉Ajax组件

  • AJAX FCKEditor Rich Editor整合篇第1/2页

    (http://www.fckeditor.net, JavaEye的编辑器也是采用的FCKEditor,XX所见略同?呵呵),它OpenSource(免费啊,可以直接改源代码啊,呵呵),功能强大(几乎就是一个office word的web版),提供了对各种服务器端的支持(虽然它完全是一个纯客户端的东东, 但是目前提供了与.NET, PHP, Java, Coldfusion, Perl, Lasso, Python各种服务器端脚本的紧密集成),支持国际化(汉化做的非常棒),可更换皮肤(offi

  • Ajax 框架之SSM整合框架实现ajax校验

    刚学习了ssm框架,ajax校验成功,分享下 1.导入jar包 2.配置spring-servlet.xml <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mapping

  • Ajax初试之读取数据篇实现代码

    是的,今天我们要实现的效果是.在不刷新网页的情况下读取并显示服务端的数据. 拿出来我们上次准备好的东西. 1:XMLHTTPRequest对象的函数. 2:Asp输出xml格式的文件.你可以点击查看该文件内容 复制代码 代码如下: <% '出自:http://Www.Web666.Net '作者:康董 '如需转载请务必保留以上信息 '定义一个变量,来保存xml数据 dim xml xml = "<?xml version='1.0' encoding='gb2312'?><

  • AJAX初体验之实战篇——打造博客无刷新搜索

    如果你对AJAX不是很了解,可以先看看这篇教程的前篇<AJAX初体验之上手篇>. 现在博客很流行,相信应该上网时间稍微长点的朋友都会在这或者在那的有一个自己的博客.对于一些有一定能力的朋友,可能更喜欢自己去下载一个博客程序来架设一个自己的博客,而不是使用一些博客网站提供的服务.而大部分博客程序所带的搜索功能是提交查询关键字到搜索页面,然后在后台生成搜索结果,再呈现给用户,这过程之中浪费了一些带宽,如博客的侧边栏.要节约这一些带宽,我们可以用AJAX来打造自己的无刷新日志搜索. 在本篇教程中,数

  • Ajax添加数据与删除篇实现代码

    如果你真的把前几篇掌握了.实现ajax删除功能会易如反常.我所要教你的是.灵活利用JavaScript和Dom来实现一个酷酷的删除效果.其实你学习到这里.已经能够明白,在ajax技术中那些被请求的 服务端网页,在非ajax应用中并无太大区别.无非也是接受前端发过来的请求.在后台执行一些操作而已!学习完这篇教程以后.你会明白想要实现够炫够酷的的ajax效果.你必须要熟练掌握JavaScript Dom 这些技术精通. 刚刚我喝多了,上面的这段话是我在两天前就写好的.我本来想直接睡觉的.但我想试试.

  • Ajax初试之读取数据篇

    拿出来我们上次准备好的东西.1:XMLHTTPRequest对象的函数.2:Asp输出xml格式的文件.你可以点击查看该文件内容:Asp输出xml格式的数据 打开以后你会发现我们使用Asp技术动态的输出一个xml格式的数据.如果你对该技术还不了解,请返回阅读:ajax开始准备篇 在这个输出的数据里面有一个msg标签.标签里包含了一段文字内容.今天我们就读取这个msg标签.并将文字内容显示到你的网页上. 先看下面的代码.并附上效果演示 web_ajax.asp 复制代码 代码如下: <?xml v

  • AJAX架构之Dojo篇

    作者:hopesoft出处:http://www.51ajax.com 一.前言自去年开始,AJAX一下成了关注的技术热点,各种AJAX框架迅速的发展了起来,其中又分为客户端AJAX架构,服务器端AJAX架构等,其中DojoToolkit做为一个优秀的客户端AJAX架构,被越来越多的人所关注,学习.自去年开始,AJAX一下成了关注的技术热点,各种AJAX框架迅速的发展了起来,其中又分为客户端AJAX架构,服务器端AJAX架构等,其中DojoToolkit做为一个优秀的客户端AJAX架构,被越来越

  • Ajax修改数据即时显示篇实现代码

    我们这次要请求的服务端网页是:Edit_Data.Asp 待会我会在本次ajax教程中提供该asp文件的源码. 其实在你学会了怎么使用ajax添加数据时,想实现修改数据对你来说已经很容易了!费话不说先看前端的JavaScript代码和本次的ajax实例效果! 复制代码 代码如下: <html> <head> <title>ajax修改数据</title> <style> body{ font-size:12px; } </style>

  • AJAX初体验之上手篇

    AJAX是这两年蛮热的东西,我也凑凑热闹,前些天去找了些教程学学,下面就按整个处理过程把自己学的东西写写,不过,因为是初学,所以 有错误就请见谅啦,也欢迎指正,vipxjw#163.com. PS.写完了之后看了下,结果再次验证自己写教程真是乱得可以,东说一块西说一块,条理不太清楚的说:). 1.创建 XMLHttpRequest 对象 现在的浏览器有很多种,创建 XMLHttpRequest 的方法也不相同,所以为了兼容各种浏览器,在创建 XMLHttpRequest 时也应该考虑到各种浏 览

随机推荐