首先,使用JavaScript的eval()函数实现,将JSON数据串转换成为一个JavaScript对象数组。这里,在Servlet中访问数据库取得记录,并合成JSON串,发送到客户端。
一般,对于企业级应用,使用JavaScript的eval()函数,存在安全隐患问题。这个例子就是感受一下JSON数据串从服务器段被传送到客户端之后,将数据转换成为对象数组或者对象,从而方便地使用JavaScript来实现遍历。
看一下我的Permission实体的Hibernate映射文件:
现在,就是在Servlet中读取对应的记录,然后构造JSON数据,实现的Servlet为GetPermissions,如下所示:
package org.shirdrn.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.xgb.bo.ManagerService;
import model.xgb.bo.impl.ManagerServiceImpl;
import model.xgb.vo.Permission;
import cn.edu.cust.levin.BusinessException;
import cn.edu.cust.levin.business.BusinessFactory;
public class GetPermissions extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;
public GetPermissions() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/json;charset=UTF-8");
String semester = java.net.URLDecoder.decode(request.getParameter("semester"),"UTF-8");
int orgId = Integer.parseInt(request.getParameter("orgId"));
PrintWriter out = response.getWriter();
try {
ManagerService managerService = (ManagerService)BusinessFactory
.getBusiness(ManagerServiceImpl.class);
List permissionList = managerService.getPermissionByOrg(orgId, semester);
String jsonString = "[";
for(int i=0;i
Permission permission = (Permission)permissionList.get(i);
jsonString += "{";
jsonString += "\"id\":" + permission.getId() +",";
jsonString += "\"semester\":\"" + permission.getTerm() +"\",";
jsonString += "\"startTime\":\"" + permission.getStart().toLocaleString() +"\",";
jsonString += "\"endTime\":\"" + permission.getEndDate().toLocaleString() +"\",";
jsonString += "\"orgId\":" + permission.getOrg().getId() +",";
jsonString += "\"operatorId\":" + permission.getOperator().getId() +",";
jsonString += "\"operatorName\":\"" + permission.getOperator().getName() +"\",";
jsonString += "\"roleId\":" + permission.getRoles().getId();
if(i != permissionList.size()-1) {
jsonString += "},";
}
else {
jsonString += "}]";
}
}
out.print(jsonString);
out.flush();
out.close();
} catch (BusinessException e) {
e.printStackTrace();
}
}
}
用于显示记录的JSP页面如下所示:
pageEncoding="utf-8"%>
Get Permissions我通过使用onLoad事件,加载页面的时候,调用pageLoad()函数,该函数在js/shirdrnPermission.js中实现了,其中js/shirdrnPermission.js的实现如下所示:
var xmlHttp = null;
function pageLoad() {
document.body.style.color = "yellow";
showPermissions();
}
function createXMLHttp() {
if (typeof XMLHttpRequest != "undefined") {
return new XMLHttpRequest();
} else {
if (window.ActiveXObject) {
var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
for (var i = 0; i < aVersions.length; i++) {
try {
return new ActiveXObject(aVersions[i]);
}
catch (e) {
alert("error");
}
}
}
}
}
var permissionArray;
var html = null;
function showPermissions() {
html = "
+ "
"+ "
权限ID"+ "
学期"+ "
起始时间"+ "
截止时间"+ "
组织ID"+ "
操作ID"+ "
操作名称"+ "
角色ID"+ "
";if(xmlHttp == null) {
xmlHttp = createXMLHttp();
}
var url = "&semester=" + "2008-2009学年第一学期"
+ "&orgId=" + 1;
xmlHttp.open("GET","getPermissions.servlet?" + encodeURI(encodeURI(url)),true); // GetPermissions在web.xml中配置为/getPermissions.servlet
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
permissionArray = eval("(" + xmlHttp.responseText + ")"); // 将从服务器请求得到的JSON串转换为JavaScript的数组(这里是对象数组) for(var i=0;i
html += "
";html += "
" + permissionArray[i].id +"";html += "
" + permissionArray[i].semester +"";html += "
" + permissionArray[i].startTime +"";html += "
" + permissionArray[i].endTime +"";html += "
" + permissionArray[i].orgId +"";html += "
" + permissionArray[i].operatorId +"";html += "
" + permissionArray[i].operatorName +"";html += "
" + permissionArray[i].roleId +"";html += "
";}
html += "
";var listContainer = document.getElementById("list");
listContainer.innerHTML = html;
}
}
xmlHttp.send(null);
}
使用JSON进行数据传送,比之于XML自然有很大的优势,至少JSON更加精简,将无关紧要的数据尽量压缩,所以速度比XML要快。
另外,JSON上面的这种使用方式就是使用JavaScript中的eval()函数来实现数据到类型的转换,使用JavaScript的数组或者对象就能遍历数据,而XML还要在JavaScript中使用XML DOM操作。