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:异常流程 ...
随机推荐
- easyui datagrid 表格适应屏幕
1.项目后台系统使用easyui,datagrid 的数据设置为自动适应屏幕,那么对于笔记本的话,就会显得有的小,可以通过设置datagrid属性,进行固定长度的设置 $('#gridTable'). ...
- 创建一个简单的windows服务,每间隔一定时间重复执行批处理文件
创建一个windows服务项目,增加App.config <?xml version="1.0" encoding="utf-8" ?> <c ...
- 【转载】Redis在新浪微博中的应用
转载自文章 http://blog.me115.com/2013/12/19/redis-e5-9c-a8-e6-96-b0-e6-b5-aa-e5-be-ae-e5-8d-9a-e4-b8-ad-e ...
- MYSQL 命令行工具自动登录的方法
MYSQL 命令行工具自动登录的方法 1. 需求提出 由于在linux 环境下,经常需要使用mysql(command-line tool) 终端连接到MYSQL DB服务. 其中大致的语法如下: m ...
- (1)风色从零单排《C++ Primer》 一个简单的c++程序
从零单排<C++ Primer> --(1)一个简单的c++程序 本次学习收获 0.写在前面 风色以前上过C++的课程,然而当时并没有认真去学,基本不能使用c++来作项目开发. 这次又一次 ...
- 【python】如何安装requests
在cmd窗口输入pip install requests 即可,如下 C:\Users\horn1\Desktop\python\4>pip install requestsCollecting ...
- 一致性哈希算法(Consistent Hashing) .
应用场景 这里我先描述一个极其简单的业务场景:用4台Cache服务器缓存所有Object. 那么我将如何把一个Object映射至对应的Cache服务器呢?最简单的方法设置缓存规则:object.has ...
- URL转发
原理:iframe 代码: <?php if($_SERVER['HTTP_HOST']=="i.mansions.com.cn"){ $html = <<< ...
- Android程序怎么做单元测试
如何进行Android单元测试 Menifest.xml中加入: <application>中加入: <uses-library android:name="android ...
- 树形dp hdu-4616-Game
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4616 题目大意: 给一棵树,每个节点有一个礼物值及是否有trick,每来到一个节点必须拿礼物,如果该 ...