Struts2 自定义Result

注意:我只要是解决自定义返回Json 和异常处理问题

新建一个类 AjaxResult   继承 StrutsResultSupport 看看代码吧

public class AjaxResult extends StrutsResultSupport {
    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 1L;
    private static final String AJAX_SUCCESS = "{\"success\":true}";
    private static final String SUCCESS_PERFIX = "{\"success\":true,result:[";
    private static final String FAILURE_PERFIX = "{\"success\":false,result:[],";
    private static final String SUFFIX = "]}";
    private Writer writer;
    private String defaultEncoding = "UTF-8";

    @Inject("struts.i18n.encoding")
    public void setDefaultEncoding(String encoding) {
        this.defaultEncoding = encoding;
    }

    protected void doExecute(String finalLocation, ActionInvocation invocation)
            throws Exception {
        Object action = invocation.getAction();
        String responseData = "";
        if ((action instanceof BaseAction)) {
            BaseAction ajaxAction = (BaseAction) action;
            HttpServletResponse response = ServletActionContext.getResponse();
            String encoding = getEncoding(finalLocation);
            String contentType = getContentType(finalLocation);
            if (encoding != null) {
                contentType = contentType + ";charset=" + encoding;
            }
            response.setContentType(contentType);
            String successData = ajaxAction.getResponseData();
            if (successData != null) {
                if ("success".equals(successData)) {
                    responseData = "{\"success\":true}";
                } else {
                    responseData = successData;
                }

            }
            // if(true){
            // String errorResultLocation = ajaxAction.getErrorResultLocation();
            // String exceptionMessage =
            // invocation.getStack().findString("exception.message");
            // exceptionMessage = exceptionMessage.replaceAll("\r", " ");
            // exceptionMessage = exceptionMessage.replaceAll("\n", " ");
            // exceptionMessage = exceptionMessage.replaceAll("\t", " ");
            // responseData = getFailureData(null, exceptionMessage);
            // }
            getWriter().write(responseData);
        }
    }

    private String getFailureData(String errorResultLocation,
            String exceptionMessage) {
        String errors = "errors:[{msg:\"" + exceptionMessage + "\"}]";
        // if (StringUtils.isNotBlank(errorResultLocation)) {
        // String target = ",\"target\":\"" + errorResultLocation;
        // return "{\"success\":false,result:[]," + errors + target + "\"}";
        // }

        return "{\"success\":false,result:[]," + errors + "}";
    }

    public void setWriter(Writer writer) {
        this.writer = writer;
    }

    protected Writer getWriter() throws IOException {
        if (this.writer != null) {
            return this.writer;
        }
        return ServletActionContext.getResponse().getWriter();
    }

    protected String getContentType(String templateLocation) {
        return "application/json";
    }

    protected String getEncoding(String templateLocation) {
        String encoding = this.defaultEncoding;
        if (encoding == null) {
            encoding = System.getProperty("file.encoding");
        }
        if (encoding == null) {
            encoding = "UTF-8";
        }
        return encoding;
    }
}

 

接下来,我们需要一个Struts 的配置文件

<package name="ajax-default" abstract="true" extends="struts-default">
        <result-types>
            <result-type name="ajax"
                class="com.guy.core.common.util.AjaxResult" />
        </result-types>
        <global-results>
            <result name="ajax" type="ajax" />
        </global-results>

    </package>

之后我们新建一个公用类  BaseAction

