struts2 亲密接触 json(json result type)

最近使用jquery,ajax调用后台服务非常需要一个json返回类型,网上只有一个可用的插件,叫jsonplugin 。但是测试了一下,两个版本居然都有错误,而且通过文档知道,它的使用还是相对复杂的,需要配置哪个对象需要转换,那些对象不需要。不难想象,通常我们只需要将一个对象转换成json格式,如果数据多,大不了都塞到一个对象里。

这样说起来,倒不如弃配置,转而采用规则,规定action中如果需要为ajax提供服务器端服务,必须定义一个名字叫json的成员类,类型当然是最通用的Object。然后实现一个Result,在valuestack中,找到名字叫json的对象,把它序列化成json串写回客户端就ok了。

注意:如果json的实际类型是String,这个String必须符合json语法规范。MapList之类的就无所谓,直接用就是了

Result代码如下:

import com.opensymphony.xwork2.ActionContext;

importcom.opensymphony.xwork2.ActionInvocation;

importcom.opensymphony.xwork2.Result;

importcom.opensymphony.xwork2.util.ValueStack;

importnet.sf.json.JSONObject;

importorg.apache.commons.logging.Log;

importorg.apache.commons.logging.LogFactory;

importorg.apache.struts2.StrutsStatics;

importjavax.servlet.http.HttpServletResponse;

importjava.io.IOException;

publicclassJSONResultimplementsResult{

privatestaticfinalLoglog=LogFactory.getLog(JSONResult.class);

publicvoidexecute(ActionInvocationinvocation)throwsException{

ActionContextactionContext=invocation.getInvocationContext();

HttpServletResponseresponse=(HttpServletResponse)actionContext

.get(StrutsStatics.HTTP_RESPONSE);

try{

Stringjson;

ObjectjsonObject;

//generateJSON

ValueStackstack=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(IOExceptionexception){

log.error(exception.getMessage(),exception);

throwexception;

}

}

}

struts配置如下:

  <result-types>

<result-typename="json"class="JSONResult"/>

</result-types>

<action>

<resultname="ajax"type="json"/>

</action>

action部分代码:

privateObjectjson;

publicObjectgetJson(){

returnjson;

}

publicvoidsetJson(Objectjson){

this.json=json;

    }
转载:http://www.blogjava.net/luedipiaofeng/archive/2009/05/14/270615.html

相关推荐