`

struts配置全局的错误处理页面

 
阅读更多
首先struts文件里面配置如下:
package name="default" extends="struts-default">
<interceptors>
<interceptor name="exceptionInterceptor"
class="com.aicaipiao.admin.interceptor.ExceptionInterceptor" />
<interceptor-stack name="adminCompleteStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="exceptionInterceptor" />
</interceptor-stack>
</interceptors>

<default-interceptor-ref name="adminCompleteStack" />
<global-results>
<result name="index">/index.jsp</result>
<result name="login">/login.jsp</result>
<result name="failure">/public/error.jsp</result>
<result name="message">/public/message.jsp</result>
</global-results>

<global-exception-mappings>
<exception-mapping exception="com.aicaipiao.common.service.exception.BusinessException"
result="failure" />
<exception-mapping exception="java.lang.Exception"
result="failure" />
</global-exception-mappings>
 
</package>


然后是java类:

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.*.admin.action.BaseAction;
import com.aicaipiao.common.service.exception.BusinessException;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.config.entities.ExceptionMappingConfig;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.interceptor.ExceptionHolder;

public class ExceptionInterceptor extends AbstractInterceptor {

    private static final long serialVersionUID = 2888326289382964802L;

    private transient final Logger logger = LoggerFactory.getLogger(this.getClass());

    protected Logger categoryLogger;
    protected boolean logEnabled = false;
    protected String logCategory;
    protected String logLevel;

    public boolean isLogEnabled() {
        return logEnabled;
    }

    public void setLogEnabled(boolean logEnabled) {
        this.logEnabled = logEnabled;
    }

    public String getLogCategory() {
        return logCategory;
    }

    public void setLogCategory(String logCatgory) {
        this.logCategory = logCatgory;
    }

    public String getLogLevel() {
        return logLevel;
    }

    public void setLogLevel(String logLevel) {
        this.logLevel = logLevel;
    }

    @SuppressWarnings("rawtypes")
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        String result;
        BaseAction action = (BaseAction) invocation.getAction(); //执行Action类
        try {
            result = invocation.invoke();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            if (e instanceof BusinessException) {

                action.addActionMessage(((BusinessException) e).getErrorCode().getMsg());
            } else {
                action.addActionMessage("系统错误,请联系系统管理员。");
            }
            List<ExceptionMappingConfig> exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();
            String mappedResult = this.findResultFromExceptions(exceptionMappings, e);
            if (mappedResult != null) {
                result = mappedResult;
                publishException(invocation, new ExceptionHolder(e));
            } else {
                throw e;
            }
        }

        return result;
    }

    /**
     * Handles the logging of the exception.
     * 
     * @param e  the exception to log.
     */
    protected void handleLogging(Exception e) {
        if (logCategory != null) {
            if (categoryLogger == null) {
                // init category logger
                categoryLogger = LoggerFactory.getLogger(logCategory);
            }
            doLog(categoryLogger, e);
        } else {
            doLog(logger, e);
        }
    }

    /**
     * Performs the actual logging.
     * 
     * @param logger  the provided logger to use.
     * @param e  the exception to log.
     */
    protected void doLog(Logger logger, Exception e) {
        if (logLevel == null) {
            logger.debug(e.getMessage(), e);
            return;
        }

        if ("trace".equalsIgnoreCase(logLevel)) {
            logger.trace(e.getMessage(), e);
        } else if ("debug".equalsIgnoreCase(logLevel)) {
            logger.debug(e.getMessage(), e);
        } else if ("info".equalsIgnoreCase(logLevel)) {
            logger.info(e.getMessage(), e);
        } else if ("warn".equalsIgnoreCase(logLevel)) {
            logger.warn(e.getMessage(), e);
        } else if ("error".equalsIgnoreCase(logLevel)) {
            logger.error(e.getMessage(), e);
        } else if ("fatal".equalsIgnoreCase(logLevel)) {
            logger.error(e.getMessage(), e);
        } else {
            throw new IllegalArgumentException("LogLevel [" + logLevel + "] is not supported");
        }
    }

    protected String findResultFromExceptions(List<ExceptionMappingConfig> exceptionMappings, Throwable t) {
        String result = null;

        // Check for specific exception mappings.
        if (exceptionMappings != null) {
            int deepest = Integer.MAX_VALUE;
            for (Object exceptionMapping : exceptionMappings) {
                ExceptionMappingConfig exceptionMappingConfig = (ExceptionMappingConfig) exceptionMapping;
                int depth = getDepth(exceptionMappingConfig.getExceptionClassName(), t);
                if (depth >= 0 && depth < deepest) {
                    deepest = depth;
                    result = exceptionMappingConfig.getResult();
                }
            }
        }

        return result;
    }

    /**
     * Return the depth to the superclass matching. 0 means ex matches exactly. Returns -1 if there's no match.
     * Otherwise, returns depth. Lowest depth wins.
     *
     * @param exceptionMapping  the mapping classname
     * @param t  the cause
     * @return the depth, if not found -1 is returned.
     */
    public int getDepth(String exceptionMapping, Throwable t) {
        return getDepth(exceptionMapping, t.getClass(), 0);
    }

    private int getDepth(String exceptionMapping, Class exceptionClass, int depth) {
        if (exceptionClass.getName().contains(exceptionMapping)) {
            // Found it!
            return depth;
        }
        // If we've gone as far as we can go and haven't found it...
        if (exceptionClass.equals(Throwable.class)) {
            return -1;
        }
        return getDepth(exceptionMapping, exceptionClass.getSuperclass(), depth + 1);
    }

    /**
     * Default implementation to handle ExceptionHolder publishing. Pushes given ExceptionHolder on the stack.
     * Subclasses may override this to customize publishing.
     *
     * @param invocation The invocation to publish Exception for.
     * @param exceptionHolder The exceptionHolder wrapping the Exception to publish.
     */
    protected void publishException(ActionInvocation invocation, ExceptionHolder exceptionHolder) {
        invocation.getStack().push(exceptionHolder);
    }
}


然后是自定义的异常处理类:



/**
 * 统一的业务异常超类
 *
 * Copyright (C) 2010-2012 www.2caipiao.com Inc. All rights reserved.
 */
public abstract class BusinessException extends RuntimeException {

    private static final long serialVersionUID = -7673793242894704838L;

    protected ErrorCode code;

    public BusinessException(String message) {
    	super(message);
        this.code = new ErrorCode(BetErrorTable.BUSINESS_COMMON_ERROR,message);
    }

    public BusinessException(ErrorCode code) {
        super(code.getMsg());
        this.code = code;
    }
    public BusinessException(ErrorCode code,Throwable cause) {
        super(code.getMsg(),cause);
        this.code = code;
    }

    /**
     * 根据一个异常编码来获取异常描述
     * @return
     * @create_time Nov 25, 2010 7:16:47 PM
     */
    public abstract ErrorCode getErrorCode();

}


自定义的异常码类:

import java.io.Serializable;

/**
 * 错误代码类
 * 
 * */
public class ErrorCode implements Serializable {

    private static final long serialVersionUID = -2892956957010575101L;

    /**错误代码**/
    public String code;

    /**错误代码对应消息**/
    public String msg;

    public String getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

 
    public ErrorCode(String code, String msg) {
        this.msg = msg;
        this.code = code;
    }

}


分享到:
评论

相关推荐

    struts错误处理机制小例子

    例如,可以为所有类型的Exception配置一个通用的错误处理页面。 3. **ActionMapping的errorKey属性**:在配置Action时,可以通过errorKey属性指定当该Action执行失败时,要显示的错误信息。这些错误信息可以在JSP...

    struts2 全局结果集

    1. **配置全局结果集**: 在`struts.xml`中,你可以创建一个`&lt;global-results&gt;`节点来定义全局结果。例如,你可以设置一个默认的错误页面或者成功页面。下面是一个简单的示例: ```xml &lt;struts&gt; ...

    Struts2 配置通配符和错误页面

    总之,熟练掌握Struts2的通配符配置和错误处理能够使你的应用更加健壮,代码更加简洁。这不仅能提高开发效率,还能为用户提供更友好的错误提示和体验。在实际项目中,灵活运用这些技术,可以提升应用的可维护性和...

    struts2国际化 标签 页面 处理类

    在Struts2中实现国际化,主要包括配置、JSP页面、表单和Action类的处理。 首先,在`struts.xml`配置文件中,我们需要声明全局的国际化资源文件。通过设置常量`struts.custom.i18n.resources`的值为`message`,我们...

    Struts 友好错误提示

    在Struts 1中,我们通常会在struts-config.xml文件中配置全局的`&lt;global-exceptions&gt;`元素,为特定的异常定义处理页面。例如: ```xml ``` 这段代码表示,如果任何地方抛出未捕获的异常,Struts会将控制权交给...

    Struts2之异常处理案例struts003

    在Struts2中,异常处理是一项重要的功能,它确保在应用程序遇到错误时能够优雅地处理,提供友好的用户反馈,并保持系统稳定性。下面将详细讨论Struts2中的异常处理机制及其相关知识点。 1. **异常处理机制概述** ...

    struts 配置

    4. `&lt;error-page&gt;`:配置错误处理页面,例如404和505错误,将用户重定向到定制的错误提示页面。 5. `&lt;taglib&gt;`:定义TLD(Tag Library Descriptor)文件的位置,这些文件描述了Struts的JSP标签库,如`struts-...

    struts2 全局异常提示定义属性文件使用

    在Struts2中,处理程序方法可能会抛出各种异常,为了提供统一的错误处理和用户友好的异常提示,我们可以定义全局异常提示。这篇博文主要探讨的是如何在Struts2中设置和使用全局异常提示属性文件。 首先,我们要理解...

    Struts错误处理

    2. **struts-config.xml配置**:开发者可以在struts-config.xml配置文件中定义全局和特定Action的错误处理策略。通过`&lt;global-exceptions&gt;`和`&lt;global-validators&gt;`元素,可以指定全局异常处理和表单验证规则。 3. ...

    Struts配置及标签库详解

    例如,`&lt;html:form&gt;`标签可以自动绑定到一个特定的ActionForm,而`&lt;html:errors&gt;`则可以显示全局或字段级的错误信息。 在实际应用中,Struts还支持自定义标签库,开发者可以根据项目需求扩展功能,提高代码复用性。...

    Struts1配置详解

    全局异常处理使得开发者能够统一处理程序中抛出的异常,提高错误处理的灵活性和可读性。`&lt;global-exceptions&gt;`元素下通过`&lt;exception&gt;`子元素配置异常处理策略,包括异常类型、转发路径、作用域等。 ### 5. 全局...

    Struts配置文件详解.

    Struts配置文件是Struts框架的核心组成部分,它定义了应用程序的行为和组件间的交互方式。配置文件基于XML格式,使得开发者可以灵活地配置ActionForm、Action、Forward等元素,以实现业务逻辑与视图的分离,增强应用...

    过滤器 Struts2全局变量 action转化do

    例如,全局错误页面或登录重定向可以作为全局结果设置,当任何Action执行失败时,都会跳转到这些结果。 6. **FilterDispatcher配置**:在web.xml中,你需要配置FilterDispatcher(或StrutsPrepareAndExecuteFilter...

    Struts2异常处理机制

    Struts2作为一款流行的Java Web框架,其异常处理机制是其核心功能之一,它使得开发者能够优雅地管理和处理应用程序中的异常情况,提供了一种统一的错误处理方式,从而提高用户体验并增强程序的健壮性。 在Struts2...

    Struts配置文件详解

    3. 通过`&lt;servlet&gt;`内的`&lt;init-param&gt;`子元素设置ActionServlet的初始化参数,如`param-name="config"`和`param-value="/WEB-INF/struts-config.xml"`,指明Struts配置文件的位置。 此外,`web.xml`还允许配置欢迎...

    struts2中异常处理(demo)

    例如,使用`fieldErrors`和`actionErrors`集合可以显示表单验证错误和全局错误信息。 6. **日志记录**:在处理异常时,记录详细的错误日志对调试和问题排查至关重要。Struts2可以通过集成日志框架,如Log4j或Java...

    struts1.3页面跳转问题

    Struts1.3是一个经典的Java Web框架,用于构建企业级应用程序。在Struts1.3中,页面跳转是常见...在实际项目中,根据业务需求灵活选择请求转发或重定向,同时注意数据传递和错误处理,将有助于提升用户体验和代码质量。

    struts2错误显示

    1. **全局错误信息显示**:在页面的特定区域集中显示所有验证错误信息。 - **示例代码**: ```xml &lt;s:fielderror cssStyle="color:red"&gt;&lt;/s:fielderror&gt; ``` - **显示效果**:所有错误信息以列表形式呈现,通常...

    Struts1异常处理

    2. **Struts-config.xml配置异常处理**:在框架配置文件中,`&lt;global-exceptions&gt;`标签用于定义全局异常处理规则。例如: ```xml ``` 这段配置表示,如果任何地方抛出了`java.lang.Exception`或其子类,...

    struts配置文件详细说明

    5. **错误处理:** 通过`&lt;error-page&gt;`元素,可以定义Web应用的错误处理策略。`&lt;error-code&gt;`指定错误代码,如404表示“Not Found”,`&lt;location&gt;`指定处理错误的JSP页面。同时,`&lt;exception-type&gt;`可以用于指定异常...

Global site tag (gtag.js) - Google Analytics