文章出處
文章列表
以前在采用Struts2開發的項目中,對JSON的處理一直都在Action里處理的,在Action中直接Response,最近研讀了一下Struts2的源碼,發現了一個更加優雅的解決辦法,自己定義一個ResultType,
首先大家先看下Struts2中的源碼
包com.opensymphony.xwork2下的DefaultActionInvocation
472行
- /**
- * 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里面可以這樣定義
- <package name="default" namespace="/" extends="struts-default">
- <result-types>
- <result-type name="jsonResult" class="com.kiloway.struts.JsonResult"/>
- </result-types>
- <action name="student" class="com.kiloway.struts.Student">
- <result name="json" type="jsonResult"/>
- </action>
- </package>
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://blog.csdn.net/myxx520/article/details/8655088
文章列表
全站熱搜