public class BaseAction extends ActionSupport implements ModelDriven,SessionAware, ParameterAware, ServletRequestAware, ServletResponseAware{
        /**
     * serialVersionUID
     */
    protected final Log logger = LogFactory.getLog(getClass());
    private static final long serialVersionUID = 1L;
    public String SUCCESS="SUCCESS";
    public static final String AJAX = "ajax";
    protected Map session;
    protected Map parameters;
    protected HttpServletRequest servletRequest;
    protected HttpServletResponse servletResponse;
    private String responseData;
    protected void createJSonData(String jsonData) {
        setResponseData(jsonData);
    }
    public String getResponseData() {
        return responseData;
    }
    public void setResponseData(String responseData) {
        this.responseData = responseData;
    }
    public Map getSession() {
        return session;
    }
    public void setSession(Map session) {
        this.session = session;
    }
    public Map getParameters() {
        return parameters;
    }
    public void setParameters(Map parameters) {
        this.parameters = parameters;
    }
    public HttpServletRequest getServletRequest() {
        return servletRequest;
    }
    public void setServletRequest(HttpServletRequest servletRequest) {
        this.servletRequest = servletRequest;
    }
    public HttpServletResponse getServletResponse() {
        return servletResponse;
    }
    public void setServletResponse(HttpServletResponse servletResponse) {
        this.servletResponse = servletResponse;
    }
    @Override
    public Object getModel() {
        return null;
    }

}

所有的action 都继承BaseAction   ModelDriven 我就不在解释了百度去

例如 

public class LoginAction extends BaseAction{
 

createJSonData("{\"success\":false,\"msg\":\"密码错误。\"}");

return AJAX;

 

 

这样我们的  BaseAction  就完事了,

对象ToString 转成 json 格式了,方便查看

@Override
     public String toString() {
          return ToStringBuilder.reflectionToString(this);
     }
时间: 2024-12-19 14:55:04

Struts2 自定义Result的相关文章

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 cu

Struts2自定义拦截器Interceptor以及拦截器登录实例

1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor{ private static final long serialVersionUID = 1L; public void destroy() { } public void init() {} public String intercept(ActionInvocation arg0) throws

struts2自定义转换器

Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用date类型是可以接收到的,但是如果传的是20101112这样类型的字符串,用date类型是获取不到,并且会出现错误的,struts2提供了一种类型转换器供我们使用. 以下为局部类型转换器的开发步骤 a.首先要写一个类来继承StrutsTypeConverter b.然后覆盖convertFromSt

Struts2 配置文件result的name属性和type属性

Struts2 配置文件result的name属性和type属性:Name属性SUCCESS:Action正确的执行完成,返回相应的视图,success是 name属性的默认值: NONE:表示Action正确的执行完成,但并不返回任何视图: ERROR:表示Action执行失败,返回到 错误处理视图: INPUT:Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数输入的界面,一般在应用中,会对这些参数进 行验证,如果验证没有通过,将自动返回到该视图: LOGIN:Actio

struts2 自定义拦截,防止非法操作

<package name="defaults" extends="struts-default"> <interceptors> <interceptor name="login" class="com.zqgame.interceptor.CheckLoginInterceptor" /> <interceptor-stack name="myinterceptor&qu

Struts2自定义类型转换,和处理类型转换错误

Struts2自定义类型转换: 从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自己的转换器: 例: 我有一个Point类型: package cn.jnit.bean; public class Point { private Integer x; private Integer y; public Point() { } public Point(Integer x, Int

struts2 自定义表单

自定义表单一定会涉及<s:iterator/>迭代,一个复杂的自定义表单可能会嵌套n多层迭代. 比如一个自定义一个问卷调查页面涉及3个模型:一个Survey代表一个调查,一个Page代表一个页面,一个Question代表一个问题.每个问题中会包含不同的表单元素,就会涉及迭代. 3个模型类如下: Survey package com.atguigu.surveypark.model; import java.util.Date; import java.util.HashSet; import

Struts2 自定义类型转换器

Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性 用date类型是可以接收到的,但是如果传的是20101112这样类型的字符串,用date类型是获取不到,并且会出现错误的,struts2提供了一 种类型转换器供我们使用. 以下为局部类型转换器的开发步骤a.首先要写一个类来继承DefaultTypeConverterb.然后覆盖convertValue

struts2 自定义tag标签

在项目中可能有很多相同的jsp页面表示功能,这时可以使用自定义的tag进行定义,渐少重复的工作量便于日后维护! 下面就基于struts2进行自定义标签的定义与实现: 首先:自定义类MyTag继承struts2的Component package cookielogin; import java.io.IOException; import java.io.Writer; import org.apache.struts2.components.Component; import com.open