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:异常流程 ...
随机推荐
- AlphaGo:用机器学习技术古老的围棋游戏掌握AlphaGo: Mastering the ancient game of Go with Machine Learning
AlphaGo: Mastering the ancient game of Go with Machine Learning Posted by David Silver and Demis Has ...
- Hive安装与配置——深入浅出学Hive
第一部分:软件准备与环境规划 Hadoop环境介绍 •Hadoop安装路径 •/home/test/Desktop/hadoop-1.0.0/ •Hadoop 元数据存放目录 •/home/test/ ...
- 服务 进程守护 MarsDaemon 简介
MarsDaemon 基本功能 https://github.com/Marswin/MarsDaemon It is a lite library, you can make your projec ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- [HNOI2002]营业额统计 Splay tree入门题
题目连接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec ...
- python import 错误 TypeError: 'module' object is not callable
python import 错误 TypeError: 'module' object is not callable 在这里,有 Person.py test.py; 在 test.py 里面 im ...
- PHP RESTful
PHP RESTful REST(英文:Representational State Transfer,简称REST) ,指的是一组架构约束条件和原则. 符合REST设计风格的Web API称为RES ...
- 一次寻找IBatisNet事务bug的过程
本文的上下文环境 操作系统:Win7 x64 Professional 开发工具:Visual Studio 2017 语言:C# 数据库ORM:IBatisNet 1.6.2 一.前言 这个项目 ...
- 首都医科大学附属北京安贞医院全院级PACS系统采购项目[转]
项目名称:首都医科大学附属北京安贞医院全院级PACS系统采购项目 项目编号:TC140VCF0 采购人名称:首都医科大学附属北京安贞医院 采购人地址:北京市朝阳区安贞里 采购人联系方式:010-644 ...
- uva10401Injured Queen Problem(递推)
题目:uva10401Injured Queen Problem(递推) 题目大意:依然是在棋盘上放皇后的问题,这些皇后是受伤的皇后,攻击范围缩小了.攻击范围在图中用阴影表示(题目).然后给出棋盘的现 ...