Struts2與JSON

1.   必需的庫
struts2-json-plugin-2.1.8.1.jar

json-lib-2.1.jar

版本號可能會有所不同,而且這兩個包也是MyEclipse在創建Struts2項目時自帶並且已經包含的。

2.   setter與getter
Action類中私有成員變量的setter和getter方法在Struts2框架下會被自動轉化成HttpServletRequest對象的getParameter方法和setAttribute方法,也就是說setter方法的實質就是從request中取出名字與變量名相同的數據,並將其賦值給該變量;而getter方法就是將變量名與值分別作為key和value存入request對象的attribute中。

理解瞭這一點,顯而易見,不需要反饋到View層的Action私有變量是沒有必要設置它的getter方法的。這在JSON生成之中尤為重要,因為多餘的getter方法會把私有變量的值傳遞到JSON之中。

3.   Action類中JSON的生成機制
需要生成JSON的Action最好不要實現ModelDriven接口,其原因正如上所述,實現瞭ModelDriven接口的Action類必須實現getModel方法,其導致的結果就是生成的JSON數據中有一串名為“model”的數據。它可能會暴露一些並不需要客戶端知道的數據,同時也會增加JSON數據的大小。

JSON數據在Action類中是根據getter方法的返回值自動裝配的,也就是說完全可以不需要重寫execute方法。JSON的生成機制(上述兩個必需的包中提供的方法)會直接從setter方法獲取到request中提供的值,並且自動裝配getter方法提供的返回值。期間如果有其它的功能操作,如計算、查詢數據庫、重組數據等,可以寫到getter方法中,也可以寫到execute方法中統一執行。

這裡需要註意的是execute方法的返回值字符串是無效的,可以隨意設置,因為在後面的配置文件中並不會用到。

getter方法返回值的類型可以采用基本數據類型、String類、集合類(List、Map等)以及諸如Double、Integer等打包類。這些都不會影響JSON的生成,因為對於結果而言都是字符串類型的;而集合類在生成時會被自動迭代,因此生成的結果中其本身的集合類型(列表、映射表等)也不會改變。

因此在Action類可以將所有的結果數據保存到一個List或Map中在通過getter方法輸出,也可以設置多個getter方法返回不同類型、不同變量的數據。這些數據在JSON中的名稱與getter方法名中一致。

4.   配置文件的設定
與基本的Action相比,生成JSON的Action在配置文件struts.xml中主要有兩點不同:

1.      不能與基本的Action配置在同一個package中,新的package必須擴展自(extends)json-default命名空間;

2.      result標簽中可以不包含name屬性(因為沒用),但是必須包含type屬性,且值必須為“json”,即<result type=”json” ></result>,表明這是一個JSON數據,不需要跳轉頁面。

5.   示例
JsonAction類:

[java]
package com; 
  
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
  
import com.opensymphony.xwork2.ActionSupport; 
  
public class JsonAction extends ActionSupport { 
  
    private static final long serialVersionUID = 4905130009784850861L; 
    
    private String username; 
    private String password; 
//  private List<String> result;  
    private Map<String, String> map; 
    
    public void setUsername(String username) { 
       this.username = username; 
    } 
    public void setPassword(String password) { 
       this.password = password; 
    } 
    
//  public List<String> getResult() {  
//     return this.result;  
//  }  
    public Map<String, String> getResult() { 
       return map; 
    } 
  
    public String execute() { 
//     result = new ArrayList<String>();  
//     result.add(username);  
//     result.add(password);  
       map = new HashMap<String, String>(); 
       map.put("usr", username); 
       map.put("pwd", password); 
       map.put("logon", "true"); 
       
       return SUCCESS; 
    } 

package com;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class JsonAction extends ActionSupport {
 
    private static final long serialVersionUID = 4905130009784850861L;
  
    private String username;
    private String password;
//  private List<String> result;
    private Map<String, String> map;
  
    public void setUsername(String username) {
       this.username = username;
    }
    public void setPassword(String password) {
       this.password = password;
    }
  
//  public List<String> getResult() {
//     return this.result;
//  }
    public Map<String, String> getResult() {
       return map;
    }
 
    public String execute() {
//     result = new ArrayList<String>();
//     result.add(username);
//     result.add(password);
       map = new HashMap<String, String>();
       map.put("usr", username);
       map.put("pwd", password);
       map.put("logon", "true");
     
       return SUCCESS;
    }
}
struts.xml:

[html]
<?xml version="1.0"encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> 
<struts> 
    <constant name="struts.devMode" value="true"></constant> 
    
    <package name="json" extends="json-default"> 
       <action name="loginJson"class="com.JsonAction"> 
           <result type="json"></result> 
       </action> 
    </package> 
</struts>    

<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <constant name="struts.devMode" value="true"></constant>
  
    <package name="json" extends="json-default">
       <action name="loginJson"class="com.JsonAction">
           <result type="json"></result>
       </action>
    </package>
</struts>  
結果:

 \

發佈留言