Ajax简介

Ajax

时间 2005-11-01
作者:David Teare
浏览次数:
本文关键字:ajaxdhtmldwrjavascript

文章工具
 推荐朋友
 打印文章

  作J2EE开发,我似乎后端机制(backend mechanics。我通常会忘J2EE的主要成功之Web用程序方面;多原因使得人利用Web开发应用程序,但主要是因其易于部署的特点允站点以尽可能低的成本有上百万的用憾的是,在去几年中,我在后端投入了太多的时间,而在使我Web界面自然和响灵敏方面却投入不足。

  本文介方法,Ajax,使用它可以构建更为动态和响更灵敏的Web用程序。方法的关键在于对浏览器端的JavaScriptDHTML和与服器异通信的合。本文也演示了启用这种方法是多么简单:利用一个Ajax框架(指DWR)构造一个用程序,它直接从浏览器与后端服务进行通信。如果使用得当,这种强大的力量可以使用程序更加自然和响灵敏,从而提升用浏览

  该应用程序中所使用的示例代已打包为单独的WAR文件,可供下

  术语Ajax用来描述一,它使浏览器可以提供更自然的浏览。在Ajax之前,Web站点制用户进入提交/等待/重新示范例,用是与服器的思考时间Ajax提供与服器异通信的能力,从而使用/的循中解脱出来。借助于Ajax,可以在用户单击钮时,使用JavaScriptDHTML立即更新UI,并向服出异步请求,以行更新或查询数据。当求返回,就可以使用JavaScriptCSS来相地更新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包含:

  • 基于XHTMLCSS准的表示;
  • 使用Document Object Model动态显示和交互;
  • 使用XMLHttpRequest与服行异通信;
  • 使用JavaScript定一切。

  非常好,但要以Ajax命名呢?其实术语Ajax是由Jesse James Garrett造的,他它是“Asynchronous JavaScript + XML

Ajax的工作原理

  Ajax的核心是JavaScriptXmlHttpRequest该对象在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的消息来刷新整个面。即使使用的是高速Internet26K1/2K的差也非常大。同重要的是,只需要刷新与投票相的一小,而不是刷新整个屏幕。

  利用Ajax实现自己的基本投票系

原始的Ajax:直接使用XmlHttpRequest

  如上所述,Ajax的核心是JavaScriptXmlHttpRequest。下面的示例文章价系您熟悉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) {

      $('votes').innerHTML = req.responseText;

    } else {

      alert("There was a problem retrieving the XML data:/n" +

      req.statusText);

    }

  }

}

  相当简洁,并且使用了几个幻数,使得以一下子看出生了什了弄清楚一点,下面的表格(引用自http://developer.apple.com/internet/webcontent/xmlhttpreq.html)列了常用的XmlHttpRequest象属性。

属性

描述

onreadystatechange

次状所触事件的事件理程序

readyState

象状态值

  • 0 = 未初始化(uninitialized
  • 1 = 正在加loading
  • 2 = loaded
  • 3 = 交互(interactive
  • 4 = 完成(complete

responseText

从服程返回的数据的字符串形式

responseXML

从服程返回的DOM兼容的文档数据

status

从服器返回的数字代,比如404(未找到)或200(就

statusText

伴随状态码的字符串信息

  processVoteResponse()函数示出其意了。它首先检查XmlHttpRequest的整体状以保它已完成(readyStatus == 4),然后根据服器的询问请求状。如果一切正常(status == 200,就使用innerHTML属性重写DOM“votes”点的内容。

  既然您眼看到了XmlHttpRequest象是如何工作的,就利用一个旨在JavaScriptJava用程序之的异通信的框架来具体的细节进行抽象。

Ajax: DWR方式

  按照与文章价系相同的流程,我将使用Direct Web RemotingDWR)框架实现的功能。

  假定文章和投票果存在一个数据中,使用某种对/系映射技来完成抽取工作。了部署起来尽可能地简单,我不会使用数据库进行持久性存。此外,使用程序尽可能通用,也不使用Web框架。相反,用程序将从一个静HTML文件始,可以认为它由服动态地呈。除了化措施,用程序还应该使用Spring Framework关联一切,以便松看出如何在一个用程序中使用DWR

  应该示例用程序并熟悉它。该应用程序被压缩为标准的WAR文件,因此您可以把它放置到任何一个Web容器中——无需行配置。部署完之后,就可以航到http://localhost:7001/ajax_demo/dwr-ajax.html来运行程序。

  可以HTML 源代,了解它如何工作。人印象最深的是,代如此简单——所有与服器的交互都藏在JavaScriptajaxSampleSvc的后面。更加令人惊的是,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设计模式。使用DWRJavaScript一些服并不影响您的设计

  下面是一个简单Java,我将使用DWR框架直接将其向JavaScript

package com.tearesolutions.service;

 

public interface AjaxSampleSvc {

  Article castVote(int rank);

}

  是一个被化到几乎不可能的程度的例子,其中只有一篇文章可以投票。Spring管理,它使用的bean名是ajaxSampleSvc,它的持久性需求ArticleDaoapplicationContext.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 ajaxSampleSvcDWR将自找到由用程序置的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);

}

  在可以使用JavaScriptajaxSampleSvc所有的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 + "

";

 $('votes').innerHTML = voteText;      

}

  惊人地简单,不是?由ajaxSampleSvc象返回的Article象序列化一个JavaScript象,允在它上面numberOfVotes()voteAverage()的方法。在动态生成并插入到DIV元素“votes”中的HTML内使用些数据。

下一工作

   在后文章中,我将继续Ajax话题及下面些方面:

  • Ajax最佳

  像多技Ajax是一把双刃于一些用例,其用程序其没有必要使用Ajax,使用了反而有可用性。我将介一些不适合使用的模式,突出Ajax的一些消极方面,并展示一些有助于些消极方面的机制。例如,Netflix浏览Ajax是合适的解决方案?或者,如何提示用出了一些问题,而再次单击也无于事?

  • 管理跨求的状

  在使用Ajax,最初的文档DOM生一些化,并且有大量的面状信息存在客量中。当用跟踪一个接到用程序中的另一个,状失了。当用按照单击Back钮时,呈现给的是存中的初始面。会使用感到非常迷惑!

  • 调试技巧

  使用JavaScript在客行更多的工作,如果事情不按期方式行,就需要一些调试工具来帮助弄清出了什么问题

  本文介Ajax方法,并展示了如何使用它来建一个动态且响灵敏的Web用程序。通使用DWR框架,可以松地把Ajax融合到站点中,而无需担心所有必须执行的实际管道工作。

  特Getahead IT公司的Joe Walker和他的团队开发DWR这样神奇的工具。感与世界共享它!

  本文中演示的用程序源代可供下ajax-demo.war1.52 MB)。

参考

原文出

An Introduction To Ajax

http://dev2dev.bea.com/pub/a/2005/08/ajax_introduction.html

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值