- 浏览: 30805 次
- 性别:
最近访客 更多访客>>
最新评论
-
binglang8632:
羡慕,我们从早到晚做项目,没时间整理这些。
displayTag -
jamesji:
all links no long works.
CSS 标签属性
作为J2EE开发人员,我们似乎经常关注“后端机制(backend mechanics)”。我们通常会忘记,J2EE的主要成功之处在Web应用程序方面;许多原因使得人们喜欢利用Web开发应用程序,但主要还是因为其易于部署的特点允许站点以尽可能低的成本拥有上百万的用户。遗憾的是,在过去几年中,我们在后端投入了太多的时间,而在使我们的Web用户界面对用户自然和响应灵敏方面却投入不足。
本文介绍一种方法,Ajax,使用它可以构建更为动态和响应更灵敏的Web应用程序。该方法的关键在于对浏览器端的JavaScript、DHTML和与服务器异步通信的组合。本文也演示了启用这种方法是多么简单:利用一个Ajax框架(指DWR)构造一个应用程序,它直接从浏览器与后端服务进行通信。如果使用得当,这种强大的力量可以使应用程序更加自然和响应灵敏,从而提升用户的浏览体验。
该应用程序中所使用的示例代码已打包为单独的WAR文件,可供下载。
简介
术语Ajax用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验。在Ajax之前,Web站点强制用户进入提交/等待/重新显示范例,用户的动作总是与服务器的“思考时间”同步。Ajax提供与服务器异步通信的能力,从而使用户从请求/响应的循环中解脱出来。借助于Ajax,可以在用户单击按钮时,使用JavaScript和DHTML立即更新UI,并向服务器发出异步请求,以执行更新或查询数据库。当请求返回时,就可以使用JavaScript和CSS来相应地更新UI,而不是刷新整个页面。最重要的是,用户甚至不知道浏览器正在与服务器通信:Web站点看起来是即时响应的。
虽然Ajax所需的基础架构已经出现了一段时间,但直到最近异步请求的真正威力才得到利用。能够拥有一个响应极其灵敏的Web站点确实激动人心,因为它最终允许开发人员和设计人员使用标准的HTML/CSS/JavaScript堆栈创建“桌面风格的(desktop-like)”可用性。
通常,在J2EE中,开发人员过于关注服务和持久性层的开发,以至于用户界面的可用性已经落后。在一个典型的J2EE开发周期中,常常会听到这样的话,“我们没有可投入UI的时间”或“不能用HTML实现”。但是,以下Web站点证明,这些理由再也站不住脚了:
所有这些Web站点都告诉我们,Web应用程序不必完全依赖于从服务器重新载入页面来向用户呈现更改。一切似乎就在瞬间发生。简而言之,在涉及到用户界面的响应灵敏度时,基准设得更高了。
定义Ajax
Adaptive Path公司的Jesse James Garrett这样定义Ajax:
Ajax不是一种技术。实际上,它由几种蓬勃发展的技术以新的强大方式组合而成。Ajax包含:
- 基于XHTML和CSS标准的表示;
- 使用Document Object Model进行动态显示和交互;
- 使用XMLHttpRequest与服务器进行异步通信;
- 使用JavaScript绑定一切。
这非常好,但为什么要以Ajax命名呢?其实术语Ajax是由Jesse James Garrett创造的,他说它是“Asynchronous JavaScript + XML的简写”。
Ajax的工作原理
Ajax的核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。
在创建Web站点时,在客户端执行屏幕更新为用户提供了很大的灵活性。下面是使用Ajax可以完成的功能:
- 动态更新购物车的物品总数,无需用户单击Update并等待服务器重新发送整个页面。
- 提升站点的性能,这是通过减少从服务器下载的数据量而实现的。例如,在Amazon的购物车页面,当更新篮子中的一项物品的数量时,会重新载入整个页面,这必须下载32K的数据。如果使用Ajax计算新的总量,服务器只会返回新的总量值,因此所需的带宽仅为原来的百分之一。
- 消除了每次用户输入时的页面刷新。例如,在Ajax中,如果用户在分页列表上单击Next,则服务器数据只刷新列表而不是整个页面。
- 直接编辑表格数据,而不是要求用户导航到新的页面来编辑数据。对于Ajax,当用户单击Edit时,可以将静态表格刷新为内容可编辑的表格。用户单击Done之后,就可以发出一个Ajax请求来更新服务器,并刷新表格,使其包含静态、只读的数据。
一切皆有可能!但愿它能够激发您开始开发自己的基于Ajax的站点。然而,在开始之前,让我们介绍一个现有的Web站点,它遵循传统的提交/等待/重新显示的范例,我们还将讨论Ajax如何提升用户体验。
Ajax可用于那些场景?——一个例子:MSN Money页面
前几天,在浏览MSN Money页面的时候,有一篇关于房地产投资的文章引起了我的好奇心。我决定使用站点的“Rate this article”(评价本文)功能,鼓励其他的用户花一点时间来阅读这篇文章。在我单击vote按钮并等待了一会儿之后,整个页面被刷新,在原来投票问题所在的地方出现了一个漂亮的感谢画面。
而Ajax能够使用户的体验更加愉快,它可以提供响应更加灵敏的UI,并消除页面刷新所带来的闪烁。目前,由于要刷新整个页面,需要传送大量的数据,因为必须重新发送整个页面。如果使用Ajax,服务器可以返回一个包含了感谢信息的500字节的消息,而不是发送26,813字节的消息来刷新整个页面。即使使用的是高速Internet,传送26K和1/2K的差别也非常大。同样重要的是,只需要刷新与投票相关的一小节,而不是刷新整个屏幕。
让我们利用Ajax实现自己的基本投票系统。
原始的Ajax:直接使用XmlHttpRequest
如上所述,Ajax的核心是JavaScript对象XmlHttpRequest。下面的示例文章评价系统将带您熟悉Ajax的底层基本知识:http://tearesolutions.com/ajax-demo/raw-ajax.html。注:如果您已经在本地WebLogic容器中安装了ajax-demo.war,可以导航到http://localhost:7001/ajax-demo/raw-ajax.html,
浏览应用程序,参与投票,并亲眼看它如何运转。熟悉了该应用程序之后,继续阅读,进一步了解其工作原理细节。
首先,您拥有一些简单的定位点标记,它连接到一个JavaScriptcastVote(rank)函数。
- function castVote(rank) {
- var url = "/ajax-demo/static-article-ranking.html";
- var callback = processAjaxResponse;
- executeXhr(callback, url);
- }
该函数为您想要与之通信的服务器资源创建一个URL并调用内部函数executeXhr,提供一个回调JavaScript函数,一旦服务器响应可用,该函数就被执行。由于我希望它运行在一个简单的Apache环境中,“cast vote URL”只是一个简单的HTML页面。在实际情况中,被调用的URL将记录票数并动态地呈现包含投票总数的响应。 下一步是发出一个XmlHttpRequest请求:
- function executeXhr(callback, url) {
- // branch for native XMLHttpRequest object
- if (window.XMLHttpRequest) {
- req = new XMLHttpRequest();
- req.onreadystatechange = callback;
- req.open("GET", url, true);
- req.send(null);
- } // branch for IE/Windows ActiveX version
- else if (window.ActiveXObject) {
- req = new ActiveXObject("Microsoft.XMLHTTP");
- if (req) {
- req.onreadystatechange = callback;
- req.open("GET", url, true);
- req.send();
- }
- }
- }
如您所见,执行一个XmlHttpRequest并不简单,但非常直观。和平常一样,在JavaScript领域,大部分的工作量都花在确保浏览器兼容方面。在这种情况下,首先要确定XmlHttpRequest是否可用。如果不能用,很可能要使用Internet Explorer,这样就要使用所提供的ActiveX实现。
executeXhr()方法中最关键的部分是这两行:
- req.onreadystatechange = callback;
- req.open("GET", url, true);
第一行定义了JavaScript回调函数,您希望一旦响应就绪它就自动执行,而req.open()方法中所指定的“true”标志说明您想要异步执行该请求。
一旦服务器处理完XmlHttpRequest并返回给浏览器,使用req.onreadystatechange指派所设置的回调方法将被自动调用。
- function processAjaxResponse() {
- // only if req shows "loaded"
- if (req.readyState == 4) {
- // only if "OK"
- if (req.status == 200) {
- 502 502'votes').innerHTML = req.responseText;
- } else {
- alert("There was a problem retrieving the XML data:
- " +
- req.statusText);
- }
- }
- }
该代码相当简洁,并且使用了几个幻数,这使得难以一下子看出发生了什么。为了弄清楚这一点,下面的表格(引用自http://developer.apple.com/internet/webcontent/xmlhttpreq.html)列举了常用的XmlHttpRequest对象属性。
属性 |
描述 |
onreadystatechange |
每次状态改变所触发事件的事件处理程序 |
readyState |
对象状态值:
|
responseText |
从服务器进程返回的数据的字符串形式 |
responseXML |
从服务器进程返回的DOM兼容的文档数据对象 |
status |
从服务器返回的数字代码,比如404(未找到)或200(就绪) |
statusText |
伴随状态码的字符串信息 |
现在processVoteResponse()函数开始显示出其意义了。它首先检查XmlHttpRequest的整体状态以保证它已经完成(readyStatus == 4),然后根据服务器的设定询问请求状态。如果一切正常(status == 200),就使用innerHTML属性重写DOM的“votes”节点的内容。
既然您亲眼看到了XmlHttpRequest对象是如何工作的,就让我们利用一个旨在简化JavaScript与Java应用程序之间的异步通信的框架来对具体的细节进行抽象。
Ajax: DWR方式
按照与文章评价系统相同的流程,我们将使用Direct Web Remoting(DWR)框架实现同样的功能。
假定文章和投票结果存储在一个数据库中,使用某种对象/关系映射技术来完成抽取工作。为了部署起来尽可能地简单,我们不会使用数据库进行持久性存储。此外,为使应用程序尽可能通用,也不使用Web框架。相反,应用程序将从一个静态HTML文件开始,可以认为它由服务器动态地呈现。除了这些简化措施,应用程序还应该使用Spring Framework关联一切,以便轻松看出如何在一个“真实的”应用程序中使用DWR。
现在应该下载示例应用程序并熟悉它。该应用程序被压缩为标准的WAR文件,因此您可以把它放置到任何一个Web容器中——无需进行配置。部署完毕之后,就可以导航到http://localhost:7001/ajax_demo/dwr-ajax.html来运行程序。
可以查看HTML 源代码,了解它如何工作。给人印象最深的是,代码如此简单——所有与服务器的交互都隐藏在JavaScript对象ajaxSampleSvc的后面。更加令人惊讶的是,ajaxSampleSvc服务不是由手工编写而是完全自动生成的!让我们继续,看看这是如何做到的。
引入DWR
如同在“原始的Ajax”一节所演示的那样,直接使用XmlHttpRequest创建异步请求非常麻烦。不仅JavaScript代码冗长,而且必须考虑服务器端为定位Ajax请求到适当的服务所需做的工作,并将结果封送到浏览器。
设计DWR的目的是要处理将Web页面安装到后端服务上所需的所有信息管道。它是一个Java框架,可以很轻松地将它插入到Web应用程序中,以便JavaScript代码可以调用服务器上的服务。它甚至直接与Spring Framework集成,从而允许用户直接向Web客户机公开bean。
DWR真正的巧妙之处是,在用户配置了要向客户机公开的服务之后,它使用反射来生成JavaScript对象,以便Web页面能够使用这些对象来访问该服务。然后Web页面只需接合到生成的JavaScript对象,就像它们是直接使用服务一样;DWR无缝地处理所有有关Ajax和请求定位的琐碎细节。
让我们仔细分析一下示例代码,弄清它是如何工作的。
应用程序细节:DWR分析
关于应用程序,首先要注意的是,它是一个标准的Java应用程序,使用分层架构(Layered Architecture)设计模式。使用DWR通过JavaScript公开一些服务并不影响您的设计。
下面是一个简单的Java服务,我们将使用DWR框架直接将其向JavaScript代码公开:
- package com.tearesolutions.service;
- public interface AjaxSampleSvc {
- Article castVote(int rank);
- }
这是一个被简化到几乎不可能的程度的例子,其中只有一篇文章可以投票。该服务由Spring管理,它使用的bean名是ajaxSampleSvc,它的持久性需求则依赖于ArticleDao。详情请参见applicationContext.xml。
为了把该服务公开为JavaScript对象,需要配置DWR,添加dwr.xml文件到WEB-INF目录下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE dwr PUBLIC
- "-//GetAhead Limited//DTD Direct Web Remoting 0.4//EN"
- "http://www.getahead.ltd.uk/dwr/dwr.dtd">
- <dwr>
- <allow>
- <create creator="spring" javascript="ajaxSampleSvc">
- <param name="beanName" value="ajaxSampleSvc" />
- </create>
- <convert converter="bean" match="com.tearesolutions.model.Article"/>
- <exclude method="toString"/>
- <exclude method="setArticleDao"/>
- </allow>
- </dwr>
dwr.xml文件告诉DWR哪些服务是要直接向JavaScript代码公开的。注意,已经要求公开Spring bean ajaxSampleSvc。DWR将自动找到由应用程序设置的SpringApplicationContext。为此,必须使用标准的servlet过滤器ContextLoaderListener来初始化Spring ApplicationContext。 DWR被设置为一个servlet,所以把它的定义添加到web.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD
- Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
- <web-app>
- <display-name>Ajax Examples</display-name>
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
- <servlet>
- <servlet-name>ajax_sample</servlet-name>
- <servlet-class>com.tearesolutions.web.AjaxSampleServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <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>ajax_sample</servlet-name>
- <url-pattern>/ajax_sample</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>dwr-invoker</servlet-name>
- <url-pattern>/dwr/*</url-pattern>
- </servlet-mapping>
- </web-app>
做完这些之后,可以加载http://localhost:7001/ajax-demo/dwr,看看哪些服务可用。结果如下:
图3. 可用的服务
单击ajaxSampleSvc链接,查看有关如何在HTML页面内直接使用服务的示例实现。其中包含的两个JavaScript文件完成了大部分的功能:
- <script type='text/javascript'
- src='/ajax-demo/dwr/interface/ajaxSampleSvc.js'></script>
- <script type='text/javascript'
- src='/ajax-demo/dwr/engine.js'></script>
ajaxSampleSvc.js是动态生成的:
- function ajaxSampleSvc() { }
- ajaxSampleSvc.castVote = function(callback, p0)
- {
- DWREngine._execute(callback, '/ajax-demo/dwr',
- 'ajaxSampleSvc', 'castVote', p0);
- }
现在可以使用JavaScript对象ajaxSampleSvc替换所有的XmlHttpRequest代码,从而重构raw-ajax.html文件。可以在dwr-ajax.html文件中看到改动的结果;下面是新的JavaScript函数:
- function castVote(rank) {
- ajaxSampleSvc.castVote(processResponse, rank);
- }
- function processResponse(data) {
- var voteText = "Thanks for Voting!"
- + "Current ranking: " + data.voteAverage
- + " out of 5"
- + "Number of votes placed: "
- + data.numberOfVotes + "";
- 502 502'votes').innerHTML = voteText;
- }
下一步工作
在后续文章中,我将继续有关Ajax的话题,涉及下面这些方面:
- Ajax最佳实践
像许多技术一样,Ajax是一把双刃剑。对于一些用例,其应用程序其实没有必要使用Ajax,使用了反而有损可用性。我将介绍一些不适合使用的模式,突出说明Ajax的一些消极方面,并展示一些有助于缓和这些消极方面的机制。例如,对Netflix电影浏览器来说,Ajax是合适的解决方案吗?或者,如何提示用户确实出了一些问题,而再次单击按钮也无济于事?
- 管理跨请求的状态
在使用Ajax时,最初的文档DOM会发生一些变化,并且有大量的页面状态信息存储在客户端变量中。当用户跟踪一个链接到应用程序中的另一个页面时,状态就丢失了。当用户按照惯例单击Back按钮时,呈现给他们的是缓存中的初始页面。这会使用户感到非常迷惑!
- 调试技巧
使用JavaScript在客户端执行更多的工作时,如果事情不按预期方式进行,就需要一些调试工具来帮助弄清出现了什么问题。
结束语
本文介绍了Ajax方法,并展示了如何使用它来创建一个动态且响应灵敏的Web应用程序。通过使用DWR框架,可以轻松地把Ajax融合到站点中,而无需担心所有必须执行的实际管道工作。
特别感谢Getahead IT咨询公司的Joe Walker和他的团队开发出DWR这样神奇的工具。感谢你们与世界共享它!
下载
本文中演示的应用程序源代码可供下载:ajax-demo.war(1.52 MB)。
发表评论
-
displayTag
2006-12-20 21:50 4968写点儿东西真不容易,暂时写了这么些,先贴于此。 [b]Dis ... -
一个基于prototype的通用的web验证框架使用详解
2006-12-18 12:59 1392原作网址 ... -
Dom4j 学习笔记
2006-12-17 22:45 1755Dom4j 学习笔记 The dom4j Project H ... -
使用sitemesh建立复合视图
2006-12-15 13:44 1592sitemesh是opensymphony团队开发的j2ee ... -
网上找的关于http-equiv的知识,以前总是忽视
2006-12-15 13:24 35361、<meta http-equiv= "Co ...
相关推荐
在提供的“AJAX框架DWR简单应用.pdf”文件中,你可能会找到关于如何设置DWR环境、编写Java接口、配置DWR配置文件、在前端JavaScript中使用DWR,以及示例代码和实际运行效果的详细教程。这个文件是学习和理解DWR工作...
`ajax登录`可能是一个实际的DWR应用示例,展示如何实现无刷新的登录功能。`dwrdemo`可能是一个完整的DWR演示项目,包含运行示例的源代码。`dwr需要用的jar`是DWR运行所需的库文件。`Ajax无刷新页的业务逻辑实现`可能...
DWR(Direct Web Remoting)是Ajax技术的一个实现框架,使得Java开发者可以轻松地在Web应用中实现客户端和服务器端的直接通信。 Ajax的核心组件包括以下几部分: 1. **JavaScript**:作为客户端脚本语言,...
这个“Ajax之dwr框架应用”示例是一个很好的起点,帮助开发者了解如何在实际项目中应用DWR。 首先,我们来探讨DWR的基本概念。DWR允许JavaScript代码调用Java方法,就像它们是本地函数一样。这意味着可以在不刷新...
文件名"第十章"可能表示这是一个系列教程或案例研究的一部分,具体的内容可能涵盖了如何集成和使用Ajax、DWR和Struts来构建一个实际的应用。在这一章节中,读者可能会学到如何配置DWR与Struts的整合,编写Ajax请求和...
DWR(Direct Web Remoting)是一个开源JavaScript库,它使得在浏览器端可以直接调用服务器端的Java方法,实现了JavaScript与服务器端的双向通信,简化了Ajax应用的开发。 在DWR中,有三个主要的组件: 1. **DWR ...
Ajax(Asynchronous JavaScript and XML)和DWR(Direct Web Remoting)是两种在Web开发中广泛使用的技术,特别是在创建交互式、动态和响应式的网页时。这个压缩包文件中的实例很可能是为了帮助开发者理解如何有效地...
DWR的核心功能是提供一种安全、高效的方法,允许JavaScript与服务器上的Java对象直接交互,类似于AJAX(Asynchronous JavaScript and XML)技术,但DWR提供了更高级别的抽象,使得开发人员可以更方便地处理远程调用...
AJAX (Asynchronous JavaScript and XML) 和 DWR (Direct Web Remoting) 是两种在Web开发中广泛使用的技术,它们共同构成了一个强大的框架,用于构建高度交互性和动态的Web应用程序。AJAX允许在不刷新整个页面的情况...
总的来说,Ajax和DWR框架的结合使用,可以显著提升Web应用的用户体验,减少不必要的页面刷新,提高数据处理效率。同时,通过DWR与主流Java框架的集成,开发者可以更方便地在大型项目中引入Ajax技术,而不必重构大量...
**Ajax(Asynchronous JavaScript and XML)技术** Ajax是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使网页实现异步更新。Ajax的核心是JavaScript对象...
【标题】"my_employee_study.rar_Employee Stud_ajax_dwr_dwr ajax_上传 Java" 提供了一个关于员工学习的场景,特别关注的是AJAX、DWR技术以及Java在文件上传中的应用。这个压缩包包含了作者在公司近两个月内通过...
总的来说,"ajax_dwr包"是一个为开发者提供便利的工具,它简化了AJAX应用的开发过程,尤其是当涉及到与Java后端的交互时。通过深入理解和应用这个包,开发者可以构建出高效、交互性强的Web应用,提升用户的在线体验...
DWR简化了Ajax(Asynchronous JavaScript and XML)的实现,使得无需编写大量复杂的JavaScript代码,就可以实现页面的局部更新和动态交互。 标题中的"ajax的dwr包"指的是DWR框架用于实现Ajax功能的组件集合。DWR的...
而DWR(Direct Web Remoting)则是一种轻量级的框架,它简化了Ajax在Java后端的应用。本篇文章将深入探讨如何在MyEclipse环境下,结合Struts与Ajax的DWR框架,实现高效的前后端通信。 ### 1. Struts与Ajax的集成 *...
DWR(Direct Web Remoting)是Java后端与JavaScript前端之间进行实时通信的一种框架,它简化了Ajax应用的开发,让开发者可以像调用本地方法一样调用服务器端的方法。 **DWR的介绍** DWR允许JavaScript在客户端直接...
在SSH(Spring、Struts、Hibernate)框架下,Ajax与DWR的整合可以提高Web应用的交互性和响应速度。以下是整合步骤: 1. **添加依赖**:在项目中引入DWR相关的jar包,并配置web.xml,包括DWR的Servlet配置。 2. **...
DWR(Direct Web Remoting)是Ajax技术的一种框架,它简化了JavaScript和Java服务器端之间的通信,使得Web应用开发更为便捷。 **Ajax 基础知识** 1. **异步通信**:Ajax的核心特性是异步,它允许网页在用户与页面...
这个强大的工具使得开发者能够轻松地构建动态、富交互性的网页应用,而无需处理复杂的AJAX(Asynchronous JavaScript and XML)细节。在这个“dwr.rar”压缩包中,包含了一些关于DWR与Struts2框架整合使用的示例,...
无论是配置环境、创建Java接口,还是在前端编写Ajax调用,都能看到DWR简化了Web应用开发的复杂性,提升了开发效率。同时,结合ExtJS这样的前端框架,可以构建出功能强大且用户体验优秀的Web应用。通过实践,你可以...