AJax技术

ydb7459022的专栏(2)

字号+ 作者:H5之家 来源:H5之家 2017-01-27 09:12 我要评论( )

该函数为您想要与之通信的服务器资源创建一个URL并调用内部函数executeXhr,提供一个回调JavaScript函数,一旦服务器响应可用,该函数就被执行。由于我希望它运行在一个简单的Apache环境中,“castvote URL”只是一

  该函数为您想要与之通信的服务器资源创建一个URL并调用内部函数executeXhr,提供一个回调JavaScript函数,一旦服务器响应可用,该函数就被执行。由于我希望它运行在一个简单的Apache环境中,“castvote 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 problemretrieving the XML data:

" +

      req.statusText);

    }

  }

}

  该代码相当简洁,并且使用了几个幻数,这使得难以一下子看出发生了什么。为了弄清楚这一点,下面的表格(引用自)列举了常用的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对象是如何工作的,就让我们利用一个旨在简化JavaScript与Java应用程序之间的异步通信的框架来对具体的细节进行抽象。

 

Ajax: DWR方式

 

 按照与文章评价系统相同的流程,我们将使用Direct Web Remoting(DWR)框架实现同样的功能。

 

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

 

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

 

  可以查看HTML 源代码,了解它如何工作。给人印象最深的是,代码如此简单——所有与服务器的交互都隐藏在JavaScript对象ajaxSampleSvc的后面。更加令人惊讶的是,ajaxSampleSvc服务不是由手工编写而是完全自动生成的!让我们继续,看看这是如何做到的。

 

引入DWR

 

  如同在“原始的Ajax”一节所演示的那样,直接使用XmlHttpRequest创建异步请求非常麻烦。不仅JavaScript代码冗长,而且必须考虑服务器端为定位Ajax请求到适当的服务所需做的工作,并将结果封送到浏览器。

 

  设计DWR的目的是要处理将Web页面安装到后端服务上所需的所有信息管道。它是一个Java框架,可以很轻松地将它插入到Web应用程序中,以便JavaScript代码可以调用服务器上的服务。它甚至直接与SpringFramework集成,从而允许用户直接向Web客户机公开bean。

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 专栏:Ajax学习

    专栏:Ajax学习

    2016-12-22 11:03

  • furway的专栏

    furway的专栏

    2016-07-15 16:01

  • xmphoenix的专栏

    xmphoenix的专栏

    2016-06-19 14:03

  • ruxing.li 的专栏

    ruxing.li 的专栏

    2016-04-11 17:06

网友点评