JSON學習筆記之一
首先,使用JavaScript的eval()函數實現,將JSON數據串轉換成為一個JavaScript對象數組。這里,在Servlet中訪問數據庫取得記錄,并合成JSON串,發送到客戶端。
一般,對于企業級應用,使用JavaScript的eval()函數,存在安全隱患問題。這個例子就是感受一下JSON數據串從服務器段被傳送到客戶端之后,將數據轉換成為對象數組或者對象,從而方便地使用JavaScript來實現遍歷。
看一下我的Permission實體的Hibernate映射文件:
<?xml version="1.0" encoding="UTF-8"?> <hibernate-mapping> 現在,就是在Servlet中讀取對應的記錄,然后構造JSON數據,實現的Servlet為GetPermissions,如下所示: package org.shirdrn.servlet; import java.io.IOException; import javax.servlet.ServletException; import model.xgb.bo.ManagerService; /** author http://www.bt285.cn http://www.5a520.cn public class GetPermissions extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { public GetPermissions() { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 用于顯示記錄的JSP頁面如下所示: <%@ page language="java" import="java.util.*,model.xgb.vo.*" contentType="text/html; charset=utf-8" 我通過使用onLoad事件,加載頁面的時候,調用pageLoad()函數,該函數在js/shirdrnPermission.js中實現了,其中js/shirdrnPermission.js的實現如下所示: var xmlHttp = null; function pageLoad() { function createXMLHttp() { var permissionArray; function showPermissions() { 啟動WEB服務器,訪問鏈接http://www.5a520.cn :8080/xgb/listPermissions.jsp可以看到頁面顯示的結果,如下所示: 使用JSON進行數據傳送,比之于XML自然有很大的優勢,至少JSON更加精簡,將無關緊要的數據盡量壓縮,所以速度比XML要快。 另外,JSON上面的這種使用方式就是使用JavaScript中的eval()函數來實現數據到類型的轉換,使用JavaScript的數組或者對象就能遍歷數據,而XML還要在JavaScript中使用XML DOM操作。
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "
<class name="model.xgb.vo.Permission" table="PERMISSION" lazy="false">
<composite-id>
<key-property name="id" column="ID" type="integer"/>
<key-property name="term" column="TERM" type="string"/>
</composite-id>
<property name="endDate" column="ENDDATE" type="date"/>
<property name="start" column="START" type="date"/>
<many-to-one name="roles" class="model.xgb.vo.Role" lazy="false" unique="true" cascade="save-update">
<column name="ROLE_ID"/>
</many-to-one>
<many-to-one name="org" class="model.xgb.vo.Org" lazy="false" unique="true" cascade="save-update">
<column name="ORG_ID"/>
</many-to-one>
<many-to-one name="operator" class="model.xgb.vo.Operator" lazy="false" unique="true" cascade="save-update">
<column name="OPERATOR_ID"/>
<column name="OPERATOR_NAME"/>
<column name="OPERATOR_TYPE"/>
</many-to-one>
</class>
</hibernate-mapping>
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.xgb.bo.impl.ManagerServiceImpl;
import model.xgb.vo.Permission;
import cn.edu.cust.levin.BusinessException;
import cn.edu.cust.levin.business.BusinessFactory;
*/
static final long serialVersionUID = 1L;
super();
}
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<permissionList.size();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();
}
}
}
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Get Permissions</title>
<script type="text/javascript" src="js/shirdrnPermission.js"></script>
</head>
<body onLoad="pageLoad();">
<div id="list"></div>
</body>
</html>
document.body.style.color = "yellow";
showPermissions();
}
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 html = null;
html = "<table bgcolor='green' border='1' width='100%'>"
+ "<tr>"
+ "<th>權限ID</th>"
+ "<th>學期</th>"
+ "<th>起始時間</th>"
+ "<th>截止時間</th>"
+ "<th>組織ID</th>"
+ "<th>操作ID</th>"
+ "<th>操作名稱</th>"
+ "<th>角色ID</th>"
+ "</tr>";
if(xmlHttp == null) {
xmlHttp = createXMLHttp();
}
var url = "&semester=" + "2008-2009學年第一學期"
+ "&orgId=" + 1;
xmlHttp.open("GET","getPermissions.servlet?" + encodeURI(encodeURI(url)),true); // GetPermissions在web.xml中配置為<url-pattern>/getPermissions.servlet</url-pattern>
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
permissionArray = eval("(" + xmlHttp.responseText + ")"); // 將從服務器請求得到的JSON串轉換為JavaScript的數組(這里是對象數組)
for(var i=0;i<permissionArray.length;i++) {
html += "<tr>";
html += "<td>" + permissionArray[i].id +"</td>";
html += "<td>" + permissionArray[i].semester +"</td>";
html += "<td>" + permissionArray[i].startTime +"</td>";
html += "<td>" + permissionArray[i].endTime +"</td>";
html += "<td>" + permissionArray[i].orgId +"</td>";
html += "<td>" + permissionArray[i].operatorId +"</td>";
html += "<td>" + permissionArray[i].operatorName +"</td>";
html += "<td>" + permissionArray[i].roleId +"</td>";
html += "</tr>";
}
html += "</table>";
var listContainer = document.getElementById("list");
listContainer.innerHTML = html;
}
}
xmlHttp.send(null);
}