Struts2之异常机制

当一个Action类抛出一个异常时,Struts2采用声明式的策略即异常映射匹配来处理异常。核心处理思想就是都某个Action的方法执行时抛出异常对象,该异常对象可以被Struts2的异常拦截器自动捕获,并映射到预定义结果视图;由于在struts-default.xml中已经激活异常映射功能,所以作为开发者而言,要做的仅仅是定义异常映射到指定的结果集;

当异常发生时,拦截器会以检查局部异常然后全局异常的顺序,检查所有可以应用于当前Action的异常映射,在所有抛出和声明的异常中寻找与抛出异常对象最接近的异常类型,如果类型匹配,则执行对应的结果,跳转到结果对应页面;

看下面一个简单的例子:

package com.ognl.action;

import com.opensymphony.xwork2.ActionSupport;

public class ExceptionAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		int a = 1 / 0;
		return SUCCESS;
	}
}
然后看struts.xml配置

	<global-results>
		<result name="ArithmeticException">/exception.jsp</result>
	</global-results>
	<global-exception-mappings>
		<exception-mapping result="ArithmeticException"	exception="java.lang.ArithmeticException"/>
	</global-exception-mappings>
	<action name="exception" class="com.ognl.action.ExceptionAction">
		<result name="success">/hello.jsp</result>
	</action>
当执行ExceptionAction的execute方法时,会抛出ArithmeticException异常,于是首先回到Action内部,去寻找是否有匹配的异常映射,没有找到后接着去全局异常映射中寻找匹配项,找到后然后跳转到对应的异常页面;

再看一个稍微绕一点的例子:

<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>
以上配置信息我们可以得出:

1、一个java.sql.SQLException将要链到SQLExceptionAction

2、一个com.company.SecurityException 将要重定向到Login.action

3、其它异常将会请求转发到Exception.jsp页面

如果要在异常页面显示错误信息,该如何显示呢?

一般来说,ExceptionmappingInterceptor 将下列信息添加到ActionContext的Value Stack中

exception异常对象本身
exceptionStack栈轨迹详细信息
既然如此,我们就可以通过OGNL的方式会获取它

<h2>An unexpected error has occurred</h2>
<p>Please report this error to your system administrator or
	appropriate technical support personnel. Thank you for your
	cooperation.</p>
<hr />
<h3>Error Message</h3>
<s:actionerror />
<p>
	<s:property value="%{exception.message}" />
</p>
<hr />
<h3>Technical Details</h3>
<p>
	<s:property value="%{exceptionStack}" />
</p>
Struts2这种声明似的异常处理方式,在Hibernate也较为常见,该处理方式简洁明了,关键在于如何弄懂它的核心处理规则,以后即使在复杂的异常处理也不怕!





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值