最近使用jquery,ajax調(diào)用后臺(tái)服務(wù)非常需要一個(gè)json返回類(lèi)型,網(wǎng)上只有一個(gè)可用的插件,叫jsonplugin 。但是測(cè)試了一下,兩個(gè)版本居然都有錯(cuò)誤,而且通過(guò)文檔知道,它的使用還是相對(duì)復(fù)雜的,需要配置哪個(gè)對(duì)象需要轉(zhuǎn)換,那些對(duì)象不需要。不難想象,通常我們只需要將一個(gè)對(duì)象轉(zhuǎn)換成json格式,如果數(shù)據(jù)多,大不了都塞到一個(gè)對(duì)象里。
這樣說(shuō)起來(lái),倒不如棄配置,轉(zhuǎn)而采用規(guī)則,規(guī)定action中如果需要為ajax提供服務(wù)器端服務(wù),必須定義一個(gè)名字叫json的成員類(lèi),類(lèi)型當(dāng)然是最通用的Object。然后實(shí)現(xiàn)一個(gè)Result,在value stack中,找到名字叫json的對(duì)象,把它序列化成json串寫(xiě)回客戶(hù)端就ok了。
注意:如果json的實(shí)際類(lèi)型是String,這個(gè)String必須符合json語(yǔ)法規(guī)范。Map List之類(lèi)的就無(wú)所謂,直接用就是了
Result代碼如下:
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.util.ValueStack;
import net.sf.json.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.StrutsStatics;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class JSONResult implements Result {
private static final Log log = LogFactory.getLog(JSONResult.class);
public void execute(ActionInvocation invocation) throws Exception {
ActionContext actionContext = invocation.getInvocationContext();
HttpServletResponse response = (HttpServletResponse) actionContext
.get(StrutsStatics.HTTP_RESPONSE);
try {
String json;
Object jsonObject;
// generate JSON
ValueStack stack = invocation.getStack();
jsonObject = stack.findValue("json");
json = JSONObject.fromObject(jsonObject).toString();
log.debug(json);
response.setContentType("text/xml;charset=utf-8");
response.getWriter().write(json);
} catch (IOException exception) {
log.error(exception.getMessage(), exception);
throw exception;
}
}
}
struts配置如下:
<result-types>
<result-type name="json" class="JSONResult"/>
</result-types>
<action >
<result name="ajax" type="json" />
</action>
action部分代碼:
private Object json;
public Object getJson() {
return json;
}
public void setJson(Object json) {
this.json = json;
}