struts2提供了符合资深框架特点声明式异常处理机制。在struts2中,我们可以再struts.xml文件中配置异常映射,将一种异常类型和一个结果对应起来,由这个结果负责对异常做出响应。struts2通过拦截器对action抛出的异常进行捕获,这个拦截器是:
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor
代码如下:
public String intercepor(ActionInvocation invocation) throws Exception{
String result;
try{
// 在try语句中调用invocation.invoke(),invoke方法在内部调用Action的方法
return = invocation.invoke();
}catch(Exception e){
// 如果Action的方法执行抛出了异常,执行流程将跳转到catch语句中
if(logEnabled){
handleLogging(e);
}
// 得到配置的异常映射列表
List exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();
// 在异常映射列表中,查找异常类型对应的结果代码
String mappedResult = this.findResultFromExceptions(exceptionMappings,e);
if(mappedResult != null){
result = mappedResult;
publishException(invocation,new ExceptionHolder(e));
}else{
throw e;
}
}
return result;
}
要使用struts2的声明式异常处理,就需要配置ExceptionMappingInterceptor拦截器。在struts2的默认配置文件Struts-default.xml中,ExceptionMappingInterceptor已经配置好,如下所示:
<package name="struts-default" abstract="true">
...
<interceptors>
<interceptor name="exception" class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor" />
...
</interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception" />
...
<default-interceptor-ref name="defaultStack" />
</package>
下面我们看一个全局和局部异常的例子
<struts>
<package name="default" extends="struts-default">
<global-results>
<!-- 全局结果定义 -->
<result name="login" type="redirect">/login.action</result>
<result name="sqlException" type="chain">
/sqlExceptionAction.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="org.struts.DataAccess" >
<!-- 在dataAccess action中局部异常映射定义-->
<exception-mapping exception="org.struts.SecurityException" result="login" />
<result>/dataAccess.jsp</result>
</action>
</packeage>
</struts>
在结果页面,可以使用Struts2的标签来访问异常信息,例如:
<s:property value="exception.message" />
取出异常对象的描述信息
<s:property value="exceptinStack" />
取出异常发生时的栈跟踪信息