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>

时间: 2024-10-21 19:50:33

struts2异常处理机制的相关文章

struts2 - 异常处理机制

struts2 采用声明式的方法管理异常处理,因此,我们无需在 execute方法中编写 大量的 try...catch语句来捕获异常:只需要在 struts.xml文件中配置异常的映射机制,struts2 便能够处理并转入响应的视图资源. eg: 页面输出 异常信息: 例如internal_Error.jsp页面 <body>   <s:property value="exception.message"/> </body>

(十)struts2的异常处理机制

成熟的MVC框架应该提供成熟的异常处理机制.当然可以在方法中手动捕捉异常,当捕捉到特定异常时,返回特定逻辑视图名. 这种方式非常繁琐,需要在方法中写大量try catch块,最大的缺点还是一旦需要改变异常处理方法时,需要修改代码. 最好的方式是通过声明式的方式管理异常处理.struts2提供了一种声明式的异常处理方式. 一.原理 我们看Action接口中的execute方法声明. public String execute() throws Exception 这就意味着我们重写该方法时,无需进

Struts2异常处理实例

一 介绍 java ee项目在某些情况下难免会产生一些异常,如果某些异常我们没有进行处理,那么将会抛给服务器,最后服务器会将异常信息直接在前台页面打印出来,比如说这样: 像这种直接将异常打印出来是非常不好的,不仅因为普通用户看不懂,而且还会将服务器的一些内部信息暴露出来,比如说:绝对路径,这样可能将会"方便"某些黑客进行非法入侵.因此我们需要对这些异常进行处理,给用户显示一个比较友好的界面. 二 简单处理 我们可以通过struts2的全局异常处理机制来处理,这种比较简单,配置strut

16.如何自学Struts2之Struts2异常处理[视频]

16.如何自学Struts2之Struts2异常处理[视频] 之前写了一篇"打算做一个视频教程探讨如何自学计算机相关的技术",优酷上传不了,只好传到百度云上: http://pan.baidu.com/s/1kTDsa95 有问题可以直接回复这篇文章.

深入理解Java异常处理机制

1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,"猜猜"它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. <span style="background-color: rgb(255, 255, 255

Java异常处理机制的秘密

一.结论 这些结论你可能从未听说过,但其正确性是毋庸置疑的,不妨先看看: 1.catch中throw不一定能抛回到上一层,因为finally中的return会抑制这个throw2.finally中throw一定能抛回上一层,因为此时其后的return不会被执行到(throw中断了正常的顺序流)3.在try/catch中return并不会直接返回上一层,而是先执行finally再返回 二.一段小程序 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

C++学习笔记27:异常处理机制

一.异常处理机制基础 异常的定义 程序中可以检测的运行不正常的情况 异常处理的基本流程 某段程序代码在执行操作时发生特殊情况,引发一个特定的异常 另一段程序代码捕获该异常并处理它 二.异常的引发 throw 三.异常的捕获 try { ... } catch(...) 四.异常类与异常对象 五.异常处理策略 异常类可以派生和继承,形成类库架构 可捕获的异常对象的型式 普通型式(包括类):异常对象需要拷贝 对某型式对象的引用:没有额外的拷贝动作 指向某型式对象的指针:要求对象动态构造或者在catc

Java之异常处理机制

来源:深入理解java异常处理机制 2.Java异常    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常.因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件.当条件生成时,错误将引发异常. Java异常类层次结构图: 图1 Java异常类层次结构图 在 Java 中,所有的异常都有一个共同的祖先 Th

基于返回值的错误处理与异常处理机制

基于返回的错误处理和异常处理机制的比较 一.基于返回值的错误处理机制 对于传统的面向过程语言比如说C语言,通常使用基于返回值的错误处理机制,即通过在程序中定义程序出错时的返回值,比如说0代表操作成功,而1代表操作失败. 这种错误处理机制的好处在于有时候即使出现了异常程序或许也可以继续执行(但是最终执行结果或许不对,而这就导致查错比较困难,因为有时候仅仅通过函数返回值我们并不知道程序出错的原因究竟是什么,比如说程序操作失败返回值为0,我们在控制台上看到程序输出为0,但是除此之外没有其他额外的信息帮