struts2.1.8.1+jquery1.4.2返回json資料

xiayanyang1988發表於2011-06-08

1、引入包(本文中的包全部引自struts-2.1.8.1\lib):

struts2-json-plugin-2.1.8.1.jar
json-lib-2.1.jar
commons-collections-3.2.jar
commons-beanutils-1.7.0.jar
commons-lang-2.3.jar
commons-logging-1.0.4.jar
ezmorph-1.0.3.jar

這7個包是返回json形式的資料必須的。因為json大量引用了Apache commons的包,所以要加入4個,commons包,除了commons的包外,還需要引入一個 ezmorph的包。最後加入struts2必須的6個包:

struts2-core-2.1.8.1.jar
xwork-core-2.1.6.jar
ognl-2.7.3.jar
freemarker-2.3.15.jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar

2、後臺:

1) Userinfo實體類程式碼
public class UserInfo implements Serializable {   
    private int userId;  
    private String userName; 
    private String password; 
    get set方法略
}
2) Action類
public class TestAction extends ActionSupport {
    private String message;                //使用json返回單個值
    private UserInfo userInfo;              //使用json返回物件
    private List userInfosList;     //使用josn返回List物件
    get set方法略
   /*返回單個值*/   
   public String returnMsg(){   
        this.message = "成功返回單個值";  
        return SUCCESS; 
   }  
   /*返回UserInfo物件*/   
   public String returnUser(){ 
       userInfo = new UserInfo();
       userInfo.setUserId(10000);
       userInfo.setUserName("劉棟");
       userInfo.setPassword("123456");
       return SUCCESS; 
   } 
  /*返回List物件*/   
   public String returnList(){   
       userInfosList = new ArrayList<UserInfo>(); 
       UserInfo u1 = new UserInfo(); 
       u1.setUserId(10000);   
       u1.setUserName("張三"); 
       u1.setPassword("111111");
       UserInfo u2 = new UserInfo();
       u2.setUserId(10001);   
       u2.setUserName("李四");   
       u2.setPassword("222222"); 
       userInfosList.add(u1); 
       userInfosList.add(u2);  
       return SUCCESS;   
   }   
}
3) struts.xml(必須繼承json-default、json-default繼承自struts-default)
<package name="default" namespace="/json" extends="json-default"> 
<action name="returnMsg" class="com.testAction " method="returnMsg">   
<result  name="success" type="json">
	<param name="root">validate</param>
</result>   
</action> 
<action name="returnUser " 
class="com.testAction " method="returnUser ">
<result  name="success" type="json">
<param name="includeProperties">
	userInfo\.userId,userInfo\.userName,userInfo\.password
</param>	
</result>   
</action>
<action name="returnList" class="com.testAction "
 method="returnList">   
<result  name="success" type="json">
<param name="includeProperties">
	userInfosList\[\d+\]\.userName,userInfosList\[\d+\]\.password
</param>
</result>   
</action>
</package>

3、前臺:

1) 頁面引入jquery-1.4.2.js
2) 程式碼如下:
<script language="javascript">
   function getMsg(){ 
      $.ajax({
         url:'json/returnMsg.action', 
         type:'post',
         dataType:'json', 
         success:function(data){ 
	        $("#result").html(data.message);
         }
      });
    }

   function getUser(){ 
      $("# result ").html("");  
      $.ajax({
         url:'json/returnUser.action', 
         type:'post',
         dataType:'json', 
         success:function(data){ 
	        $("#result").append("使用者ID:"+data.userInfo.userId+"")
                        .append("使用者名稱:"+data.userInfo.userName+"")
                        .append("密碼:"+data.userInfo.password+"");
         }
      });
    }

   function getUserList(){ 
      $("# result ").html("");   
      $.ajax({
         url:'json/returnList.action', 
         type:'post',
         dataType:'json', 
         success:function(data){ 
           $.each(data.userInfosList,function(i,value){   
	          $("#result").append("第"+(i+1)+"個使用者")
                          .append("使用者名稱:"+value.userName+"")
                          .append("密碼:"+value.password+"");
           }
         }
      });
    }
</script>
<div id="result"></div>
<input type="button" value="獲得單個訊息" onclick="getMsg()"/>
<input type="button" value="獲得使用者資訊" onclick="getUser()"/>
<input type="button" value="獲得使用者列表" onclick="getUserList()"/>
	

4、只要繼承extends="json-default",result type設定成json之後,容器會把action的屬性自動封裝到一個json物件中(json攔截器來做),然後呼叫ajax的callback方法. 返回json資料

5、includeProperties 引數:輸出結果中需要包含的屬性值,這裡正規表示式和屬性名匹配,可以用“,”分割填充多個正規表示式。

如:輸出UserInfo的所有屬性及UserInfo的userName屬性

<result type="json">
   <param name="includeProperties"> userInfo.*, 
   userInfo \. userName </param>
</result> 
	

6、excludeProperties 引數:輸出結果需要剔除的屬性值,也支援正規表示式匹配屬性名,可以用“,”分割填充多個正規表示式,類同includeProperties

7、輸出一個JSON List列表

<result name="success" type="json"> 
<param name="includeProperties"> 
    userInfosList\[\d+\]\.userName,userInfosList\[\d+\]\.password
</param> 
</result>

其中userInfosList是action中的一個List型別的屬性,userInfosList \[\d+\]\. userName表示,userInfosList中儲存的物件0..end的userName屬性(list中儲存的物件必須有userName屬性)。

8、為什麼要用includeProperties或excludeProperties 引數:主要是為了過濾掉介面,pojo的set、list、其它物件等不需要的資料防止迴圈取其它關聯物件或找不到介面。如果不配置,預設是處理action中的所有屬性,如果action中有介面注入,json攔截器可能找不到介面而返回不了結果,還有如果action中有一個物件,這個物件與好多物件都有關聯,json攔截器會將相關聯的所有物件的屬性全部轉換成json格式,如果其它物件有list、set,其返回結果相當龐大,有可能是死迴圈而無法返回 。如果不用<param name="includeProperties">或其他方式進行json資料過濾,通過debug你會發現前臺返回的json字串,是把action中的所有屬性全部轉化成json字串返回給客戶端(包括service介面、pojo所有屬性及有關聯的pojo。有時候根本返回不了結果,也不報錯,後臺執行了,但前臺執行不到callback function,這主要是因為找不到介面或者關聯的pojo太多,造成死迴圈),一般情況下用的最多的就是root、includeProperties 和excludeNullProperties引數。當然還有其他的方法,如給pojo的屬性加json註解。

9、總結: action中避免使用get開頭的action方法,去掉action中的介面的get方法 為json型別的result配置includeProperties, excludeProperties等引數.

相關文章