一、处理一般异常(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异常处理机制的更多相关文章

  1. (十)struts2的异常处理机制

    成熟的MVC框架应该提供成熟的异常处理机制.当然可以在方法中手动捕捉异常,当捕捉到特定异常时,返回特定逻辑视图名. 这种方式非常繁琐,需要在方法中写大量try catch块,最大的缺点还是一旦需要改变 ...

  2. Java异常处理机制 try-catch-finally 剖析

    Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...

  3. JAVA 异常处理机制

    主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...

  4. 深入理解java异常处理机制

       异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...

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

    一.异常处理机制基础 异常的定义 程序中可以检测的运行不正常的情况 异常处理的基本流程 某段程序代码在执行操作时发生特殊情况,引发一个特定的异常 另一段程序代码捕获该异常并处理它 二.异常的引发 th ...

  6. C++中的异常处理机制

    C++中的捕获异常机制catch参数中实参的类型不同,采取的处理方式则不相同,且与普通的函数调用还不一样,具体表现为当抛出异常throw A()或throw obj时,对象会进行一次额外的对象复制操作 ...

  7. 16、java中的异常处理机制

    异常:就是程序在运行时出现不正常情况.异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象. 其实就是java对不正常情况进行描述后的对象体现. 对于问题的划 ...

  8. Struts——(四)异常处理机制

    在通常的情况下,我们得到异常以后,需要将页面导航到一个错误提示的页面,提示错误信息.利用Stuts我们可以采用两种方式处理异常: 1.编程式异常处理 即我们在Action中调用业务逻辑层对象的方法时, ...

  9. Java面向对象编程之异常处理机制

    一:Java的异常处理机制的优点: 1:把各种不同情况的异常情况分类,使用JAVA类来表示异常情况,这种类被称为异常类.把各种异常情况表示成异常类,可以充分的发挥类的可扩展性和可重用性. 2:异常流程 ...

随机推荐

  1. JS中实现字符串和数组的相互转化

    早上起来看了一道js的面试题,是这样描述的:利用var s1=prompt("请输入任意的字符串","")可以获取用户输入 的字符串,试编程将用户输入的字符串“ ...

  2. iOS开源项目:FlatUIKit

    FlatUIKit是iOS中具有扁平化风格的UI(Flat UI)组件.FlatUIKit的设计灵感来源于Flat UI和Kyle Miller.FlatUIKit中的组件是通过扩展(category ...

  3. IIS - 无后缀(无扩展名)的MIME类型配置

    添加一个新的 MIME 类型即可. 文件扩展名:. MIME类型:application/octet-stream

  4. html input type=date 赋值问题 必须yyyy-mm-dd格式

    type=date ,日期类型默认格式是yyyy-mm-dd 因此必须给该控件赋值yyyy-mm-dd格式的数据 错误的赋值 <input type="date" id=&q ...

  5. ItermCF的MR并行实现

    ItermCF的MR并行实现 @(Hadoop) ItermCF的基本思想 基于物品相似度的协同过滤推荐的思想大致可分为两部分: 1.计算物与物之前的相似度 2.根据用户的行为历史,给出和历史列表中的 ...

  6. Android安装包相关知识汇总 (编译过程图给力)

    转自: https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=208008519&idx=1&sn=278b7793699 ...

  7. [AngularJS] $scope.$warchCollection

    For the $watch in last article, we watch 'user.password', actually it is a string. If you watch 'use ...

  8. Python MongoDB Spatial Query

    //引入Pymongo >>> from pymongo import MongoClient,GEO2D // 链接数据库gis >>> db = MongoCl ...

  9. PHP快速入门 如何配置Apache服务器

    点击安装Apache,一直下一步 填写域名(Network Domain),服务器名(Server Name),和管理员邮箱(三条都可以任意填写) 下一步的时候选择(Custom),然后在Apache ...

  10. OpenVPN多处理之-为什么不

    OpenVPN没有多处理.人所皆知.我觉得我有点啰嗦了.天天说这个事.为什么没有多处理呢?我们来看下OpenVPN的作者,大牛级别的,早已超越代码的重量级人物,James Yonan(简称JY)是怎么 ...