DWR让AJAX如此简单

simmone 发表于 2005-11-07 00:07:58
作者:Cloves Carneiro;simmone     来源:javaworld
评论数:39 点击数:17,481     投票总得分:15 投票总人次:5
关键字:DWR AJAX

摘要:

这篇文章阐述了使用开源项目DWR(直接Web远程控制)和AJAX(异步JavaScript和XML)的概念来提高Web应用的可用性。作者一步步来展示DWR如何使得AJAX的应用既简单又快
DWR让AJAX如此简单

利用DWR开始在你的Web应用中使用AJAX

作者:Cloves Carneiro

译者:simmone


版权声明:任何获得Matrix授权的网站,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
作者:Cloves Carneiro;simmone
原文地址:http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-dwr.html
中文地址:http://www.matrix.org.cn/resource/article/43/43926_DWR_AJAX.html
关键词: DWR AJAX


概述

这篇文章阐述了使用开源项目DWR(直接Web远程控制)和AJAX(异步JavaScript和XML)的概念来提高Web应用的可用性。作者一步步来展示DWR如何使得AJAX的应用既简单又快捷。(1600字;2005年6月20日)

AJAX,或者说是异步JavaScript和XML,描述了一种使用混合了HTML(或XHTML)和层叠样式表作为表达信息,来创建交互式的Web应用的开发技术;文档对象模型(DOM),JavaScript,动态地显示和与表达信息进行交互;并且,XMLHttpRequest对象与Web服务器异步地交换和处理数据。

因特网上许多例子展示了在一个HTML文件内部使用XMLHttpRequest与服务器端进行交互的必要的步骤。当手工地编写和维护XMLHttpRequest代码时,开发者必须处理许多潜在的问题,特别是类似于跨浏览器的DOM实现的兼容性这样的问题。这将会导致在编码和调试Javascript代码上面花费数不清的时间,这显然对开发者来说很不友好。

DWR(直接Web远程控制)项目是在Apache许可下的一个开源的解决方案,它供给那些想要以一种简单的方式使用AJAX和XMLHttpRequest的开发者。它具有一套Javascript功能集,它们把从HTML页面调用应用服务器上的Java对象的方法简化了。它操控不同类型的参数,并同时保持了HTML代码的可读性。

DWR不是对一个设计的插入,也不强迫对象使用任何种类的继承结构。它和servlet框架内的应用配合的很好。对缺少DHTML编程经验的开发者来说,DWR也提供了一个JavaScript库包含了经常使用的DHTML任务,如组装表,用item填充select下拉框,改变HTML元素的内容,如<div>和<span>
DWR网站是详尽的并且有大量的文档,这也是这篇文章的基础。一些例子用来展示DWR如何使用和用它的库可以完成什么样的工作。

这篇文章让读者看到了一个使用了DWR的Web应用是如何一步步建立的。我会展示创建这个简单的示例应用的必要的细节,这个应用是可下载的并且可以在你的环境中布署来看看DWR如何工作。
注意:找到有关AJAX的信息并不困难;网页上有几篇文章和博客的条目涵盖了这个主题,每一个都试图指出和评论这个概念的不同的方面。在资源部分,你会找到一些有趣的指向示例和文章的链接,来学习AJAX的更多的内容。

示例应用
这篇文章使用的示例应用模拟了多伦多的一个公寓出租搜索引擎。用户可以在搜索前选择一组搜索标准。为了提高交互性,AJAX中以下两种情况下使用:
·应用通告用户配合他的选择会返回多少搜索结果。这个数字是实时更新的-使用AJAX-当用户选择的卧室和浴室的数量,或者价格范围变化时。当符合标准的搜索结果没有或太多时,用户就没有必要点击搜索按纽。
·数据库查询并取回结果是由AJAX完成的。当用户按下显示结果按钮时,数据库执行搜索。这样,应用看起来更具响应了,而整个页面不需要重载来显示结果。

数据库
我们使用的数据库是HSQL,它是一种占用资源很小的Java SQL数据库引擎,可以不需要安装和配置的与Web应用捆绑在一起。一个SQL文件被用来在Web应用的上下文启动时创建一个内存中的表并添加一些记录。

Java类
应用包含了两个主要的类叫Apartment和ApartmentDAO。Apartment.java类是一个有着属性和getter/setter方法的简单的Java类。ApartmentDAO.java是数据访问类,用来查询数据库并基于用户的搜索标准来返回信息。ApartmentDAO类的实现的直接了当的;它直接使用了Java数据库联接调用来得到公寓的总数和符合用户请求的可用公寓的列表。

