富客戶端程序設計實例 - Action層 - Json 的序列化
Json 序列化是 RIA 應用程序特有的一步環節。Json是一種輕量級數據交換格式,他的出現替代了XMl文件作為平臺無關的媒介。ExtJS作為視圖層,需要與后臺交換數據。交換的方式為Json串。這一部分是系統后臺與前臺的連接點。
查詢記錄
針對將查詢結果集響應回視圖所返回的Json串,是多條記錄的集合。Json串示例樣式:
</span></div>
{"results":13,"items":[{"id":"1","statu":1,"name":"1","pass":"9","age":9,"sex":"9","money":9,"email":"9","mobile":"9","managerId":9,"inTime":"9","outTime":"9"},……{}],"success":true}
這些內容會被ExtJS中的Model解析成一個個對象,然后顯示在Ext.grid.Panel中顯示對應的記錄。
[java] view plaincopy
</div>
</div>
- /**
- * 將json數據寫入此次響應流中
- * @param str json數據
- */
- private void jsonWriter(String str)
- {
- Writer writer = null;
- try
- {
- try
- {
- writer = ServletActionContext.getResponse().getWriter();
- writer.write(str);
- //ServletActionContext 在 package org.apache.struts2; 下。
- //getWriter() 在 package javax.servlet;下。
- }
- finally
- {
- writer.flush(); // 清除
- writer.close(); // 關閉
- }
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- /**
- * 將查詢結果集響應回視圖
- * @param list 結果集
- * @param <T> 實體對象類型
- * @return json
- */
- protected <T> String ajaxJson(List<T> list)
- {
- String strs = "{\"results\":" + list.size() +
- ",\"items\":" + gson.toJson(list) + ",\"success\":true}";
- jsonWriter(strs);
- return strs;
- } </ol> </div> </div>
- /**
- * 讀取request中的json信息
- * @return jsonStr
- */
- protected String getJsonFromRequest()
- {
- String jsonStr = null;
- try
- {
- BufferedReader br = ServletActionContext.getRequest().getReader();
- jsonStr = br.readLine() ;
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- return jsonStr;
- } </ol> </div> </div>
- /**
- * 將json解析成相應實體對象
- * @param json json數據
- * @param cla 實體類
- * @param <T> 實體對象類型
- * @return 實體對象
- */
- protected <T> T getObjectFromJson(String json, Class<T> cla)
- {
- if (StringUtils.isNotEmpty(json) && cla != null)
- {
- return gson.fromJson(json, cla);
- }
- return null;
- } </ol> </div> </div>
- public class EmployeeAction extends BaseAction
- {
- // 保存數據
- public void add()
- {
- String jsonStr = getJsonFromRequest();
- System.out.println("保存數據 Request" + jsonStr);
- List<Employee> empList = new ArrayList<Employee>();
- empList.add(getObjectFromJson(jsonStr, Employee.class));
- service.saveInfo(empList);
- }
- //更新數據
- public void update()
- {
- String jsonStr = getJsonFromRequest();
- System.out.println("更新數據 Request" + jsonStr);
- List<Employee> empList = new ArrayList<Employee>();
- empList.add(getObjectFromJson(jsonStr, Employee.class));
- service.updateInfo(empList);
- }
- } </ol> </div> </div>
- /**
- * 將json解析成相應實體對象集合 刪除一條數據會用到
- * @param json json數據
- * @param cla 實體類
- * @param <T> 實體對象類型
- * @return 實體對象集合
- */
- protected <T> List<T> getListFromJson(String json, Class<T> cla)
- {
- if (StringUtils.isNotEmpty(json) && cla != null)
- {
- List<T> list = new ArrayList<T>();
- String[] strs = null;
- if(json.startsWith("[") && json.endsWith("]")) //刪除多條記錄會進入此分支
- {
- String a = "\\},\\{" ;
- String b = "\\}\\$\\{" ;
- strs = json.substring(1,json.length()-1).replaceAll(a,b ).split("\\$");
- }
- else if(json.startsWith("{") && json.endsWith("}")) //刪除一條記錄會進入此分支
- {
- strs = json.split("$"); //因為沒有$這個字符,故字符串會被整體分割成一個數組
- }else
- {
- // TODO 異常信息處理
- }
- for(String str : strs)
- {
- list.add(gson.fromJson(str, cla));
- }
- return list;
- }
- return null;
- } </ol> </div> </div>
增加記錄與修改記錄
此時返回的是一條記錄,對應的Json串如下
{"statu":"2","name":"2","pass":"2","age":2,"sex":"2","money":2,"email":"2","mobile":"2","managerId":2,"inTime":"2","outTime":"2"}
下一步需要將Json串轉換成對象保存到List中,最后由DAO持久化到數據庫里。getObjectFromJson返回的對象是:org.hongbo.Yangcl.entity.Employee@18e7a09。
[java] view plaincopy
</div>
</div>
對應在EmployeeAction.java中
view plaincopy
</div>
</div>
刪除記錄
針對刪除操作,substring(1,json.length()-1)去除字符串中的“【” 和 “】”。新字符串從原串的第二個字符開始,倒數第二個結束 。 在取得的字符串中的兩條記錄中,連接方式是這樣的"outTime":"1"},{"id":"0001"( 兩條記錄間的連接方式: },{ )目的要將多條記錄分割成數組,將 “,” 替換成 “$” 。故采用正則表達式轉換連接方式為: }${ 。 \\ 是正則的特殊字符的表示。
局部測試代碼
System.out.println(json.substring(1,json.length()-1).replaceAll(a,b )); //結果:"outTime":"1"}${"id":"4028800
[java] view plaincopy
</div>
</div>
本文由用戶 Yangcl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
推薦閱讀
富客戶端程序設計實例 - Action層 - Json 的序列化
Json 序列化是 RIA 應用程序特有的一步環節。Json是一種輕量級數據交換格式,他的出現替代了XMl文件作為平臺無關的媒介。ExtJS作為視圖層,需要與后臺交換數據。交換的方式為Json串...
富客戶端程序設計實例 - Action層 - package-info.java 介紹
為什么需要 package-info.java,原因在這里:Package annotations must be in file package-info.java 。 package-inf...
富客戶端程序設計實例 - DAO層 - DAO 與 Hibernate 的 SessionFactory
實際上 Spring 在整個DAO層面上一般只做了2 件事: @Repository 托管 存儲層Bean, @Resource 實例 化org.hibernate.SessionFactory...
富客戶端程序設計實例 - Action層 - Struts2基于 package-info.java注解 的Action配置
package-info.java @ParentPackage ( "emps" ) // <package?name="emps"?extends="struts-default"></pa...