Struts2自定義Result處置JSON

曾經在選用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
相關文章
相關標籤/搜索