`

自定义result返回值(转载)

    博客分类:
  • JAVA
 
阅读更多

 

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);
     }





复制代码
 1  <interceptor-ref name="landingIct">  
 2                     <!-- 包括的方法,也就是拦截器拦截的方法<param name="includeMethods">方法1,方法2</param>      
 3                       
 4                     excludeMethods表示排除指定的方法,即不对标记为excludeMethods的方法进行拦截          
 5                     -->  
 6                     <param name="excludeMethods">landing</param>                  
 7                 </interceptor-ref>                  
 8                 <!-- 默认拦截器栈,如果不写则通过默认拦截器完成的功能将失效。如:国际化等等详细查看struts-default -->  
 9                 <!--  
10                     如果action中没有自定义的拦截器,struts2会为该action添加默认的拦截器,即defaultStack;如果action中用户自己添加了自定义拦截器,将覆盖掉系统的defaultStack,这时候需要我们显式调用该拦截器栈。 
11                  -->  

 

复制代码

抛出异常  处理,在beasAction设置 IsAjaxError  AjaxErrorMessage

给get set 方法,  

新建 AjaxExceptionInterceptor

复制代码
 public String intercept(ActionInvocation invocation)
    throws Exception
  {
    String result;
    try
    {
      result = invocation.invoke();
    }
    catch (Exception e) {
      if (this.logEnabled) {
        handleLogging(e);
      }

      List exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();
      String mappedResult = findResultFromExceptions(exceptionMappings, e);
      if (mappedResult != null) {
        result = mappedResult;
        Object action = invocation.getAction();
        if (action instanceof AjaxProvider) {
          AjaxProvider ajaxAction = (AjaxProvider)action;
          Map results = invocation.getProxy().getConfig().getResults();
          ResultConfig resultConfig = (ResultConfig)results.get(result);
          String location = (String)resultConfig.getParams().get("location");

          ajaxAtion.setIsAjaxError ("true");
          ajaxAction.setAjaxErrorMessage(location);
          result = "ajaxError";
        }
        super.publishException(invocation, new ExceptionHolder(e));
      }
      else {
        throw e;
      }
    }

    return result;
  }
复制代码

 

 

baseAction  这里判断下是否有异常,有的花转成json输出到页面

复制代码
 // 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);
            // }
复制代码

 

分享到:
评论

相关推荐

    springboot工程自定义response注解、自定义规范化返回数据结构

    本主题将深入探讨如何在Spring Boot工程中通过自定义response注解、利用Java反射机制、设置自定义拦截器以及实现WebMvcConfigurer接口来实现这一目标。 首先,我们来看自定义response注解。在Spring Boot中,可以...

    自定义注解Result实例

    本实例将深入探讨如何创建一个名为`Result`的自定义注解,并了解如何在实际应用中使用它。 首先,我们需要定义自定义注解`Result`。在Java中,自定义注解的定义通常以`@interface`关键字开始。例如: ```java ...

    Java 类自定义排序

    Java 类自定义排序 Java 中的自定义排序是指在编写 Java 程序时,通过实现 Comparable 接口来实现对对象的排序。在本节中,我们将通过一个实体类的示例来演示如何实现自定义排序。 自定义排序的必要性 在 Java ...

    result最为返回值

    然而,直接将ResultSet作为方法的返回值并不是最佳实践,原因在于ResultSet是依赖于数据库连接的。一旦Connection关闭,ResultSet也会随之关闭,可能导致数据无法正确读取。因此,为了确保数据的稳定访问,我们可以...

    result接口jar包.rar

    本篇文章将深入探讨“result接口”和相关的JAR包,以及它们在实际开发中的应用。 首先,让我们理解“result接口”。在软件工程中,接口是一种定义了特定功能的合同,它规定了类或对象必须实现的方法。Result接口很...

    【小程序云开发】本地调试和云端测试的结果不一致,返回值result为null

    1.调用云函数的时候,云函数调试时返回值不是null,但是到了前端拿到的result却是null。 2.调试云函数,本地调试和云端测试/真机测试结果不一样。表现为本地测试正常运行,云端和真机出错。 解决方法:异步操作的...

    linux shell 自定义函数方法(定义、返回值、变量作用域)

    本文将详细讲解Linux Shell自定义函数的定义、返回值处理以及变量作用域。 **一、定义自定义函数** 在Shell中定义函数有两种基本语法形式: 1. 带`function`关键字: ```bash function funname () { action; ...

    python使用threading获取线程函数返回值的实现方法

    总结起来,Python的`threading`模块虽然不直接支持获取线程函数的返回值,但通过自定义线程类和辅助方法,我们可以实现类似的功能。这种实现方式可以用于监控并行任务的状态,从而更好地控制和管理多线程程序的执行...

    sql自定义函数 sql自定义函数

    1. 当设计自定义函数时,应确保其参数和返回值的类型清晰明确,以避免类型转换错误。 2. 对于大型项目,应进行适当的功能模块化,将复杂的逻辑分解为多个小函数。 3. 在可能的情况下,优先使用已有的内置函数,因为...

    C#WinForm获取子窗口返回值

    本文将详细介绍如何在C# WinForm中实现子窗口的返回值处理以及窗口取消的处理。 首先,我们需要创建一个子窗口类。这个类通常是继承自`System.Windows.Forms.Form`的。在子窗口中,我们可以定义一些属性或者方法来...

    struts2 Result类型

    除了内置Result类型,Struts2还允许自定义Result类型,以满足更复杂的业务需求。开发者可以通过实现`com.opensymphony.xwork2.Result`接口或继承`com.opensymphony.xwork2.DefaultResult`抽象类来自定义Result类型。...

    案例八(启动带有返回值的activity

    在这里,`currentActivity`是当前启动新Activity的Activity,`TargetActivity`是我们要启动的带有返回值的Activity,`REQUEST_CODE`是一个自定义的int值,用于在onActivityResult()中区分不同的启动请求。...

    js弹窗并返回值(window.open方式)

    在描述中提到的博文链接中,作者可能详细讲解了如何使用`window.open`来创建自定义弹窗,并从弹出窗口中获取返回值。通常,我们不能直接从`window.open`的返回值获取用户在新窗口中的操作,因为返回的是一个`Window`...

    有返回值的线程

    标题中的“有返回值的线程”指的是在编程中如何在线程执行完后获取到一个结果。线程通常用于执行异步任务,而当我们需要这些任务执行的结果时,就需要用到带返回值的线程机制。Java语言中,可以通过实现`Callable`...

    WCF参数与返回值测试的示例代码

    在WCF中,参数和返回值可以是各种类型,包括基本类型、自定义对象、数组等。对于复杂类型的参数,如自定义对象,我们需要确保服务端和客户端有相同的定义。例如,如果我们有一个`Person`类,那么在服务端和客户端都...

    关于有返回值的存储过程

    返回值可以是单一的数值、记录集或者复杂的自定义类型。 1. **性能提升**:因为存储过程在首次创建时会被编译成服务器内部的执行计划,所以后续调用时无需再次编译,从而提高了执行速度。 2. **安全性增强**:存储...

    vba自定义函数大全

    这里将x和y相加的结果赋值给函数返回值。 3. **调用函数**:在VBA的其他部分,你可以像调用内置函数一样调用自定义函数。例如: ```vb Sub Test() Dim result As Integer result = AddNumbers(3, 5) MsgBox ...

    winform 链式委托的返回值源码

    在WinForm应用中,我们可能遇到这样的场景:在一个按钮的Click事件处理程序中,需要执行一系列的操作,每个操作可能有不同的返回值,我们需要根据这些返回值来决定下一步的操作。链式委托就能帮助我们实现这样的逻辑...

    vc++调用python源码(带返回值)测试

    本示例中的主题是“vc++调用python源码(带返回值)测试”,这涉及到微软的Visual C++(vc++)作为C++的IDE,如何通过交互方式调用Python脚本,并接收返回值。这种技术通常被称为语言间互操作或封装,它允许开发者利用...

    带返回值的异步委托和lambada结合

    异步委托与Lambda表达式的结合使用,能够让我们在不阻塞主线程的情况下执行耗时操作,同时还能优雅地处理返回值。本文将深入探讨如何在UI操作和线程间有效使用这种组合。 首先,异步委托是一种能够启动异步操作的...

Global site tag (gtag.js) - Google Analytics