想要在struts中返回json格式數據有兩種辦法。
1.使用servlet的輸出流
實際上就是在struts中獲取response對象的輸出流。然后寫入你要返回的json數據,本質和用servlet返回json數據是一樣的,需要自己導入json的jar包。不做詳細介紹。
2.試用struts對json的擴展
這里需要兩個jar包,xwork-core-2.1.6.jar和struts2-json-plugin-2.1.8.jar。如果是用MyEclipse注入的struts環境就不需要手動了。下面以一個例子講解。
1 package action; 2 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 7 import org.apache.struts2.json.annotations.JSON; 8 9 import com.opensymphony.xwork2.ActionSupport; 10 11 import entity.Outbox; 12 import util.DaoFactory; 13 14 public class SendBoxJson extends ActionSupport { 15 private static final long serialVersionUID = 1L; 16 private Map<String,Object> data; 17 private String state; 18 19 private String userId; 20 private String searchType; 21 private String keyValue; 22 private String start; 23 private String end; 24 25 26 27 28 29 public Map getData() { 30 return data; 31 } 32 33 public String getState() { 34 return state; 35 } 36 37 38 public void setUserId(String userId) { 39 this.userId = userId; 40 } 41 42 public void setSearchType(String searchType) { 43 this.searchType = searchType; 44 } 45 46 public void setKeyValue(String keyValue) { 47 this.keyValue = keyValue; 48 } 49 50 public void setStart(String start) { 51 this.start = start; 52 } 53 54 public void setEnd(String end) { 55 this.end = end; 56 } 57 58 public String getJson() throws Exception { 59 List<Outbox> list = DaoFactory.getOutBoxDaoInstance().getOutMails(userId, searchType, keyValue, start, end); 60 state="success"; 61 data=new HashMap<String,Object>(); 62 data.put("data", list); 63 data.put("state",state); 64 System.out.println(data); 65 return "heihei"; 66 } 67 }
上面的是一個普通的struts類,沒什么特殊之處。重點在struts的配置文件中。
1 <package name="json" namespace="/" extends="struts-default,json-default"> 2 <action name="json" class="action.SendBoxJson" method="getJson"> 3 4 <result name="heihei" type="json"> 5 6 <!-- 這里指定將被Struts2序列化的屬性,該屬性在action中必須有對應的getter方法 --> 7 <param name="root">data</param> 8 <!-- 指定是否序列化空的屬性 --> 9 <param name="excludeNullProperties">true</param> 10 <!-- 這里指定將序列化list中的那些屬性 --> 11 <!-- <param name="includeProperties">data.*</param> --> 12 <!-- 這里指定將要從list中排除那些屬性,這些排除的屬性將不被序列化,一般不與上邊的參數配置同時出現 --> 13 <!-- <param name="excludeProperties">id</param> --> 14 </result> 15 </action> 16 </package>
在配置中,首先需要action所在的package繼承了json-default,或者繼承的父包繼承了json-default。然后result里多了個type=“json”這是說明返回的是json字符串。
<param name="root">data</param>要講data這個變量序列化后返回,data是上面struts類中一個變量。
注意如果data類型為list,需要使用
<param name="includeProperties">data.*</param>來指定,否則返回的json字符串會為空。
如果想要忽略對象的某個屬性,可在屬性的get方法加@JSON(serialize=false) ,常用在hibernate的實體中,如果返回的是hibernate實體,該實體又用到了另一個實體,就會因為懶加載的原因序列化失敗(自行百度),就需要在某些屬性加上上面的注釋。
上面的set是一對多關系的表示.