1. 程式人生 > >struts配置中是什麼意思 .

struts配置中是什麼意思 .

在Struts2中,type="json“這樣是用來做AJAX請求的  
所以根本就沒有跳轉頁面。
json是一種資料格式,具體可以網上去學習一下。
在Struts2中,如果這樣寫,會將你Action中的變數轉成JSON 返回到頁面
用來做AJAX是非常方便的。

只要繼承extends="json-default",result type設定成json之後,容器會把action的屬性自動封裝到一個json物件中(json攔截器來做)

1, ignoreHierarchy 引數:默示是否忽視等級,也就是持續關係,比如:TestAction 持續於 BaseAction,那麼 TestAction 中返回的 json 字串預設是不會包含父類 BaseAction 的屬性值,ignoreHierarchy 值預設為 true,設定為 false 後會將父類和子類的屬性一路返回。

<result type=”json”>
    <paramname=”ignoreHierarchy”>false</param>
</result>

2, excludeNullProperties 引數:默示是否去掉空值,預設值是 false,若是設定為 true 會主動將為空的值過濾,只輸出不為空的值。

<result ype=”json”>
     <paramname=”excludeNullProperties”>true</param>
</result>

3, root 引數:從返回成果中按照 ognl 表示式取出你須要輸出的成果。 只輸出 person 物件的 name 屬性值,裝置如下:

<result type=”json”>
     <param name=”root”>person.name</param>
</result>

4, includeProperties 引數:輸出成果中須要包含的屬性值,這裡正則表示式和屬性名匹配,可以用 “,” 分別填充多個正則表示式。

<result type=”json”>
   <param name=”includeProperties”>person.*, person.name</param>
</result>

5, excludeProperties 引數:輸出成果須要剔除的屬性值,也支撐正則表示式匹配屬性名,可以用 “,” 分別填充多個正則表示式,類同 includeProperties 引數。


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類程式碼如下:

publicclassJSONExample {
//封裝請求引數的三個屬性
private String field1;
private transientStringfield2;
privateStringfield3;
//封裝處理結果的屬性
privateint[]ints={10,20};
privateMapmap=newHashMap();
privateStringcustomName="custom";
//三個請求引數對應的setter和getter方法
publicStringgetField1() {
return field1;
}
publicvoidsetField1(Stringfield1) {
this.field1=field1;
}
//此處省略了field1和field2兩個欄位的setter和getter方法 ...
//封裝處理結果的屬性的setter和getter方法
publicint[]getInts() {
returnints;
}
publicvoidsetInts(int[]ints) {
this.ints=ints;
}
publicMapgetMap() {
returnmap;
}
publicvoidsetMap(Mapmap) {
this.map=map;
} //使用註釋語法來改變該屬性序列化後的屬性名 @JSON(name="newName") publicStringgetCustomName() {
returnthis.customName;
}
publicStringexecute() {
map.put("name","yeeku");
returnAction.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檔案程式碼如下:

<?xmlversion="1.0"encoding="GBK"?> <!DOCTYPEstrutsPUBLIC "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constantname="struts.i18n.encoding"value="UTF-8"/>
<packagename="example"extends="json-default">
<actionname="JSONExample""lee.JSONExample">
<resulttype="json"/>
</action>
</package>
</struts>

在上面配置檔案中有兩個值得注意的地方:

第一個地方是配置struts.i18n.encoding常量時,不再是使用GBK編碼,而是UTF-8編碼,這是因為Ajax的POST請求都是以UTF-8的方式進行編碼的。

第二個地方是配置包時,自己的包繼承了json-default包,而不再繼承預設的default包,這是因為只有在該包下才有json型別的Result.