关于webwork框架返回JSON数据格式的问题2015-10-27

来源:互联网 发布:淘宝网皮书包 编辑:程序博客网 时间:2024/06/07 02:20

最近接触到webwork框架,因为项目需求,需要将后台的数据采用json格式返回。


通过百度搜索,找到的方法也很多,但都讲得不够具体,不容易看懂。这里找到一个方法,写了一个返回json的类继承Result(http://www.thinksaas.cn/group/topic/329708/),觉得这种方法不错。具体代码如下:

JSONResult.java

package com.web.action;import com.opensymphony.xwork.ActionInvocation;import com.opensymphony.xwork.Result;import java.io.OutputStream;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import javax.servlet.http.HttpServletResponse;import java.lang.reflect.Field;import com.opensymphony.webwork.ServletActionContext;import com.opensymphony.xwork.ActionContext;import org.json.JSONObject;public class JSONResult implements Result {private static final Log LOG = LogFactory.getLog(JSONResult.class);// action中的json对象的名词private String jsonObjectProperty = "jsonObject";private String contentType = "application/json";private String encoding = "utf-8";@Overridepublic void execute(ActionInvocation invocation) throws Exception {// TODO Auto-generated method stubif (LOG.isDebugEnabled()) {LOG.debug("executing JSONResult");}// 通过xwork的invocation从webwork的action中获得JSONObject对象JSONObject jsonObject = getJSONObject(invocation);if (jsonObject != null) {String json = jsonObject.toString();HttpServletResponse response = getServletResponse(invocation);response.setContentType(getContentType());// encodingbyte[] bs = json.getBytes(this.encoding);response.setContentLength(bs.length);OutputStream os = response.getOutputStream();os.write(bs);os.flush();if (LOG.isDebugEnabled()) {LOG.debug("written [" + json+ "] to HttpServletResponse outputstream");}}}protected JSONObject getJSONObject(ActionInvocation invocation)throws Exception {ActionContext actionContext = invocation.getInvocationContext();// 从xwork配置中获得JSON对象名词Object obj = actionContext.getValueStack().findValue(jsonObjectProperty);if (obj == null) {LOG.error("property [" + jsonObjectProperty+ "] returns null, please check xwork.xml file");return null;}// 如果Action中的对象是JSONObject,那么就不需要反射动态转换为JSONObject// 如果Action中的对象就是POJO,那么这里自动组装JSONObjectif (!JSONObject.class.isInstance(obj)) {LOG.debug("build json object by reflection.");JSONObject jsonObj = new JSONObject();for (Field field : obj.getClass().getDeclaredFields()) {String getter = "get"+ Character.toUpperCase(field.getName().charAt(0))+ field.getName().substring(1);jsonObj.append(field.getName(), obj.getClass().getDeclaredMethod(getter).invoke(obj));}return jsonObj;}return (JSONObject) obj;}protected HttpServletResponse getServletResponse(ActionInvocation invocation) {return (HttpServletResponse) invocation.getInvocationContext().getContextMap().get(ServletActionContext.HTTP_RESPONSE);}public void setEncoding(String encoding) {this.encoding = encoding;}public String getEncoding() {return encoding;}public void setJsonObjectProperty(String jsonObjectProperty) {this.jsonObjectProperty = jsonObjectProperty;}public String getJsonObjectProperty() {return jsonObjectProperty;}public void setContentType(String contentType) {this.contentType = contentType;}public String getContentType() {return contentType;}}

Action类:JSONAction.java

package com.web.action;import org.json.JSONObject;import com.opensymphony.xwork.Action;import com.persistence.model.SysStation;public class JSONAction implements Action {private SysStation sysStation;//这是一个实体映射,映射实体方法这里不再讲述public SysStation getSysStation() {return sysStation;}public void setSysStation(SysStation sysStation) {this.sysStation = sysStation;}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubsysStation = new SysStation();sysStation.setCity("江苏");sysStation.setMobile("123456");return Action.SUCCESS;}}

配置xwork.xml文件

<result-types><result-type name="json" class="com.web.action.JSONResult" /></result-types>


<action name="jsonTest" class="com.web.action.JSONAction"><result name="success" type="json">       <param name="jsonObjectProperty">sysStation</param></result></action>

这里需要注意,如果action配置节较多的情况下,result-types需要放在package下面,注意配置节的顺序如下,否则出现报错:

package里元素必须按照一定的顺序排列:


result-types
interceptors
default-interceptor-ref
default-action-ref
default-class-ref
global-results
global-exception-mappings
action*(所有action放到最后)


接下来,重启服务,就应该可以直接用地址访问json数据


关于json数据,还需要注意一个问题就是json与jsonp的区别,获取json数据不能跨域,而jsonp则可以,具体说明可以百度了解。







0 0
原创粉丝点击