struts2异常处理机制
一、处理一般异常(javaBean异常)
struts2进行异常处理首先需要添加exception拦截器,而默认拦截器栈已经加入了这个拦截器,所以不用特意的声明。在Struts 2框架中,采用声明式异常处理方式。在这种方式下,只需要在struts.xml文件中进行配置,Struts 2便能够处理异常,并跳转到相应的视图,而在Action中无须编写任何异常处理代码。
如果Action在处理请求的过程中出现异常,一个名称为exception的拦截器将拦截该异常,并进行处理。所以在struts.xml文件中,需要对exception拦截器进行配置。
1.配置元素
在struts.xml文件中,使用元素,对exception拦截器进行异常映射配置,该元素有以下两个属性:
exception 该属性用来指定出现异常的类型。
result 该属性用来指定出现异常时,Struts 2返回给用户的视图名称。
2.异常映射分类
根据异常映射作用的范围,可以将异常映射配置分为以下两类:
A、全局异常映射
作用范围是package中的所有Action。这种映射使用元素进行配置,在该元素中嵌套作为子元素。
例如:
<package
name="error-handler"
extends="struts-default">
<global-results>
<result
name="noPoint">/page/common/noPoint.jsp</result>
<result
name="noMethod">/page/common/noMethod.jsp</result>
<result name="exception">/page/common/exception.jsp</result>
<result name="error"
type="chain">exceptionHandler</result>
<result name="input">/page/common/inputError.jsp</result>
<result
name="success">/page/common/resData.jsp</result>
<!-- error handler page -->
<result
name="errAjax">/page/common/appError.jsp</result>
<result
name="errPage">/page/common/exceptionPage.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping
result="nullPoint"
exception="java.lang.NullPointerException"/>
<exception-mapping
result="noMethod"
exception="java.lang.NoSuchMethodException"/>
<exception-mapping
result="exception"
exception="java.lang.Exception"/>
</global-exception-mappings>
</package>
B、局部异常映射
作用范围是配置元素所在的Action。这种映射是在Action内部,使用元素进行配置。
例如:
<action
name="login"
class="action.LoginAction">
<exception-mapping
result="nullPoint"
exception="java.lang.NullPointerException"/>
<result
name="success">/welcome.jsp</result>
<result
name="nullPoint">/nullpoint.jsp</result>
</action>
这两种异常映射的优先级不同,当两种映射有冲突时,局部映射将覆盖全局异常映射。
###################注意#########################
注意:
当异常发生时,struts2会根据抛出的异常去异常映射文件中寻找在继承关系上与该异常最接近的映射进行匹配。
例如,action抛出一个IOException,这个异常是Exception的直接子类。所以会匹配到Exception映射。再者,action
抛出一个BatchUpdateException,它既是SQLException的子类,同时也是Exception的子类。但是它和
SQLException的继承关系最接近,所以它会匹配到SQLException。
<struts>
<package name="default">
...
<global-results>
<result name="login"
type="redirect">/Login.action</result>
<result
name="Exception">/Exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.sql.SQLException"
result="SQLException"/>
<exception-mapping exception="java.lang.Exception"
result="Exception"/>
</global-exception-mappings>
...
<action name="DataAccess"
class="com.company.DataAccess">
<exception-mapping
exception="com.company.SecurityException"
result="login"/>
<result name="SQLException"
type="chain">SQLExceptionAction</result>
<result>/DataAccess.jsp</result>
</action>
...
</package>
</struts>
说明:全局异常也只有在package包下进行配置,只对下面的action起作用,在struts没有如struts中那样的异常。局部异常和全局异常的搭配使用。
用三个例子说明,当访问DataAccess时如果发生异常
一个java.sql.SQLException将会chain到另一个action SQLExceptionAction
一个 com.company.SecurityException 将会重定向到Login.action
任何其他继承了java.lang.Exception 的异常将会转至Exception.jsp
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
值栈中的Exception值:
默认情况下,发生异常时,struts2会向值栈中压入一下两个值:
exception : 异常对象本身
exceptionStack :stack trace的值
##在jsp页面我们可以使用<s:debug></s:debug>来查看值栈信息,也可以使用标签:
<s:property
value="exception.message"/>
<s:property
value="exceptionStack"/>输出异常信息和异常堆栈信息
到了这里我们可以知道了,有时我们为什么可以在拦截器中能够得到异常对象了吧:
HttpServletRequest request =
ServletActionContext.getRequest();
//获取异常
Exception ex
= (Exception)
request.getAttribute("exception");
或者异
ActionContext context =
actionInvocation.getInvocationContext().getContext();
ValueStack
stack = context.getValueStack();
Exception ex = (Exception)
stack.findValue("exception")
看到上面的两段代码你会怀疑exception对象时什么时候存放到值栈中和request中的呢???呵呵,其实就是在发生异常的时候struts2向值栈中和request域中存放的!!!!!
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
在jsp中可以打印出异常信息
<%@ page language="java" import="java.util.*"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="s"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN">
<html>
<head>
<title>系统异常</title>
</head>
<body>
<h3>出错信息,请与管理员联系</h3>
<s:actionerror/>
<p>
<s:property
value="%{exception.message}"/>
<%--<s:property
value="exception.MyExceptionMsg"/>(其中MyExceptionMsg是我们自定义异常中的一个属性(一定要提供get和set方法))
--%>
</p>
<h3>详细信息</h3>
<p>
<s:property
value="%{exceptionStack}"/>
<s:debug></s:debug>可以查看值栈信息
</p>
</body>
</html>
###################注意#############################
C、处理不存在的Action
只需在struts.xml中加:
<default-action-ref
name="defaultAction" />
<action name="defaultAction"
class="com.lsw.permission.action.DefaultAction"
/>
3.输出异常信息
可以使用Struts
2中的property标签,输出异常信息。
输出异常对象本身,代码如下:
<s:property
value="exception.message"/>
或者
<s:property
value="exception.MyExceptionMsg"/>
(其中MyExceptionMsg是我们自定义异常中的一个属性(一定要提供get和set方法))
输出异常堆栈信息,代码如下:
<s:property
value="exceptionStack"/>
例如sql.jsp页面
<body>
<s:property
value="exception.message"/>
</body>
二、.处理不存在的页面,如不存在的JSP,html,htm等页面(404异常),struts是不能处理这个异常的,还有其他异常(如500,401等等)都交给tomcat来处理,只需在web.xml中加如下配置即可:
<!-- 处理不存在的页面
-->
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/jsp/error/404.jsp</location>
</error-page>
<!-- 处理500异常 -->
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/jsp/error/500.jsp</location>
</error-page>
struts2异常处理机制的更多相关文章
- (十)struts2的异常处理机制
成熟的MVC框架应该提供成熟的异常处理机制.当然可以在方法中手动捕捉异常,当捕捉到特定异常时,返回特定逻辑视图名. 这种方式非常繁琐,需要在方法中写大量try catch块,最大的缺点还是一旦需要改变 ...
- Java异常处理机制 try-catch-finally 剖析
Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...
- JAVA 异常处理机制
主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...
- 深入理解java异常处理机制
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...
- C++学习笔记27:异常处理机制
一.异常处理机制基础 异常的定义 程序中可以检测的运行不正常的情况 异常处理的基本流程 某段程序代码在执行操作时发生特殊情况,引发一个特定的异常 另一段程序代码捕获该异常并处理它 二.异常的引发 th ...
- C++中的异常处理机制
C++中的捕获异常机制catch参数中实参的类型不同,采取的处理方式则不相同,且与普通的函数调用还不一样,具体表现为当抛出异常throw A()或throw obj时,对象会进行一次额外的对象复制操作 ...
- 16、java中的异常处理机制
异常:就是程序在运行时出现不正常情况.异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象. 其实就是java对不正常情况进行描述后的对象体现. 对于问题的划 ...
- Struts——(四)异常处理机制
在通常的情况下,我们得到异常以后,需要将页面导航到一个错误提示的页面,提示错误信息.利用Stuts我们可以采用两种方式处理异常: 1.编程式异常处理 即我们在Action中调用业务逻辑层对象的方法时, ...
- Java面向对象编程之异常处理机制
一:Java的异常处理机制的优点: 1:把各种不同情况的异常情况分类,使用JAVA类来表示异常情况,这种类被称为异常类.把各种异常情况表示成异常类,可以充分的发挥类的可扩展性和可重用性. 2:异常流程 ...
随机推荐
- 数学图形(2.12)spherical cycloid球面外摆曲线
查了半天也没搜到其具体的定义,先把脚本代码和截图发下. #http://www.mathcurve.com/courbes3d/cycloidspheric/cycloidspheric.shtml ...
- Fragment 生命周期 事务 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- C++primer习题--第3章
本文地址:http://www.cnblogs.com/archimedes/p/cpp-primer-chapter3-ans.html,转载请注明源地址. [习题 2.11]编写程序,要求用户输入 ...
- 给出a的定义 -- 指针 和 数组
- C#高级编程五十七天----位数组
位数组 假设须要处理非常多位,就能够使用BitArray类和BitVector32.BitArray位于命名空间System.Collections中. BitVector32位于命名空间System ...
- 【架构】OpenResty相关资料
OpenResty最佳实践 在2012年的时候,我加入到奇虎360公司,为新的产品做技术选型.由于之前一直混迹在python圈子里面,也接触过nginx c模块的高性能开发,一直想找到一个兼备pyth ...
- Linux下显示硬盘空间的两个命令
1.df -h ,用于显示目前所有文件系统的可用空间及使用情况,示例如下: [root@msg45 ~]# df -hFilesystem Size Used ...
- 淘宝网前端开发面试题(二)--JS 面试题
所有答案仅供参考,不负责答案对错(^_^) 1.js 是什么,js 和 html 的开发如何结合? js是javascript的缩写,是一种基于对象的.事件驱动的脚本语言.它一共由三个部分组成:分别是 ...
- 使用ionic中的侧边栏以及angularjs中广播的使用
接着之前的ionic的例子 查看例子:我的第一段ionic代码 demo3.html(黄底内容为增加或修改的内容) <!DOCTYPE html> <html ng-app=&quo ...
- 符号三角形_hdu_2510(深搜).java
http://acm.hdu.edu.cn/showproblem.php?pid=2510 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...