在Ajax 应用程序中实现数据之间交换

作者:凯旋网络来源:凯旋网络
行时对其进行修改。在这种情况下,首选 XML 格式,这是因为在文档中进行对象模型编码通常要比使用很多字符串参数更简单。此外,保存数据的请求并不频繁,服务器可以毫无问题地处理负载。可将 XML 文档编码为参数,这样您就可以使用 EL 语法 (${param.xml}) 在 JSP 页面中访问该文档了。以下就是发送在 XML 文档中编码的模型数据的函数:

function sendSaveRequest(xml) {
var params = [ { name:"xml", value:xml } ];
var saveRequest = sendHttpRequest("POST", ctrlURL, params);
if (saveRequest)
delete saveRequest;
}


  如果需要恢复对象模型,则也可同步发送请求,从服务器检索数据。在这种情况下,服务器应当返回一个 JSON 响应,以便您可利用 eval(loadRequest.responseText) 轻松将其转换为 JavaScript 对象树:

function sendLoadRequest() {
var model = null;
var loadRequest = sendHttpRequest("GET", ctrlURL);
if (loadRequest) {
model = eval(loadRequest.responseText);
delete loadRequest;
    }
return model;
}


  以下两部分介绍了通常在服务器上对 XML 文档执行的操作,以及如何响应 Ajax 请求。

在服务器端处理请求

  Servlet/JSP 容器分析各个 HTTP 请求并创建一个 ServletRequest 实例,该实例使您可以通过 getParameter() / getParameterValues() 获得请求参数,或通过 getInputStream() 获得请求正文。在 JSP 页面中,也可以使用 EL 语法(${param...} 和 ${paramValues...})获得这些参数。请注意,只有在 Ajax 客户端使用了类似于 buildQueryString() 之类的实用函数,通过 application/x-www-form-urlencoded 格式来编码数据(本文前一部分有述)的情况下,才可通过 getParameter() 或 ${param...} 获得请求参数。如果在客户端上将 XML 文档或 DOM 树传递至 XMLHttpRequest 的 send() 方法,则必须在服务器端使用 ServletRequest 的 getInputStream() 方法。

  数据验证。典型的 Web 应用程序会进行许多数据验证操作。多数可能的错误相当简单,例如缺少请求参数、数字格式错误等等。这些错误通常是由于用户忘记输入表单元素的值或提供了无效值引起的。Web 框架(如 JSF 和 Oracle ADF Faces)非常善于处理这些用户错误。在 Ajax 应用程序中,这些错误可以在客户端使用 JavaScript 来捕获和处理。例如,您可使用 isNaN(new Number(value)) 验证数字值是否无效。

  出于安全和可靠性的考虑,应当在服务器端对数据进行重新验证,而不应想当然地认为 XML 请求格式设置正确。XML 模式是在服务器端验证复杂请求的有用工具。示例代码下载中包含了一个名为 XMLUtil 的类,它提供用于加载和使用模式文档的方法。以下代码段显示了如何初始化 SchemaFactory:

import javax.xml.*;
import javax.xml.validation.*;
...
protected static SchemaFactory schemaFactory;
static {
schemaFactory = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory.setErrorHandler(newErrorHandler());
}

The newErrorHandler() method returns a SAX error handler:

import org.xml.sax.*;
...
public static ErrorHandler newErrorHandler() {
return new ErrorHandler() {
public void warning(SAXParseException e)
throws SAXException {
Logger.global.warning(e.getMessage());
        }

public void error(SAXParseException e)
throws SAXException {
throw e;
        }

public void fatalError(SAXParseException e)
throws SAXException {
throw e;
        }
    };
}
 


 

  • 广告推荐