JSON插件與json類型的Result

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

  1. <?xml version="1.0" encoding="GBK"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 
  4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
  5. <struts>  
  6.     <constant name="struts.i18n.encoding" value="UTF-8"/>  
  7.     <package name="example" extends="json-default">  
  8.         <action name="JSONExample" class="org.crazyit.app.action.JSONExample">  
  9.             <!-- 配置類型的json的Result -->  
  10.             <result type="json">  
  11.                 <!-- 爲該Result指定參數 -->  
  12.                 <param name="noCache">true</param>  
  13.                 <param name="contentType">text/html</param>  
  14.             </result>  
  15.         </action>  
  16.         <action name="*">  
  17.             <result>/WEB-INF/content/{1}.jsp</result>  
  18.         </action>  
  19.     </package>  
  20. </struts>  

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

Ø  第一個地方是配置struts.i18n.encoding常量時,不再使用GBK編碼,而是使用UTF-8編碼,這是因爲AjaxPOST請求都是以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

發佈了6 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章