DWR配置和使用
设置DWR的使用是简单的:将DWR的jar文件拷入Web应用的WEB-INF/lib目录中,在web.xml中增加一个servlet声明,并创建DWR的配置文件。DWR的分发中需要使用一个单独的jar文件。你必须将DWR servlet加到应用的WEB-INF/web.xml中布署描述段中去。
    <servlet>
        <servlet-name>dwr-invoker</servlet-name>
        <display-name>DWR Servlet</display-name>
        <description>Direct Web Remoter Servlet</description>
        <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>true</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>dwr-invoker</servlet-name>
        <url-pattern>/dwr/*</url-pattern>
    </servlet-mapping>


一个可选的步骤是设置DWR为调试模式—象上面的例子那样—在servlet描述段中将debug参数设为true。当DWR在调试模式时,你可以从HTMl网页中看到所有的可访问的Java对象。包含了可用对象列表的网页会出现在/WEBAPP/dwr这个url上,它显示了对象的公共方法。所列方法可以从页面中调用,允许你,第一次,运行服务器上的对象的方法。下图显示了调试页的样子:

image
调试页

现在你必须让DWR知道通过XMLHttpRequest对象,什么对象将会接收请求。这个任务由叫做dwr.xml的配置文件来完成。在配置文件中,定义了DWR允许你从网页中调用的对象。从设计上讲,DWR允许访问所有公布类的公共方法,但在我们的例子中,我们只允许访问几个方法。下面是我们示例的配置文件:
<dwr>
    <allow>
        <convert converter="bean" match="dwr.sample.Apartment"/>
        <create creator="new" javascript="ApartmentDAO" class="dwr.sample.ApartmentDAO">
            <include method="findApartments"/>
            <include method="countApartments"/>
        </create>
    </allow>
</dwr>


上面的文件实现了我们例子中的两个目标。首先,<convert>标记告诉DWR将dwr.sample.Apartment对象的类型转换为联合数组,因为,出于安全的原因,DWR默认的不会转换普通bean。第二,<create>标记让DWR暴露出dwr.sample.ApartmentDAO类给JavaScript调用;我们在页面中使用JavaScript文件被javascript属性定义。我们必须注意<include>标记,它指明了dwr.sample.ApartmentDAO类的哪些方法可用。

HTML/JSP代码
配置完成后,你就可以启动你的Web应用了,这时DWR会为从你的HTML或Java服务器端页面(JSP)上调用所需方法作好准备,并不需要你创建JavaScript文件。在search.jsp文件中, 我们必须增加由DWR提供的JavaScript接口,还有DWR引擎,加入以下三行到我们的代码中:

  <script src='dwr/interface/ApartmentDAO.js'></script>
  <script src='dwr/engine.js'></script>
  <script src='dwr/util.js'></script>


我们注意到当用户改变搜索标准时,这是AJAX在示例程序中的首次应用;正如他所看到的,当标准改变时,可用的公寓数量被更新了。我创建了两个JavaScript函数:当某一个选择下拉框中的值变化时被调用。ApartmentDAO.countApartments()函数是最重要的部分。最有趣的是第一个参数, loadTotal()函数,它指明了当接收到服务端的返回时DWR将会调用的JavaScript方法。loadTotal于是被调用来在HTML页面的<div>中显示结果。下面是在这个交互场景中所使用到的JavaScript函数:

function updateTotal() {
    $("resultTable").style.display = 'none';
    var bedrooms = document.getElementById("bedrooms").value;
    var bathrooms = document.getElementById("bathrooms").value;
    var price = document.getElementById("price").value;
    ApartmentDAO.countApartments(loadTotal, bedrooms, bathrooms, price);
}

function loadTotal(data) {
    document.getElementById("totalRecords").innerHTML = data;
}


很明显,用户想看到符合他的搜索条件的公寓列表。那么,当用户对他的搜索标准感到满意,并且总数也是有效的话,他会按下显示结果的按纽,这将会调用updateResults() JavaScript方法:

function updateResults() {
    
    DWRUtil.removeAllRows("apartmentsbody");
    var bedrooms = document.getElementById("bedrooms").value;
    var bathrooms = document.getElementById("bathrooms").value;
    var price = document.getElementById("price").value;
    ApartmentDAO.findApartments(fillTable, bedrooms, bathrooms, price);
    $("resultTable").style.display = '';
}

function fillTable(apartment) {
    DWRUtil.addRows("apartmentsbody", apartment, [ getId, getAddress, getBedrooms, getBathrooms, getPrice ]);
}


updateResults()方法清空了存放搜索返回结果的表域,从用户界面上获取所需参数,并且将这些参数传给DWR创建的ApartmentDAO对象。然后数据库查询将被执行,fillTable()将会被调用,它解析了DWR返回的对象(apartment),然后将其显示到页面中(apartmentsbody)。

安全因素
为了保持示例的简要,ApartmentDAO类尽可能的保持简单,但这样的一个类通常有一组设置方法来操作数据,如insert(), update()和delete()。DWR暴露了所有公共方法给所有的HTML页面调用。出于安全的原因,像这样暴露你的数据访问层是不明智的。开发者可以创建一个门面来集中所有JavaScript函数与底层业务组件之间的通信,这样就限制了过多暴露的功能。

结论
这篇文章仅仅让你在你的项目中使用由DWR支持的AJAX开了个头。DWR让你集中注意力在如何提高你的应用的交互模型上面,消除了编写和调试JavaScript代码的负担。使用AJAX最有趣的挑战是定义在哪里和如何提高可用性。DWR负责了操作Web页面与你的Java对象之间的通信,这样就帮助你完全集中注意力在如何让你的应用的用户界面更加友好,
我想感谢Mircea Oancea和Marcos Pereira,他们阅读了这篇文章并给予了非常有价值的返匮。

资源
·javaworld.com:javaworld.com
·Matrix-Java开发者社区:http://www.matrix.org.cn/
·onjava.com:onjava.com
·下载示例程序的全部源码:http://www.javaworld.com/javaworld/jw-06-2005/dwr/jw-0620-dwr.war
·DWR: http://www.getahead.ltd.uk/dwr/index.html
·HSQL:http://hsqldb.sourceforge.net/
·AJAX的定义:http://en.wikipedia.org/wiki/AJAX
· “AJAX:通向Web应用的新途径": Jesse James Garrett (Adaptive Path, 2005.2): http://www.adaptivepath.com/publications/essays/archives/000385.php
· “非常动态的Web界面” Drew McLellan (xml.com, 2005.2): http://www.xml.com/pub/a/2005/02/09/xml-http-request.html
·XMLHttpRequest & AJAX 工作范例: http://www.fiftyfoureleven.com/resources/programming/xmlhttprequest/examples
· “可用的XMLHttpRequest实践” Thomas Baekdal (Baekdal.com, 2005.3): http://www.baekdal.com/articles/Usability/usable-XMLHttpRequest/
·"XMLHttpRequest使用导引" Thomas Baekdal (Baekdal.com,  2005.2):http://www.baekdal.com/articles/Usability/XMLHttpRequest-guidelines/
·AJAX实质:http://www.ajaxmatters.com/





本页页面地址:

投票评分(记入本贴作者的专家分)

     非常好 还行 一般 扔鸡蛋          投票总得分: / 投票总人次:

用户评论列表

#1 评论作者: Stive 发表时间: 2005-11-10 10:29 上午

AJAX最近实在是火……不过,作为小公司,目前还只能做到“关注”,要先期投入的话,暂时没有这个实力哟。

#2 评论作者: xin_huang 发表时间: 2005-11-12 11:51 上午

dwr 我也试过,确实不错呵呵

#3 评论作者: skater 发表时间: 2005-12-18 10:32 下午

AJAX最近实在是火……不过,作为小公司,目前还只能做到“关注”,要先期投入的话,暂时没有这个实力哟。
???为什么,可以不用DWR,自己写AJAX啊,这样就不用放入其他的第三方类库了。

#4 评论作者: smilingyou 发表时间: 2005-12-27 05:23 下午

不错,还有其它的开源框架如Rico,下面一个完整例子
http://blog.hexun.com/xxsc/1834560_d.html

#5 评论作者: Frank 发表时间: 2006-01-25 07:25 下午 E-mail: sex828@hotmail.com

AJAX 不过是隐含页提交技术的一种, 不是什么新技术啊?

#6 评论作者: ssmax 发表时间: 2006-03-09 02:46 下午

AJAX不就是把数据规范化和模块化
就是客户端发起异步HTTP请求和做XML分析出页面来,没必要搞到这么复杂吧,而且服务器负载不是太大的时候没什么必要做这种东西
原来的一个请求变为n个请求 和 服务器端解释数据到底哪个占用资源多点还不是太确定呢。

#7 评论作者: dfgfssdfg 发表时间: 2006-03-14 03:42 下午 E-mail: sdgdfg

gyfhsdfgfdsssssssssssss

#8 评论作者: GOVO 发表时间: 2006-04-12 02:04 上午

我不明白为何本例中得把Apartment 设为一个bean?
还有,关于var getId = function(unit) { return unit.id };这一句中的unit我不懂是什么,请指教,谢谢!

#9 评论作者: keevn 发表时间: 2006-04-19 05:22 上午 E-mail: 可俄

#8951 评论作者:ssmax 发表时间:2006-03-09 02:46
AJAX不就是把数据规范化和模块化
就是客户端发起异步HTTP请求和做XML分析出页面来,没必要搞到这么复杂吧,而且服务器负载不是太大的时候没什么必要做这种东西
原来的一个请求变为n个请求 和 服务器端解释数据到底哪个占用资源多点还不是太确定呢。

--------------------
ajax可不是为了解决服务器负载的问题,它是为了提供更好的交互性,集合桌面应用的易用界面和web服务的持续发布性,给服务器负载带来的好处最多只是个副产品

#10 评论作者: Lalers530 发表时间: 2006-05-08 02:24 下午

AJAX不就是把数据规范化和模块化
就是客户端发起异步HTTP请求和做XML分析出页面来,没必要搞到这么复杂吧,而且服务器负载不是太大的时候没什么必要做这种东西
原来的一个请求变为n个请求 和 服务器端解释数据到底哪个占用资源多点还不是太确定呢
其中的"原来的一个请求变为n个请求"是什么意思啊...怎么可能呢,

#11 评论作者: agito 发表时间: 2006-05-18 01:23 下午

回复GOVO:
你提出这个问题答案如下:
在util.js下,for (var row in data) 循环读出每一条数据出来,
for (var j = 0; j < cellFuncs.length; j++)
读取每个参数的名称,var func = cellFuncs[j];
返回参数获得var reply = func(row);
我是写不出来这样的java script,我觉得这样的框架用处并不大,要按实际效果来编写,比较合适!

#12 评论作者: bugaboo 发表时间: 2006-07-13 01:58 下午

原文中USELESS那个回复说得很好

#13 评论作者: yourj 发表时间: 2006-08-18 04:18 下午

我想问 dwr/interface/ApartmentDAO.js 是从那里来到啊

#14 评论作者: oceanmeng 发表时间: 2006-08-20 04:31 下午

ApartmentDAO.js应该是运行期动态生成的.所以你看目录中并没有此js文件

#15 评论作者: wayshall 发表时间: 2006-08-21 11:09 下午

我想知道怎样在js中获得dwr.sample.Apartment的属性直

#16 评论作者: feynixs 发表时间: 2006-09-07 08:20 下午

我试了一下,还不错的想法,呵呵

#17 评论作者: feynixs 发表时间: 2006-09-07 08:21 下午

这个发表评论就用了DWR吧,呵呵

#18 评论作者: Adam 发表时间: 2006-09-13 04:40 下午

不错,想学一下这个,但好象还有一个叫Buffalo,不知道哪个更好一点

#19 评论作者: 333 发表时间: 2006-10-10 10:28 上午

333333333333333333333333333

#20 评论作者: fds 发表时间: 2006-10-18 01:47 上午

不错,我正在想学习呢

#21 评论作者: test 发表时间: 2006-11-01 05:55 下午

test

#22 评论作者: test 发表时间: 2006-11-01 05:55 下午

safdadfasdfasdfasdf

#23 评论作者: dsassd 发表时间: 2006-11-08 06:48 下午

ewwerwerererwrwr

#24 评论作者: dsassd 发表时间: 2006-11-08 06:49 下午

werrrrrrrrrrrrrrrrrrrr

#25 评论作者: zhou 发表时间: 2006-11-09 03:13 下午

testestestasssdfsdf

#26 评论作者: ykxian01 发表时间: 2006-11-14 10:52 上午

还是有些用的
不过没有开发环境支持,效率比较低

#27 评论作者: aaaaaaaaa 发表时间: 2006-11-15 04:07 下午

rerrererer

#28 评论作者: cleopatra 发表时间: 2006-11-17 03:04 下午

testtest

#29 评论作者: cleopatra 发表时间: 2006-11-17 03:04 下午

testtest

#30 评论作者: cleopatra 发表时间: 2006-11-17 03:04 下午

testtest

#31 评论作者: aaa 发表时间: 2006-11-18 01:21 下午

shi yong.....

#32 评论作者: say no 发表时间: 2006-11-27 02:23 下午

ajax虽然是老技术,但组合得不错,值得学习

#33 评论作者: jiajia 发表时间: 2006-12-13 05:54 下午

楼主,请问源码中的3个js分别在哪里啊,要怎样才能运行起来啊

#34 评论作者: ohoh 发表时间: 2006-12-18 09:39 上午

ohohohohohohohohohoh

#35 评论作者: Wesley 发表时间: 2006-12-27 04:50 下午

3Q                

#36 评论作者: Wesley 发表时间: 2006-12-27 04:51 下午

3q ~~~~~~~~~~~~~~~

#37 评论作者: ken_fifa 发表时间: 2007-01-18 08:59 上午

dwr 和其他mvc框架整合,会不会出现一些问题啊?

#38 评论作者: ken_fifa 发表时间: 2007-01-18 08:59 上午

dwr 和其他mvc框架整合,会不会出现一些问题啊?

#39 评论作者: wangnet 发表时间: 2007-12-24 07:40 下午

ajax根本不是新技术


发表我的评论 (评论可增加个人积分...)

用户*: E-mail:
评论内容*:

支持BBCode
算术题*: + =