Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 367|回复: 0

[AJAX学习]使用 AJAX 构建应用程序

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-12 23:49:01 | 显示全部楼层 |阅读模式
    作者:Naveen Balani, 技术架构师, Webify Solutions
             Rajeev Hathi, 高级系统分析员, Satyam 计算机有限公司
      
        [blockquote]
         异步 javaScript 和 XML(Asynchronous JavaScript with XML,AJAX)支持动态、异步的 Web 体验,却不需要页面刷新。在本教程中,将跟随一个示例图书订购应用程序的构建,学习构建基于 AJAX 的 Web 应用程序 ―― 拥有实时验证,却不用页面刷新。
        [/blockquote]
         
         
         
        开始之前
        关于本教程
        在本教程中,我解释了如何开发和设计基于异步 JavaScript 和 XML(或者叫做 AJAX)的 Web 应用程序。您将构建一个基于 Web 的、提供实时验证和页面刷新、为用户提供有效和平滑的用户交互的示例图书订购应用程序。  
       
      

    [blockquote]
      
    [/blockquote] 前提条件 我们将使用 Tomcat 来运行 AJAX 应用程序。Tomcat 是 Java Servlet 和 Java 服务器页面技术的参考实现使用的 servlet 容器。请从 Jakarta Site 下载 Download jakarta-tomcat-5.0.28.exe 并运行它把 Tomcat 安装到喜欢的位置 ―― 例如 c:        omcat5.0。 请下载本教程的源代码和 Web 应用程序(在 wa-ajax-Library.war 中)。 AJAX 介绍 AJAX 基础 AJAX 支持动态、异步的 Web 体验,不需要页面刷新。它集成了以下技术:  

    XHTML 和 CSS 提供了基于标准的表示。
    文档对象模型(DOM)提供了动态显示和交互。
    XML 和 XSLT 提供了数据交换和操纵。
    1. XMLHttpRequest
    复制代码
    提供了异步数据检索。
    JavaScript 把每一样东西绑定在一起。  
    AJAX 技术的核心是 JavaScript 对象:
    1. XMLHttpRequest
    复制代码
    。这个对象是通过浏览器实现提供的 ―― 先是通过 Internet Explorer 5.0 然后通过 Mozilla 兼容的浏览器。请进一步观察这个对象。  XMLHttpRequest 使用
    1. XMLHttpRequest
    复制代码
    ,可以用 JavaScript 发出到服务器的请求,并在不阻塞用户的情况下处理响应。在创建 Web 站点并用
    1. XMLHttpRequest
    复制代码
    在客户机浏览器上无刷新地执行屏幕更新的同时,它还提供了更多灵活性和丰富的用户体验。
    1. XMLHttpRequest
    复制代码
    应用程序的示例包括 Google 的 Gmail 服务、Google 的 Suggest 动态查询界面以及 MapQuest 的动态地图界面。在下一节,在演示图书订购应用程序的设计和实现时,详细介绍了如何使用
    1. XMLHttpRequest
    复制代码
    对象。 应用程序设计 应用程序的元素 基于 Web 的示例图书订购应用程序包含以下用 AJAX 实现的客户端函数:

    订购 ID 验证
    一个 View Authors 列表
    一个 View Publishers 列表  
    这里的目的是介绍 Web 页面中的实时验证页面刷新 如何让客户交互更平滑、更有效。 应用程序的结构 图 1 的图表说明了示例图书订购应用程序的设计架构:
    图 1. AJAX 架构

    应用程序是一个使用 Java 服务器页面(JSP)技术开发的单一 Web 页面。用户可以用 Web 浏览器(例如 Microsoft? Internet Explorer)调用 Web 页面并输入应用程序要实时验证的订购 ID。在 ID 异步验证的时候,用户可以输入更多信息。用户可以根据作者出版者 查看图书的书名。屏幕会根据用户的选择填充作者列表出版者列表。根据选择,书名列表 会被填充。所有这些列表都是实时填充的 ―― 换句话说,页面没有刷新,但是数据仍然来自后台层。我们把这种现象叫做实时刷新。 从 图 1 可以看出,
    1. XMLHttpRequest
    复制代码
    JavaScript 对象帮助进行实时异步处理。该对象采用 XML 格式通过 HTTP 对位于 Web 容器内的
    1. LibraryServlet
    复制代码
    发出请求。然后 servlet 查询数据库、提取数据并发送回客户机,还是采用 XML 格式通过 HTTP 进行传送。请求和响应都是在没有刷新页面的情况下实时发生的。 就是这一点使得 AJAX 如此强大。用户不需要等候页面重新载入才能完成,因为这里没有页面重载。 在 下一节 中,我将演示如何根据这个设计来实现图书订购应用程序。我要介绍代码并做一些分析。(要得到本教程的示例代码,请 下载文件 x-ajax-library.war。)
      实现应用程序 用 AJAX 实现应用程序 在这一节,我们研究示例图书订购应用程序的代码,并进一步查看每个基于 AJAX 的 Javascript 组件:

    验证订购 ID
    查看作者
    查看出版者
    查看书名  
    查看代码:验证订购 ID 先从验证订购 ID 的函数
    1. <input type="text" name="subscriptionID" onblur="validate(this.form)"/>
    复制代码
    开始。这个代码生成文本字段,用户可以在里面输入订购 ID。用户输入 ID 并移到表单的下一个字段时,触发
    1. onBlur
    复制代码
    事件。这个事件调用 JavaScript 函数
    1. validate()
    复制代码


      
       
      

    1. var req;
    2. function validate(formObj) {
    3.     init();
    4.     req.onreadystatechange = subscriptionValidator;
    5.     req.send("subscriptionID=" + formObj.subscriptionID.value);
    6. }
    复制代码
    [/code]
       
      

    1. validate()
    复制代码
    函数接受
    1. formObj
    复制代码
    作为参数。它首先调用
    1. init()
    复制代码
    函数:

      
       
      

    1. function init() {
    2.     if (window.XMLHttpRequest) {
    3.         req = new XMLHttpRequest();
    4.     } else if (window.ActiveXObject) {
    5.         req = new ActiveXObject("Microsoft.XMLHTTP");
    6.     }
    7.     var url = "/Library/LibraryServlet";
    8.     req.open("POST", url, true);
    9.     req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    10. }
    复制代码
    [/code]
       
      




      
       
       

       
      


    查看代码: init() 现在看
    1. init()
    复制代码
    函数的工作(我们把代码分成几部分):

      
       
      

    1. if (window.XMLHttpRequest) {
    2.     req = new XMLHttpRequest();
    3. } else if (window.ActiveXObject) {
    4.     req = new ActiveXObject("Microsoft.XMLHTTP");
    5. }
    复制代码
    [/code]
       
      

    1. init()
    复制代码
    函数首先创建
    1. XMLHttpRequest
    复制代码
    对象。这个请求对象是 AJAX 的核心。它以 XML 格式发送和接收请求。这段代码检查浏览器对
    1. XMLHttpRequest
    复制代码
    对象的支持(多数浏览器都支持它)。如果使用 Microsoft Internet Explorer 5.0 以上版本,那么就执行第二个条件。

      
       
      

    1. req.open("POST", url, true);
    2. req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    复制代码
    [/code]
       
      

    代码创建了
    1. XMLHttpRequest
    复制代码
    对象之后,需要设置某些请求属性。在前面的代码中,第一行设置请求方法、请求 URL 和请求的类型(是否异步)。它通过调用
    1. XMLHttpRequest
    复制代码
    对象上的
    1. open()
    复制代码
    方法做这件事。 这里我们要使用
    1. POST
    复制代码
    方法。理想情况下,当需要在服务器上修改状态时,请使用
    1. POST
    复制代码
    。我们的应用程序并不修改状态,但我们仍然倾向于使用
    1. POST
    复制代码
    1. url
    复制代码
    是要执行的 servlet 的 URL。
    1. true
    复制代码
    表明我们要异步地执行请求。 对于
    1. POST
    复制代码
    方法,我们需要设置
    1. Content-Type
    复制代码
    这个请求头。对于
    1. GET
    复制代码
    方法来说不需要这个设置。

      
       
      

    1. function validate(formObj) {
    2.     init();
    3.     req.onreadystatechange = subscriptionValidator;
    4.     req.send("subscriptionID=" + formObj.subscriptionID.value);
    5. }
    复制代码
    [/code]
       
      




      
       
       

       
      


    查看代码:回调句柄 1 继续查看验证方法,下面把
    1. subscriptionValidator
    复制代码
    回调句柄分配给
    1. onreadystatechange
    复制代码
    ,请求状态的每个变化都会触发它。 这个回调句柄 都负责什么呢?因为正在异步地处理请求,所以需要一个回调句俩,从服务器返回完整响应的时候调用它 ―― 回调句柄是对订购 ID 进行验证的地方(也就是编写实际的验证代码的地方)。 句柄充当侦听器。它一直等待响应完成。(稍后 将详细介绍句柄代码 。)为了发送请求,最后一行调用了
    1. send()
    复制代码
    方法。请求以名称=值 对的形式发送。对于
    1. GET
    复制代码
    方法,请求作为 URL 的一部分发送,所以
    1. send()
    复制代码
    方法被传递了一个空参数。 请求被发送到 servlet。servlet 处理请求并实时地发回响应。这就是 servlet 处理请求的方式。下一个代码段表示了
    1. LibraryServlet 的 doPost()
    复制代码
    方法。

      
       
      

    1. public void doPost(HttpServletRequest req, HttpServletResponse resp) throws
    2. ServletException, IOException {
    3.     String ID = null;
    4.     ID = req.getParameter("subscriptionID");
    5.     if (ID != null) {
    6.         String status = "<message>" + this.validID(ID) + "</message>";
    7.         this.writeResponse(resp, status);
    8.     }
    9. }
    复制代码
    [/code]
       
      




      
       
       

       
      


    查看代码:回调句柄 2
    1. doPost()
    复制代码
    方法从请求参数得到
    1. subscriptionID
    复制代码
    。为了验证 ID,它调用
    1. validID()
    复制代码
    方法。这个方法验证 ID,如果 ID 正确,则返回
    1. true
    复制代码
    ,否则返回
    1. false
    复制代码
    。它用 XML 格式构造返回状态,并调用
    1. writeResponse()
    复制代码
    方法来写响应。现在来看
    1. writeResponse()
    复制代码
    方法。

      
       
      

    1. public void writeResponse(HttpServletResponse resp, String output) throws IOException {
    2.     resp.setContentType("text/xml");
    3.     resp.setHeader("Cache-Control", "no-cache");
    4.     resp.getWriter().write(output);
    5. }
    复制代码
    [/code]
       
      

    响应用 XML 格式发送。第一行设置响应的内容类型为
    1. text/xml
    复制代码
    。第二行把头
    1. Cache-Control
    复制代码
    的值设为
    1. no-cache
    复制代码
    。这个值是必需的。AJAX 要求响应的输出不能被浏览器缓存。最后一行调用
    1. getWriter().write()
    复制代码
    方法来写响应。


      
       
       

       
      


    查看代码:回调句柄 3 请求由 servlet 处理,响应被发送回客户机。请记住,所有这些都在后台发生,没有页面刷新。现在 前面 讨论过的回调句柄方法会处理并解析响应:

      
       
      

    1. function subscriptionValidator() {
    2.     if (req.readystate == 4) {
    3.         if (req.status == 200) {
    4.             var messageObj = req.responseXML.getElementsByTagName("message")[0];
    5.             var message = messageObj.childNodes[0].nodeValue;
    6.             if (message == "true") {
    7.                 msg.innerHTML = "Subscription is valid";
    8.                 document.forms[0].order.disabled = false;
    9.             } else {
    10.                 msg.innerHTML = "Subscription not valid";
    11.                 document.forms[0].order.disabled = true;
    12.             }
    13.         }
    14.     }
    15. }
    复制代码
    [/code]
       
      




      
       
       

       
      


      
       
       

         
          
          
          

           回页首
          
          
         
       
      


    查看代码:回到 XMLHttpRequest 如前所述,
    1. XMLHttpRequest
    复制代码
    对象是构造和发送请求的核心对象。它也负责读取和解析从服务器返回的响应。请看下面几部分代码。

      
       
      

    1. if (req.readystate == 4) {
    2.     if (req.status == 200) {
    复制代码
    [/code]
       
      

    前面的代码检查请求的状态。如果请求处在就绪状态,就读取和解析响应。 就绪状态是什么意思呢?当请求对象的属性
    1. readystate
    复制代码
    的值是
    1. 4
    复制代码
    时,就意味着客户机接收到了响应而且接收完成。下面我们检查请求的状态(响应是正常页面还是错误页面)。为了保证响应正常,要检查状态的值是否为
    1. 200
    复制代码
    。如果
    1. status
    复制代码
    的值是
    1. 200
    复制代码
    ,就会处理响应。

      
       
      

    1. var messageObj = req.responseXML.getElementsByTagName("message")[0];
    2. var message = messageObj.childNodes[0].nodeValue;
    3. if (message == "true") {
    4.     msg.innerHTML = "Subscription is valid";
    5.     document.forms[0].order.disabled = false;
    6. } else {
    7.     msg.innerHTML = "Subscription not valid";
    8.     document.forms[0].order.disabled = true;
    9. }        }
    复制代码
    [/code]
       
      

    接下来,请求对象通过调用
    1. responseXML
    复制代码
    属性读取响应。请注意 servlet 用 XML 格式发送回响应,所以我们使用
    1. responseXML
    复制代码
    。如果响应是以文本格式发送的,那么可以使用
    1. responseText
    复制代码
    属性。  在这个示例中,我们处理 XML。servlet 把响应构建在一个
    1. <message>
    复制代码
    标记中。要解析这个 XML 标记,请在
    1. XMLHttpRequest
    复制代码
    对象的
    1. responseXML
    复制代码
    属性上调用
    1. getElementsByTagName()
    复制代码
    方法。它得到标记的名称以及标记的子值。根据解析到的值,格式化响应并用 HTML 改写。 现在就完成了对订购 ID 的验证,没有页面刷新。


      
       
       

       
      


    查看代码:查看作者、出版者和书名 其他的功能 ―― 查看作者查看出版者查看书名 ―― 工作的方式类似。只是需要为每个功能定义独立的句柄:

      
       
      

    1. function displayList(field) {
    2.     init();
    3.     titles.innerHTML = " ";
    4.     req.onreadystatechange = listHandler;
    5.     req.send("select=" + escape(field));
    6. }
    7. function displayTitles(formObj) {
    8.     init();
    9.     var index = formObj.list.selectedIndex;
    10.     var val = formObj.list.options[index].value;
    11.     req.onreadystatechange = titlesHandler;
    12.     req.send("list=" + val);
    13. }
    复制代码
    [/code]
       
      

    请记住,示例应用程序允许用户根据作者和出版者查看书名。所以显示的或者是作者列表 或者是出版者列表。在这类场景中,应用程序只能根据用户的选择调用一个回调句柄 ―― 换句话说,对于作者和出版者列表,只有一个
    1. listHandler
    复制代码
    回调句柄。 显示书名列表需要使用
    1. titlesHandler
    复制代码
    。其余的功能仍然一样:servlet 处理请求,用 XML 格式写回响应。然后读取、解析、格式化响应,用 HTML 改写。可以用 HTML 把列表呈现为
    1. select......options
    复制代码
    标记。这个示例代码段显示了
    1. titlesHandler
    复制代码
    方法。

      
       
      

    1. var temp = "<select name="titles" multiple>";
    2. for (var i=0; i<index; i++) {
    3.     var listObj = req.responseXML.getElementsByTagName("list")[i];
    4.     temp = temp + "<option value=" + i +">" + listObj.childNodes[0].nodeValue
    5. + "</option>";
    6. }
    7. temp = temp + "</select>";
    8. titles.innerHTML = temp;
    复制代码
    [/code]
       
      

    迄今为止,我们演示了如何实现实时验证和刷新。使用 AJAX,可以选择多种方式给 Web 站点的用户交互添加特色。下面运行应用程序。  运行和测试应用程序 运行应用程序 请下载示例代码 wa-ajax-Library.war 并把它拷贝到 Tomcat 的 Webapp 目录(例如,c:Tomcat 5.0Webapps)。要启动 Tomcat 服务器,请输入以下命令:

      
       
      

    1. cd bin
    2. C:Tomcat 5.0in> catalina.bat start
    复制代码
    [/code]
       
      

    Tomcat 现在启动了,AJAX Web 应用程序也部署在其中。 测试应用程序 要测试应用程序:

    请打开 Web 浏览器,指向
    1. http://localhost:tomcatport/Library/order.jsp
    复制代码
    ,其中变量 tompcatport 是 Tomcat 服务器运行所在的端口。 将看到订购屏幕。
    Enter Subscription ID 字段中,输入用户 ID(“John” 除外)并离开字段。 向服务器异步发出的订购 ID 请求会被验证。可以看到 “Subscription not valid” 消息,如 图 2 所示:
    图 2. “Subcription not valid” 屏幕

    应用程序在不刷新浏览器的情况下,异步地验证用户并提供运行时验证。
    输入用户 ID 值 John。 将看到消息 “Subscription is valid”。订购有效之后,应用程序就激活 Order 按钮。
    请选择 By AuthorBy Publisher 按钮分别填充作者或出版者下拉列表。
    从下拉列表选择一个作者或出版者。 书名区域被动态填充(如 图 3 所示)。
    图 3. “Subcription is valid”屏幕

    在选择作者或出版者时,应用程序请求服务器在运行时提供来自服务器的与选中作者或出版者对应的书名信息。在不刷新浏览器的情况下显示书名信息。  
    现在成功安装和测试了示例 AJAX 应用程序。 结束语 结束语 AJAX 从开始至今已经走了很长的路。我们相信 AJAX 不仅仅可以用作设计模式,不过 AJAX 仍然有一些问题:

    浏览器对
    1. XMLHttpRequest
    复制代码
    对象的支持可能是个限制。大多数浏览器都支持
    1. XMLHttpRequest
    复制代码
    对象,但是有少数不支持(通常是较老版本的浏览器)。
    AJAX 最适合显示少量数据。如果要处理大量数据并在列表中实时显示,那么 AJAX 可能不是合适的解决方案。
    AJAX 非常依赖于 JavaScript。如果浏览器不支持 JavaScript 或者用户禁止了脚本选项,那么根本就不能利用 AJAX。
    AJAX 异步的性质不会保证多个请求的同步请求处理。如果需要对验证或刷新进行优先处理,那么要相应地设计应用程序。  
    即使有这些可能的问题,AJAX 仍然是提高 Web 页面和解决页面重载问题的最佳解决方案。 Naveen Balani, 技术架构师, Webify Solutions
    Rajeev Hathi, 高级系统分析员, Satyam 计算机有限公司

      
      
       
       

         
       

         
       
      




    源码下载:http://www.hnzz3z.com:8103/zz3zcwb/cwb/dir2/wa-ajax-Library.war
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-22 18:17 , Processed in 0.445232 second(s), 54 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表