JSON插件提供了一種json類型的Result,一旦爲某個Action指定了一個類型爲json的Result,則該Result無須映射到任何視圖資源。因爲JSON插件會負責將Action裏的狀態信息序列化成JSON格式的字符串,並將該字符串返回給客戶端瀏覽器。
簡單地說,JSON插件允許我們在客戶端頁面的JavaScript中異步調用Action,而且Action不再需要使用視圖資源來顯示該Action裏的狀態信息,而是由JSON插件負責將Action裏的狀態信息返回給調用頁面——通過這種方式,就可以完成Ajax交互。
將Struts 2解壓縮目錄的lib子目錄下struts2-json-plugin-2.2.1.jar文件複製到Web應用的WEB-INF\lib目錄下,即可爲該Struts 2應用增加JSON插件。
接下來配置提供返回JSON字符串的Action,配置該Action與配置普通Action存在小小的區別,應該爲該Action配置類型爲json的Result,而這個Result無須配置任何視圖資源。
配置該Action的struts.xml文件代碼如下。
程序清單:codes\04\4.6\struts2json\WEB-INF\src\struts.xml
- <?xml version="1.0" encoding="GBK"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
- "http://struts.apache.org/dtds/struts-2.1.7.dtd">
- <struts>
- <constant name="struts.i18n.encoding" value="UTF-8"/>
- <package name="example" extends="json-default">
- <action name="JSONExample" class="org.crazyit.app.action.JSONExample">
- <!-- 配置類型的json的Result -->
- <result type="json">
- <!-- 爲該Result指定參數 -->
- <param name="noCache">true</param>
- <param name="contentType">text/html</param>
- </result>
- </action>
- <action name="*">
- <result>/WEB-INF/content/{1}.jsp</result>
- </action>
- </package>
- </struts>
在上面配置文件中有兩個值得注意的地方:
Ø 第一個地方是配置struts.i18n.encoding常量時,不再使用GBK編碼,而是使用UTF-8編碼,這是因爲Ajax的POST請求都是以UTF-8的方式進行編碼的。
Ø 第二個地方是配置包時,自己的包繼承了json-default包,而不再繼承默認的default包,這是因爲只有在該包下才有json類型的Result。
一旦我們將某個邏輯視圖名配置成json類型,這將意味着該邏輯視圖無須指定物理視圖資源,因爲JSON插件會將該Action序列化後發送給客戶端。
正如上面的粗體字代碼所示,配置json類型的Result時無須指定任何視圖資源——JSON插件會將Action對象序列化成一個JSON格式的字符串,並將該字符串作爲響應輸出給請求者。
上面的粗體字代碼中定義json類型的Result時,還指定了noCache、contentType兩個參數,這都是json類型的Result的合法參數,json類型的Result可以接受如表4.1所示的常用參數。
表4.1 json類型的Result允許指定的參數
參 數 名 |
合 法 值 |
默 認 值 |
說 明 |
excludeProperties |
逗號隔開的多個屬性名表達式 |
|
所有匹配其中任意一個屬性名表達式的屬性都不會被序列化到JSON字符串中 |
IncludeProperties |
逗號隔開的多個屬性名表達式 |
|
所有匹配其中任意一個屬性名表達式的屬性都會被序列化到JSON字符串中 |
root |
OGNL表達式,確定Action內某個屬性 |
|
設置該參數將不再把整個Action對象序列化成JSON字符串。而是隻將該參數所指定的Action屬性序列化成JSON字符串,返回給客戶端 |
參 數 名 |
合 法 值 |
默 認 值 |
說 明 |
wrapPrefix |
任意字符串 |
|
設置在系統生成的JSON結果字符串前添加固定的字符串前綴 |
wrapSuffix |
任意字符串 |
|
設置在系統生成的JSON結果字符串後添加固定的字符串後綴 |
ignoreHierarchy |
true或false |
true |
默認情況下,JSON插件只序列化Action對象的本身的屬性,不會理會它的父類的屬性。將該屬性設false,將會序列化從Object類開始、所有父類、直到該Action類中所包含的全部屬性 |
enableGZIP |
true或false |
false |
設置是否對JSON響應啓用gzip壓縮。如果啓用gzip壓縮,需要客戶端瀏覽器支持 |
noCache |
true或false |
false |
設置是否取消瀏覽器緩存。將該參數設爲true,將意味着增加如下響應頭: Cache-Control: no-cache Expires: 0 Pragma: No-cache |
excludeNullProperties |
true或false |
false |
設置是否不序列化屬性值爲null的屬性 |
contentType |
合法的MIME類型 |
text/html |
設置服務器響應的類型。默認是text/html,通常無須修改 |
本文出自 “瘋狂Java李剛” 博客,http://javaligang.blog.51cto.com/5026500/897429