在Struts 2中使用JSON Ajax支援
JSON外掛程式提供了一種名為json的ResultType,一旦為某個Action指定了一個類型為json的Result,則該Result無需映射到任何視圖資源。將下載到的jsonplugin-0.7.jar檔案複製到Web應用的WEB-INF路徑下,即可完成JSON外掛程式的安裝。
JSON外掛程式提供了一種名為json的ResultType,一旦為某個Action指定了一個類型為json的Result,則該Result無需映射到任何視圖資源。因為JSON外掛程式會負責將Action裡的狀態資訊序列化成JSON格式的資料,並將該資料返回給用戶端頁面的JavaScript。
簡單地說,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;
}
} |
在上面代碼中,使用了JSON注釋,注釋時指定了name域,name域指定Action屬性被序列化成JSON對象的屬性名稱。除此之外,JSON注釋還支援如下幾個域:
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。
在上面設定檔中有兩個值得注意的地方:
第一個地方是配置struts.i18n.encoding常量時,不再是使用GBK編碼,而是UTF-8編碼,這是因為Ajax的POST請求都是以UTF-8的方式進行編碼的。
第二個地方是配置包時,自己的包繼承了json-default包,而不再繼承預設的default包,這是因為只有在該包下才有json類型的Result。
轉自:http://webservices.ctocio.com.cn/tips/424/7670924.shtml