想要在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环境就不需要手动了。下面以一个例子讲解。
package action; import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.struts2.json.annotations.JSON; import com.opensymphony.xwork2.ActionSupport; import entity.Outbox;
import util.DaoFactory; public class SendBoxJson extends ActionSupport {
private static final long serialVersionUID = 1L;
private Map<String,Object> data;
private String state; private String userId;
private String searchType;
private String keyValue;
private String start;
private String end; public Map getData() {
return data;
} public String getState() {
return state;
} public void setUserId(String userId) {
this.userId = userId;
} public void setSearchType(String searchType) {
this.searchType = searchType;
} public void setKeyValue(String keyValue) {
this.keyValue = keyValue;
} public void setStart(String start) {
this.start = start;
} public void setEnd(String end) {
this.end = end;
} public String getJson() throws Exception {
List<Outbox> list = DaoFactory.getOutBoxDaoInstance().getOutMails(userId, searchType, keyValue, start, end);
state="success";
data=new HashMap<String,Object>();
data.put("data", list);
data.put("state",state);
System.out.println(data);
return "heihei";
}
}
上面的是一个普通的struts类,没什么特殊之处。重点在struts的配置文件中。
<package name="json" namespace="/" extends="struts-default,json-default">
<action name="json" class="action.SendBoxJson" method="getJson"> <result name="heihei" type="json"> <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
<param name="root">data</param>
<!-- 指定是否序列化空的属性 -->
<param name="excludeNullProperties">true</param>
<!-- 这里指定将序列化list中的那些属性 -->
<!-- <param name="includeProperties">data.*</param> -->
<!-- 这里指定将要从list中排除那些属性,这些排除的属性将不被序列化,一般不与上边的参数配置同时出现 -->
<!-- <param name="excludeProperties">id</param> -->
</result>
</action>
</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是一对多关系的表示.