zoukankan      html  css  js  c++  java
  • Struts2自定义Result处理JSON

    以前在采用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

  • 相关阅读:
    How To Verify TLS Options in Windows
    How to auto-generate a C# class file from a JSON string [closed]
    javascript-questions
    What is the difference between application server and web server?
    Manjaro Rust环境搭建
    Trojan
    50 年的软件开发经验带给我的 63 个启示
    对《GGX》shader的分析-卡通渲染-罪恶装备
    科学迷信
    Tokio,Rust异步编程实践之路
  • 原文地址:https://www.cnblogs.com/azhqiang/p/4676048.html
Copyright © 2011-2022 走看看