首先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;
}
}
分享到:
相关推荐
例如,可以为所有类型的Exception配置一个通用的错误处理页面。 3. **ActionMapping的errorKey属性**:在配置Action时,可以通过errorKey属性指定当该Action执行失败时,要显示的错误信息。这些错误信息可以在JSP...
1. **配置全局结果集**: 在`struts.xml`中,你可以创建一个`<global-results>`节点来定义全局结果。例如,你可以设置一个默认的错误页面或者成功页面。下面是一个简单的示例: ```xml <struts> ...
总之,熟练掌握Struts2的通配符配置和错误处理能够使你的应用更加健壮,代码更加简洁。这不仅能提高开发效率,还能为用户提供更友好的错误提示和体验。在实际项目中,灵活运用这些技术,可以提升应用的可维护性和...
在Struts2中实现国际化,主要包括配置、JSP页面、表单和Action类的处理。 首先,在`struts.xml`配置文件中,我们需要声明全局的国际化资源文件。通过设置常量`struts.custom.i18n.resources`的值为`message`,我们...
在Struts 1中,我们通常会在struts-config.xml文件中配置全局的`<global-exceptions>`元素,为特定的异常定义处理页面。例如: ```xml ``` 这段代码表示,如果任何地方抛出未捕获的异常,Struts会将控制权交给...
在Struts2中,异常处理是一项重要的功能,它确保在应用程序遇到错误时能够优雅地处理,提供友好的用户反馈,并保持系统稳定性。下面将详细讨论Struts2中的异常处理机制及其相关知识点。 1. **异常处理机制概述** ...
4. `<error-page>`:配置错误处理页面,例如404和505错误,将用户重定向到定制的错误提示页面。 5. `<taglib>`:定义TLD(Tag Library Descriptor)文件的位置,这些文件描述了Struts的JSP标签库,如`struts-...
在Struts2中,处理程序方法可能会抛出各种异常,为了提供统一的错误处理和用户友好的异常提示,我们可以定义全局异常提示。这篇博文主要探讨的是如何在Struts2中设置和使用全局异常提示属性文件。 首先,我们要理解...
2. **struts-config.xml配置**:开发者可以在struts-config.xml配置文件中定义全局和特定Action的错误处理策略。通过`<global-exceptions>`和`<global-validators>`元素,可以指定全局异常处理和表单验证规则。 3. ...
例如,`<html:form>`标签可以自动绑定到一个特定的ActionForm,而`<html:errors>`则可以显示全局或字段级的错误信息。 在实际应用中,Struts还支持自定义标签库,开发者可以根据项目需求扩展功能,提高代码复用性。...
全局异常处理使得开发者能够统一处理程序中抛出的异常,提高错误处理的灵活性和可读性。`<global-exceptions>`元素下通过`<exception>`子元素配置异常处理策略,包括异常类型、转发路径、作用域等。 ### 5. 全局...
Struts配置文件是Struts框架的核心组成部分,它定义了应用程序的行为和组件间的交互方式。配置文件基于XML格式,使得开发者可以灵活地配置ActionForm、Action、Forward等元素,以实现业务逻辑与视图的分离,增强应用...
例如,全局错误页面或登录重定向可以作为全局结果设置,当任何Action执行失败时,都会跳转到这些结果。 6. **FilterDispatcher配置**:在web.xml中,你需要配置FilterDispatcher(或StrutsPrepareAndExecuteFilter...
Struts2作为一款流行的Java Web框架,其异常处理机制是其核心功能之一,它使得开发者能够优雅地管理和处理应用程序中的异常情况,提供了一种统一的错误处理方式,从而提高用户体验并增强程序的健壮性。 在Struts2...
3. 通过`<servlet>`内的`<init-param>`子元素设置ActionServlet的初始化参数,如`param-name="config"`和`param-value="/WEB-INF/struts-config.xml"`,指明Struts配置文件的位置。 此外,`web.xml`还允许配置欢迎...
例如,使用`fieldErrors`和`actionErrors`集合可以显示表单验证错误和全局错误信息。 6. **日志记录**:在处理异常时,记录详细的错误日志对调试和问题排查至关重要。Struts2可以通过集成日志框架,如Log4j或Java...
Struts1.3是一个经典的Java Web框架,用于构建企业级应用程序。在Struts1.3中,页面跳转是常见...在实际项目中,根据业务需求灵活选择请求转发或重定向,同时注意数据传递和错误处理,将有助于提升用户体验和代码质量。
1. **全局错误信息显示**:在页面的特定区域集中显示所有验证错误信息。 - **示例代码**: ```xml <s:fielderror cssStyle="color:red"></s:fielderror> ``` - **显示效果**:所有错误信息以列表形式呈现,通常...
2. **Struts-config.xml配置异常处理**:在框架配置文件中,`<global-exceptions>`标签用于定义全局异常处理规则。例如: ```xml ``` 这段配置表示,如果任何地方抛出了`java.lang.Exception`或其子类,...
5. **错误处理:** 通过`<error-page>`元素,可以定义Web应用的错误处理策略。`<error-code>`指定错误代码,如404表示“Not Found”,`<location>`指定处理错误的JSP页面。同时,`<exception-type>`可以用于指定异常...