精彩专题推荐:建站之入门课 建站之必修课 建站之关键课 网站价值所在 流量提高专题 css+div 标准 个人网站打造全过程
返回建站学首页
导航:
建站首页 | 网站设计 | 网站开发 | 网站运营 | 网页软件 | 建站指南 | 搜索优化 | 图像处理 | 视频教程 | 书籍教程 | 建站专题
当前位置:首页>网站开发>ajax教程>正文

面向Java程序员的Ajax:构建动态Java程序


来源: 时间:06-11-28 点击: 点击这里收藏本文


  清单 6. getReadyStateHandler() 函数

/*
* Returns a function that waits for the specified XMLHttpRequest
* to complete, then passes its XML response to the given handler function.
* req - The XMLHttpRequest whose state is changing
* responseXmlHandler - Function to pass the XML response to
*/
function getReadyStateHandler(req, responseXmlHandler) {

 // Return an anonymous function that listens to the
 // XMLHttpRequest instance
 return function () {

  // If the request's status is "complete"
  if (req.readyState == 4) {

   // Check that a successful server response was received
   if (req.status == 200) {

    // Pass the XML payload of the response to the
    // handler function
    responseXmlHandler(req.responseXML);
   } else {
    // An HTTP problem has occurred
    alert("HTTP error: "+req.status);
   }
  }
 }
}

  HTTP 状态码

  在清单 6 中,检查 XMLHttpRequest 的 status 属性以查看请求是否成功完成。status 包含服务器响应的 HTTP 状态码。在执行简单的 GET 和 POST 请求时,可以假设任何大于 200 (OK)的码都是错误。如果服务器发送重定向响应(例如 301 或 302),浏览器会透明地进行重定向并从新的位置获取资源;XMLHttpRequest 看不到重定向状态码。而且,浏览器会自动添加 Cache-Control: no-cache 头到所有 XMLHttpRequest,这样客户代码永远也不用处理 304(未经修改)服务器响应。

  关于 getReadyStateHandler()

  getReadyStateHandler() 是段相对复杂的代码,特别是如果您不习惯阅读 JavaScript 的话。但是通过把这个函数放在 JavaScript 库中,就可以处理 Ajax 服务器响应,而不必处理 XMLHttpRequest 的内部细节。重要的是要理解如何在自己的代码中使用 getReadyStateHandler()。

  在 清单 3 中看到了 getReadyStateHandler() 像这样被调用:handlerFunction = getReadyStateHandler(req, updateCart)。在这个示例中,getReadyStateHandler() 返回的函数将检查在 req 变量中的 XMLHttpRequest 是否已经完成,然后用响应的 XML 调用名为 updateCart 的函数。

  提取购物车数据

  清单 7 是 updateCart() 本身的代码。函数用 DOM 调用检查购物车的 XML 文档,然后更新 Web 页面(请参阅 清单 1),反映新的购物车内容。这里的重点是用来从 XML DOM 提取数据的调用。cart 元素的 generated 属性是在 Cart 序列化为 XML 时生成的一个时间戳,检查它可以保证新的购物车数据不会被旧的数据覆盖。Ajax 请求天生是异步的,所以这个检查可以处理服务器响应未按次序到达的情况。

  清单 7. 更新页面,反映购物车的 XML 文档

function updateCart(cartXML) {

 // Get the root "cart" element from the document
 var cart = cartXML.getElementsByTagName("cart")[0];

 // Check that a more recent cart document hasn't been processed
 // already
 var generated = cart.getAttribute("generated");
 if (generated > lastCartUpdate) {
  lastCartUpdate = generated;

  // Clear the HTML list used to display the cart contents
  var contents = document.getElementById("cart-contents");
  contents.innerHTML = "";

  // Loop over the items in the cart
  var items = cart.getElementsByTagName("item");
  for (var I = 0 ; I < items.length ; I++) {
   var item = items[I];

   // Extract the text nodes from the name and quantity elements
   var name = item.getElementsByTagName("name")[0].firstChild.nodeValue;
9 7 3 1 2 3 4 5 6 4 8 :

  把此文章收藏到:          
广而告之
文章搜索
  • Google JZxue.Com

Copyright © 2005 - 2006 建站学 All rights reserved.