曾經在選用Struts2開發的項目中,對JSON的處置一貫都在Action裏處置的,在Action中直接Response,比來研讀了一下Struts2的源碼,發現了一個越發高雅的解決辦法,我的界說一個ResultType, 首要我們先看下Struts2中的源碼 包com.opensymphony.xwork2下的DefaultActionInvocation 472行 /** * http://www.star1111.info/linked/20130309.do Save the result to be used later. * @param actionConfig current ActionConfig * @param methodResult the result of the action. * @return the result code to process. */ protected String saveResult(ActionConfig actionConfig, Object methodResult) { if (methodResult instanceof Result) { this.explicitResult = (Result) methodResult; // Wire the result automatically container.inject(explicitResult); return null; } else { return (String) methodResult; } } 如果resultType完成了Result接口,則履行 this.explicitResult = (Result) methodResult; // Wire the result automatically container.inject(explicitResult); return null; 現在我們來界說一個接口(JsonResult)來處置一般的POJO目標 package com.kiloway.struts; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import org.apache.struts2.ServletActionContext; import org.apache.struts2.dispatcher.StrutsResultSupport; import com.opensymphony.xwork2.ActionInvocation; public class JsonResult extends StrutsResultSupport { private Object result; private JsonConfig jsonConfig; public Object getResult() { return result; } public JsonResult(JsonConfig jsonConfig) { super(); this.jsonConfig = jsonConfig; } public void setResult(Object result) { this.result = result; } private static final long serialVersionUID = 7978145882434289002L; @Override protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { HttpServletResponse response = null; try { response = ServletActionContext.getResponse(); PrintWriter printWriter = response.getWriter(); if (jsonConfig != null) { printWriter.write(JSONObject.fromObject(result).toString()); } else { printWriter.write(JSONObject.fromObject(result, jsonConfig) .toString()); } }catch(Exception e){ throw new Exception("json parse error!"); } finally { response.getWriter().close(); } } } JsonReulst界說好了該怎麼讓Struts處置呢? 我們在struts.xml裏邊可以這樣界說 reuslt的name可以恣意,但type有必要和你註冊的ResultType同樣。 Action 中直接這樣調用 public JsonResult getJson() { UserInfo f = new UserInfo(); f.setName("小睿睿"); f.setPassword("哈哈"); JsonResult jsonResult = new JsonResult(); jsonResult.setResult(f); return jsonResult; } 在我們的Action代碼中就沒必要response.write了,完全交給了Reuslt目標去向置了(doExecute) 這樣就很便利的處置了JSON格局的數據 在我下載的最新的struts的開發包裏,發現了一個JSON處置插件 struts2-json-plugin-2.3.8.jar 該插件供給了更完善的JSON處置解決方案,下篇文章會分析該插件的運用方法 http://www.haofapiao.com/linked/20130309.do