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

作者:凯旋网络来源:凯旋网络
on e){
Logger.global.logp(Level.SEVERE, "DataModel", "setData",
e.getMessage(), e);
    }
}


  一旦服务器端的数据模型中具备了数据,就可根据应用程序的要求对其进行处理了。然后,您必须响应 Ajax 请求。

  在服务器端生成响应

  将 HTML 作为 Ajax 请求的响应而返回是一种最简单的解决方案,这是因为您可以使用 JSP 语法构建标记,而 Ajax 客户端只需使用 < div> 或 < span> 元素的 innerHTML 属性在页面某处插入 HTML。但是,向 Ajax 客户端返回不带任何表示标记的数据则更为有效。您可以使用 XML 格式或 JSON。


  生成 XML 响应。Java EE 提供了很多创建 XML 文档的选项:可通过 JSP 生成、通过 JAXB 从对象树创建、或利用 javax.xml.transform 生成。以下示例中的转换程序将串行化一个 DOM 树:

import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
...
public static TransformerFactory serializerFctory;
static {
serializerFctory = TransformerFactory.newInstance();
}
   
public static void serialize(Node node, OutputStream out)
throws TransformerException {
Transformer serializer = serializerFctory.newTransformer();
Properties serializerProps = new Properties();
serializerProps.put(OutputKeys.METHOD, "xml");
serializer.setOutputProperties(serializerProps);
Source source = new DOMSource(node);
Result result = new StreamResult(out);
serializer.transform(source, result);
}


  有这么多可在服务器端生成 XML 的标准选项和开发源框架,您唯一所要做的就是选择一个适合你的选项。但是,在客户端上,由于只能使用 DOM 来分析 XML,因此情况非常不同。某些浏览器还支持 XPath 和 XSLT。

在先前的 Ajax 文章中,您学习了如何通过 JSP 生成 XML,然后在客户端上利用 JavaScript 和 DOM 对其进行分析。另一个解决方案是使用 JSON 而非 XML 作为响应 Ajax 请求的数据格式。如前所述,JSON 字符串可通过 eval() 函数转化为 JavaScript 对象树。较之利用 JavaScript 从 DOM 树提取信息而言,这更为简单些。您所需的就是一个在服务器端生成 JSON 的良好实用类。

  JSON 编码。JSONEncoder 类提供了编码文字、对象和数组的方法。结果存储在 java.lang.StringBuilder 中:

package ajaxapp.util;

public class JSONEncoder {
private StringBuilder buf;
   
public JSONEncoder() {
buf = new StringBuilder();
    }

    ...
}
 


  character() 方法编码单一字符:

public void character(char ch) {
switch (ch) {
case \\:
case \\":
case \\\:
buf.append(\\\);
buf.append(ch);
break;
case \ :
buf.append(\\\);
buf.append( );
break;
case \
:
buf.append(\\\);
buf.append(
);
break;
case \
:
buf.append(\\\);
buf.append(
);
break;
default:
if (ch >= 32 && ch <  128)
buf.append(ch);
else{
buf.append(\\\);
buf.append(u);
for (int j = 12; j >= 0; j-=4) {
int k = (((int) ch) >> j) & 0x0f;
int c = k <  10 ? + k :a + k - 10;
buf.append((char) c);
                }
            }
    }
}


  string() 方法编码整个字符串:

public void string(String str) {
int length = str.length();
for (int i = 0; i <  length; i++)
character(str.charAt(i));
}

 literal(

  • 广告推荐