当前页面位置: » 丰搜网 » 文档中心 » 详细内容
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(或x
html)和层叠样式表作为表达信息,来创建交互式的
web应用的开发技术;文档对象模型(dom),
javascript,动态地显示和与表达信息进行交互;并且,
xmlhttprequest对象与
web服务器异步地交换和处理数据。
因特网上许多例子展示了在一个
html文件内部使用
xmlhttprequest与
服务器端进行交互的必要的步骤。当手工地编写和维护
xmlhttprequest代码时,开发者必须处理许多潜在的问题,特别是类似于跨浏览器的dom实现的兼容性这样的问题。这将会导致在编码和调试
javascript代码上面花费数不清的时间,这显然对开发者来说很不友好。
dwr(直接
web远程控制)项目是在apache许可下的一个
开源的解决方案,它供给那些想要以一种简单的方式使用
ajax和
xmlhttprequest的开发者。它具有一套
javascript功能集,它们把从
html页面调用
应用服务器上的
java对象的方法简化了。它操控不同类型的参数,并同时保持了
html代码的可读性。
dwr不是对一个设计的插入,也不强迫对象使用任何种类的继承结构。它和
servlet框架内的应用配合的很好。对缺少d
html编程经验的开发者来说,dwr也提供了一个
javascript库包含了经常使用的d
html任务,如组装表,用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上,它显示了对象的公共方法。所列方法可以从页面中调用,允许你,第一次,运行
服务器上的对象的方法。下图显示了调试页的样子:
调试页
现在你必须让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/
·on
java.com:on
java.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/