public void literal(Object value) {
if (value instanceof String) {
buf.append(\");
string((String) value);
buf.append(\");
} else if (value instanceof Character) {
buf.append(\\);
character(((Character) value).charValue());
buf.append(\\);
} else
buf.append(value.toString());
}
comma() 方法附加一个逗号字符:
private void comma() {
buf.append(,);
}
deleteLastComma() 方法将移除缓冲区末尾最后一个逗号字符(如果有的话):
private void deleteLastComma() {
if (buf.length() > 0)
if (buf.charAt(buf.length()-1) == ,)
buf.deleteCharAt(buf.length()-1);
}
startObject() 方法附加一个 { 字符,用于表示一个 JavaScript 对象的开始:
public void startObject() {
buf.append({);
}
property() 方法编码 JavaScript 属性:
public void property(String name, Object value) {
buf.append(name);
buf.append(:);
literal(value);
comma();
}
endObject() 方法附加一个 } 字符,用于表示一个 JavaScript 对象的结束:
public void endObject() {
deleteLastComma();
buf.append(});
comma();
}
startArray() 方法附加一个 [ 字符,用于表示一个 JavaScript 数组的开始:
public void startArray() {
buf.append([);
}
element() 方法编码 JavaScript 数组的元素:
public void element(Object value) {
literal(value);
comma();
}
endArray() 方法附加一个 ] 字符,用于表示一个 JavaScript 数组的结束:
public void endArray() {
deleteLastComma();
buf.append(]);
comma();
}
toString() 方法返回 JSON 字符串:
public String toString() {
deleteLastComma();
return buf.toString();
}
clear() 方法清空缓冲区:
public void clear() {
buf.setLength(0);
}
DataModel 使用 JSONEncoder 类来编码其维护的数据:
public synchronized String getData() {
JSONEncoder json = new JSONEncoder();
json.startArray();
for (int i = 0; i < stockList.size(); i++) {
StockBean stock = stockList.get(i);
json.startObject();
json.property("symbol", stock.getSymbol());
json.property("shares", stock.getShares());
json.property("paidPrice", stock.getPaidPrice());
json.endObject();
}
json.endArray();
return json.toString();
}
如果提供了 xml 请求参数,则 ajaxCtrl.jsp 页面将设置模型的数据。否则,该页面会使用 ${dataModel.data} EL 表达式输出 getData() 返回的 JSON 字符串:
< %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
< jsp:useBean id="dataModel" scope="session"
class="ajaxapp.model.DataModel" />
< c:choose>
...
< c:when test="${!empty param.xml}">
< c:set target="${dataModel}"
property="data"
value="${param.xml}" />
< /c:when>
< c:otherwise>
${dataModel.data}
< /c:otherwise>
< /c:choose>
这个作业并未完成,因为 Ajax 客户端必须处理 JSON 数据。
在客户端处理响应
在典型的 Web 应用程序中,您使用 JSP、Web 框架和标记库在服务器端生成内容。Ajax 应用程序非常适合这种情况,因为 Web 框架(如 JavaServer Faces 和 Oracle ADF Faces)在构建 Ajax 应用程序时非常有用。然而,Ajax 和非 Ajax 应用程序之间仍然存在着明显不同。使用 Ajax 时,您必须在客户端处理数据,并用 JavaScript 动态生成内容来向用户提供数据。
如果使用 JSON 格式进行数据转换,则使用 JavaScript 提供的 eval() 函数将文本转换
