簡單地說,JSON插件允許我們在JavaScript中異步調用Action,而且Action不再需要使用視圖資源來顯示該Action里的狀態信息,而是由JSON插件負責將Action里的狀態信息返回給調用頁面——通過這種方式,就可以完成Ajax交互。
Struts2提供了一種可插拔方式來管理插件,安裝Struts2的JSON插件與安裝普通插件并沒有太大的區別,一樣只需要將Struts2插件的JAR文件復制到Web應用的WEB-INF/lib路徑下即可。
安裝JSON插件按如下步驟進行:
(1)登陸http://code.google.com/p/jsonplugin/downloads/list站點,下載Struts2的JSON插件的最新版本,當前最新版本是0.7,我們可以下載該版本的JSON插件。
(2)將下載到的jsonplugin-0.7.jar文件復制到Web應用的WEB-INF路徑下,即可完成JSON插件的安裝。
實現Actio邏輯
假設wo,en輸入頁面中包含了三個表單域,這三個表單域對于三個請求參數,因此應該使用Action來封裝這三個請求參數。三個表單域的name分別為field1、field2和field3。
處理該請求的Action類代碼如下:
public class JSONExample { //封裝請求參數的三個屬性 private String field1; private transient String field2; private String field3; //封裝處理結果的屬性 private int[] ints = {10, 20}; private Map map = new HashMap(); private String customName = "custom"; //三個請求參數對應的setter和getter方法 public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } //此處省略了field1和field2兩個字段的setter和getter方法 ... //封裝處理結果的屬性的setter和getter方法 public int[] getInts() { return ints; } public void setInts(int[] ints) { this.ints = ints; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } //使用注釋語法來改變該屬性序列化后的屬性名 @JSON(name="newName") public String getCustomName() { return this.customName; } public String execute() { map.put("name", "yeeku"); return Action.SUCCESS; } } |
serialize:設置是否序列化該屬性
deserialize:設置是否反序列化該屬性。
format:設置用于格式化輸出、解析日期表單域的格式。例如"yyyy-MM-dd'T'HH:mm:ss"。
配置該Action與配置普通Action存在小小的區別,應該為該Action配置類型為json的Result。而這個Result無需配置任何視圖資源。
配置該Action的struts.xml文件代碼如下:
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.i18n.encoding" value="UTF-8"/> <package name="example" extends="json-default"> <action name="JSONExample" class="lee.JSONExample"> <result type="json"/> </action> </package> </struts> |
第一個地方是配置struts.i18n.encoding常量時,不再是使用GBK編碼,而是UTF-8編碼,這是因為Ajax的POST請求都是以UTF-8的方式進行編碼的。
第二個地方是配置包時,自己的包繼承了json-default包,而不再繼承默認的default包,這是因為只有在該包下才有json類型的Result。