`
floger
  • 浏览: 213462 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2的异常处理机制:

阅读更多

Struts2的异常处理机制: 

任何成熟的MVC框架都应该提供成就的异常处理机制。Strut2也不例外。Struts2提供了一种声明式的异常处理方式。Struts2也是通过配置的拦截器来实现异常处理机制的。 

Struts2的异常处理机制通过在struts.xml文件中配置﹤exception-mapping …﹥元素完成的,配置该元素时,需要指定两个属性: 

exception:此属性指定该异常映射所设置的异常类型。 

result:此属性指定Action出现该异常时,系统转入result属性所指向的结果。 


  异常映射也分为两种: 

局部异常映射:﹤exception-mapping…﹥元素作为﹤action…﹥元素的子元素配置。 

全局异常映射:﹤exception-mapping…﹥元素作为﹤global-exception-mappings﹥元素的子元素配置。 


   输出异常信息: 

使用Struts2的标签来输出异常信息: 

﹤s:property value="exception.message"/﹥:输出异常对象本身。 

﹤s:property value="exceptionStack"/﹥: 输出异常堆栈信息。 
利用struts2的异常处理机制和拦截器机制可以很方便的实现异常处理功能,你不再需要在Action中捕获异常,并抛出相关的异常了,这些都交给拦截器来帮你做了。 

1.  在 struts.xml 文件中,声明全局异常映射,以及对应的全局异常转发如下所示:<interceptors> 
<interceptor name="exceptionManager" class="com.ufinity.lansin.admin.web.interceptor.ExceptionInterceptor"/> 
<interceptor-stack name="commonInterceptor"> 
<interceptor-ref name="exception" /> 
</interceptor-stack> 
</interceptors> 

<global-results> 
<result name="EXCEP_ERROR">/WEB-INF/templates/errorpage/Error.ftl</result> 
</global-results> 
<global-exception-mappings> 
<exception-mapping result="EXCEP_ERROR" exception="com.ufinity.lansin.exceptions.SystemException" /> 
</global-exception-mappings> 

2.SystemException是异常处理类,代码如下所示: 
public class SystemException extends RuntimeException { 
private static final long serialVersionUID = 1L; 

public SystemException(String frdMessage) { 
super(createFriendlyErrMsg(frdMessage)); 
} 

public SystemException(Throwable throwable) { 
super(throwable); 
} 

public SystemException(Throwable throwable, String frdMessage) 

{ 
super(throwable); 
} 

private static String createFriendlyErrMsg(String msgBody) { 
String prefixStr = "抱歉,"; 
String suffixStr = " 请稍后再试或与管理员联系!"; 
StringBuffer friendlyErrMsg = new StringBuffer(""); 
friendlyErrMsg.append(prefixStr); 
friendlyErrMsg.append(msgBody); 
friendlyErrMsg.append(suffixStr); 
return friendlyErrMsg.toString(); 
} 

} 


3.WEB-INF/templates/errorpage/Error.ftl页面 
这个页面很简单: 

﹤body﹥ 

﹤h2﹥ 

         出现异常啦 

﹤/h2﹥ 

﹤hr/﹥ 

   ﹤h3 style="color:red"﹥ 

   ﹤!-- 获得异常对象 --﹥ 

   

    ${exception.message?default("")} 

    ﹤/h3﹥ 

    ﹤br/﹥ 

    ﹤!-- 异常堆栈信息(开发人员用) --﹥ 

    ﹤div style="display:none;"﹥ 

       ${exceptionStack?default("")} 

    ﹤/div﹥ 

﹤/body﹥ 

4. 在拦截器中,捕获常见的异常,并以友好异常信息抛出,相关代码如下所示: 

public class ExceptionInterceptor extends AbstractInterceptor { 
private static final long serialVersionUID = 1L; 

@Override 
public String intercept(ActionInvocation invocation) throws Exception { 
String result = ""; 
try { 
result = invocation.invoke(); 
} 
catch (NoRightException ex) { 
throw new SystemException("没有权限操作,"); 
} 
catch (DataAccessException ex) { 
throw new SystemException("数据库操作失败,"); 
} 
catch (NullPointerException ex) { 
throw new SystemException("调用了未经初始化的对象或者是不存在的对象,"); 
} 
catch (IOException ex) { 
throw new SystemException("IO异常,"); 
} 
catch (ClassNotFoundException ex) { 
throw new SystemException("指定的类不存在,"); 
} 
catch (ArithmeticException ex) { 
throw new SystemException("数学运算异常,"); 
} 
catch (ArrayIndexOutOfBoundsException ex) { 
throw new SystemException("数组下标越界,"); 
} 
catch (IllegalArgumentException ex) { 
throw new SystemException("方法的参数错误,"); 
} 
catch (CacheEngineStartupException ex) { 
throw new SystemException("缓存引擎出现异常,"); 
} 
catch (CacheException ex) { 
throw new SystemException("缓存存取时出现异常,"); 
} 
catch (ConfigLoadException ex) { 
throw new SystemException("配置文件加载异常,"); 
} 
catch (DatabaseException ex) { 
throw new SystemException("数据库发生异常,"); 
} 
catch (FileNotFoundException ex) { 
throw new SystemException("文件未找到,"); 
} 
catch (IllegalOperationException ex) { 
throw new SystemException("您的操作是非法的,"); 
} 
catch (IllegalParameterException ex) { 
throw new SystemException("提交的参数非法,"); 
} 
catch (MailException ex) { 
throw new SystemException("邮件发送出现异常,"); 
} 
catch (NoObjectExistException ex) { 
throw new SystemException("你操作的对象已经不存在,"); 
} 
catch (ObjectExistException ex) { 
throw new SystemException("你操作的对象已经存在,"); 
} 
catch (SearchException ex) { 
throw new SystemException("搜索过程中发生异常,"); 
} 
catch (SearchInstantiationException ex) { 
throw new SystemException("搜索实例生成发生异常,"); 
} 
catch (ServiceException ex) { 
throw new SystemException("服务器发生异常,"); 
} 
catch (TemplateNotFoundException ex) { 
throw new SystemException("模板未找到,"); 
} 
catch (ClassCastException ex) { 
throw new SystemException("类型强制转换错误,"); 
} 
catch (SecurityException ex) { 
throw new SystemException("违背安全原则异常,"); 
} 
catch (SQLException ex) { 
throw new SystemException("操作数据库异常,"); 
} 
catch (NoSuchMethodError ex) { 
throw new SystemException("方法末找到异常,"); 
} 
catch (InternalError ex) { 
throw new SystemException("Java虚拟机发生了内部错误,"); 
} 
catch (Exception ex) { 
throw new SystemException("程序内部错误,操作失败,"); 
} 
return result; 
} 
} 
 
分享到:
评论
1 楼 topbox163 2011-08-01  
捕获不到异常

<!DOCTYPE struts PUBLIC
         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
         "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml" />
<package name="UsersModel" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="exceptionManager" class="com.sanss.meeting.web.ExceptionInterceptor" />
<interceptor-stack name="commonInterceptor">
<interceptor-ref name="exception" />
</interceptor-stack>
</interceptors>
<global-results>
<result name="EXCEP_ERROR">wappush/jsp/common/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="EXCEP_ERROR" exception="com.sanss.meeting.web.SystemException" />
</global-exception-mappings>

<action name="usersAction" class="com.sanss.meeting.web.UsersAction">
<result name="login">wappush/jsp/wappushLogin.jsp</result>
<result name="success">wappush/jsp/manage.jsp</result>
<result name="success_usersList">wappush/jsp/usersList.jsp</result>
<result name="success_usersAdd">wappush/jsp/usersAdd.jsp</result>
<result name="success_usersUpdate">wappush/jsp/usersUpdate.jsp</result>
<result name="input">wappush/jsp/common/error.jsp</result>
<result name="error">wappush/jsp/common/error.jsp</result>
</action>
</package>
</struts>

相关推荐

    Struts2异常处理机制

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

    Struts2之异常处理案例struts003

    下面将详细讨论Struts2中的异常处理机制及其相关知识点。 1. **异常处理机制概述** Struts2提供了内置的异常处理机制,允许开发者定义全局和局部的异常映射,以控制应用程序中出现异常时的行为。全局异常处理适用...

    struts2的异常处理机制

    Struts2是一个流行的Java web框架,它提供了强大的异常处理机制,使得开发者能够优雅地管理和展示在应用程序中出现的错误和异常。以下是对Struts2异常处理机制的详细说明: 1. **异常处理流程**: 当一个Action...

    Struts2 Design and Programming: A Tutorial.pdf

    - Struts2提供了一套完整的异常处理机制,允许开发者自定义错误页面和处理策略。 9. **Struts2的安全性** - 讨论Struts2的安全问题,如XSS和CSRF攻击,并学习如何通过配置和最佳实践来防范这些风险。 10. **实战...

    Struts Design and Programming: A Tutorial

    Struts1提供了全局异常处理机制,允许开发者定义全局和特定Action的异常处理策略。 **10.Tiles框架集成** Tiles是Struts的一个扩展,允许创建可重用的页面布局组件,提高视图的复用性和可维护性。 通过本教程,...

    struts手动异常处理

    2. **全局异常处理**:Struts允许我们在配置文件中定义全局异常映射,这样所有Action中的未捕获异常都会被映射到特定的结果页面。在`struts.xml`或`struts-default.xml`中,可以使用`&lt;global-exception-mappings&gt;`...

    Struts1异常处理

    尽管如此,许多遗留系统仍然依赖于Struts1,因此理解其异常处理机制仍然是必要的。 在Struts1中,异常处理主要通过两个组件来实现:`Action`类和`Tiles`或`Struts-config.xml`配置文件中的`exception`标签。当一个...

    struts2中异常处理(demo)

    Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用程序。...结合提供的压缩包文件"struts2_003",可能包含了示例代码或者项目结构,帮助读者理解并实践Struts2的异常处理机制。

    struts1.x 异常处理机制

    总结来说,Struts1.x的异常处理机制包括全局异常配置和自定义Action异常处理两部分。通过合理利用这两种方式,开发者可以有效地控制和管理应用程序的异常,提供更健壮的错误处理,提高系统的稳定性和用户体验。在...

    Struts2 异常处理的四种获取属性方法

    在Struts2框架中,异常处理是至关重要的一个部分,它确保了应用程序的稳定性和用户体验。Struts2提供了多种方式来捕获和处理异常,帮助开发者优雅地处理程序中的错误情况。以下是Struts2异常处理的四种主要方法,...

    Struts2讲义-作者:吴峻申

    - Struts2提供了默认的拦截器栈,包含了一些常用的功能,如参数填充、异常处理等。 - **拦截器原理实现**: - 拦截器基于AOP(面向切面编程)思想实现。 - 当请求到达时,Struts2会根据配置找到相应的拦截器栈,...

    基于Struts的异常处理

    总结一下,基于Struts的异常处理机制: 1. 定义自定义异常类,如`AppException`,包含错误代码和参数,方便处理和展示错误信息。 2. 创建自定义异常处理器,如`AppExceptionHandler`,继承自Struts提供的`...

    Struts2 Spring2.5集成:系统登陆demo--带lib可直接运行

    Struts2的动作映射和结果处理机制可以很好地处理这些流程,而Spring则可以管理数据库连接和事务,确保数据操作的一致性。 7. **运行环境**:由于是“带lib可直接运行”的Demo,压缩包中可能包含了所有运行所需库...

    Struts1和Struts2区别

    - **Struts2**:提供了更强大的异常处理机制,可以定义全局和Action级别的异常映射,更易管理。 6. 数据校验: - **Struts1**:使用ActionForm中的Validate方法进行客户端或服务器端校验,需要编写大量重复代码。...

    Struts2的异常处理

    Struts2作为一款流行的Java Web框架,其异常处理机制是开发者必须掌握的关键部分。这篇博客主要探讨了在Struts2中如何有效地管理和处理异常,从而提高应用的稳定性和用户体验。 在Struts2中,异常处理主要通过两种...

    Struts2工作机制

    Struts2包含了一些内置的拦截器,如`ValidationInterceptor`用于验证表单数据,`ExceptionHandlerInterceptor`处理异常等。开发者可以根据需求自定义拦截器,实现特定的行为,如登录检查、日志记录等。 4. **...

    struts2的异常处理

    本篇文章将深入探讨Struts2的异常处理策略,以及如何在DAO层进行单元测试配置。 在传统的Web应用中,当一个异常发生时,通常会跳转到错误页面或者返回错误信息。但在现代Web应用中,尤其是涉及到Ajax异步请求时,...

    struts错误处理机制小例子

    2. **全局异常处理**:在struts-config.xml中,我们可以定义全局的异常映射(global-exceptions)。当Action执行过程中抛出未被捕获的异常时,Struts会查找匹配的异常映射,根据配置转发到特定的错误页面。例如,...

Global site tag (gtag.js) - Google Analytics