fun

           

          JSON學習筆記之一

          首先,使用JavaScript的eval()函數實現,將JSON數據串轉換成為一個JavaScript對象數組。這里,在Servlet中訪問數據庫取得記錄,并合成JSON串,發送到客戶端。

          一般,對于企業級應用,使用JavaScript的eval()函數,存在安全隱患問題。這個例子就是感受一下JSON數據串從服務器段被傳送到客戶端之后,將數據轉換成為對象數組或者對象,從而方便地使用JavaScript來實現遍歷。

          看一下我的Permission實體的Hibernate映射文件:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "

          <hibernate-mapping>
          <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>

          現在,就是在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;

          /** author http://www.bt285.cn http://www.5a520.cn
          */

          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<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();
             }
          }          
          }

          用于顯示記錄的JSP頁面如下所示:

          <%@ page language="java" import="java.util.*,model.xgb.vo.*" contentType="text/html; charset=utf-8"
              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>

          我通過使用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 = "<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);
          }

          啟動WEB服務器,訪問鏈接http://www.5a520.cn  :8080/xgb/listPermissions.jsp可以看到頁面顯示的結果,如下所示:

          使用JSON進行數據傳送,比之于XML自然有很大的優勢,至少JSON更加精簡,將無關緊要的數據盡量壓縮,所以速度比XML要快。

          另外,JSON上面的這種使用方式就是使用JavaScript中的eval()函數來實現數據到類型的轉換,使用JavaScript的數組或者對象就能遍歷數據,而XML還要在JavaScript中使用XML DOM操作。

          posted on 2009-04-27 19:07 fun 閱讀(1839) 評論(0)  編輯  收藏

          導航

          統計

          常用鏈接

          留言簿(11)

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 斗六市| 措勤县| 盐城市| 广宁县| 临湘市| 平凉市| 沾化县| 琼结县| 昔阳县| 东至县| 长阳| 天祝| 沁水县| 乐平市| 盱眙县| 科技| 望都县| 太仓市| 栾城县| 哈密市| 新竹市| 修文县| 林州市| 抚松县| 阳原县| 广饶县| 二手房| 扶沟县| 依安县| 黄平县| 通榆县| 荥经县| 岚皋县| 霍州市| 仁化县| 西充县| 花垣县| 大关县| 渭源县| 旅游| 尼勒克县|