最近 Ajax 比较火,全世界都在讨论。于是我也掺和掺和,直接用 XMLHttpRequest ?现在的我还没有那个水平。用 Echo2 或者 backbase ,又感觉那些纯 Ajax 的 framework 太重量级了。我要的只是一些简单的应用而已。于是寻觅的重点放在了一些对 xmlhttpRequest 进行轻量级包装的代码库上了。于是我找到了 DWR ( Direct Web Remoting )。 DWR 的口号是 AJAX and XMLHttpRequest made easy ,并且它也基本上做到了这一点。它提供了一个友好的框架和一些很有用的 JavaScript 库,可以让我用起 Ajax 更容易些。详细的信息可以到他们的网站 http://www.getahead.ltd.uk/dwr/ 。顺便在介绍一个网站吧: http://www.ajaxmatters.com 这里也有很多关于 Ajax 的资源。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
下面来简单介绍一下 DWR 。
其实在没有 XMLHttpRequest 前 DWR 就有了,那时它用的是 IFrame ,效果很差,所以我看看了就没有再 diao 它。现在的 DWR 主要用 XMLHttpRequest ,当然也可以选者用 IFrame ,但是不推荐。
DWR 是个 open source software ,授权方式是 ASL version 2.0 的。现在网站上 examples and tutorials 做的也不错。我就根据这些东西自己也做了一个应用,在本文的后面我会详细讲到。
现在 DWR 的最新版本是 1.0RC1 。在我的试用环境相还算比较稳定,没有出现什么问题。
DWR 本身以一个 dwr.jar 的 jar 包存在,它的入口时一个 Servlet ( uk.ltd.getahead.dwr.DWRServlet )所以要在 web.xml 里配置一下就可以了。具体配置看这里 http://www.getahead.ltd.uk/dwr/intro.html 。比较简单。 dwr 为我们提供了一个 framework 帮我们很容易的实现 JavaScript 和 java 之间的通信。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype>
我还没有看过
dwr
的源码,具体他是怎么实现的我也不太清楚。但大致上肯定是通过
xmlhttprequest
来调用它的
servlet
然后把数据用
xml
打包解包了。其实我觉得这部分到不是
dwr
给我带来的最方便的地方。最方便的地方应该是他的那些
js
的库。
所以下面我要介绍一下它的两个重要 js 对象。
DWREngine ( engine.js 中), DWRUtil (util.js 中 ) 。
DWREngine 中的方法是基本上是关于 XMLHttpRequest 的。
下面中介绍一些
DWREngine.setErrorHandler(handler)
默认的错误处理时弹出一个对话框,你可以通过这个方法改变成你需要的表现形式。
DWREngine.setWarningHandler(handler)
改变默认的警告处理形式
DWREngine.beginBatch()
Some Remote Function…
DWREngine.endBatch()
当你有几个远程调用要一起进行时,就要用到这两个方法。
如果不用这两个方法,你就会发现你的远程调用并不以你想象的顺序进行。
DWREngine 中还有一些其它的方法,我没有用过。你可以通过 dwr 的 js-doc 来看。如果通过文档看不懂它是干什么用的,就看 js 源码,源码的注释也是比较详细的。
DWRUtil 中也有一些很有用的方法。这些方法一般是编写 js 的辅助方法。
比如 setValue 和 getValue 。大多数 html 标签有 value 属性,这时你要获取或者设置它的值时就用 $(“someid”).value 就可以了。但是有些 html 标记是没有 value 属性的,它的值时在标签的中间,如 <span id=”span<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chmetcnv unitname="”" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1”</chmetcnv>>some value</span> 这时你要取或设它的值的时候就用 DWRUtil.setValue($(“span1”) , someValue) 。这样你就可以在客户端动态的表现一些数据了。
还有很多很好用的方法, dwr 的例子中有一些说明,源码中的注释也比较详细。
Dwr
就介绍到这里吧。下一篇,我做了个
table
的例子。