为了有利于代码的维护,struts2通过配置struts.xml,用拦截器将异常处理代码和action代码完全分开。具体是用exception-mapping和result标签完成异常处理的映射。
下面是演示代码。loginAction中处理控制逻辑的方法抛出SQLException的话,则会跳转到exception.jsp,其中exception-mapping标签的result值要与result标签的name值一样。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="testAction" extends="struts-default">
<action name="login" class="chapter8.LoginAction">
<exception-mapping exception="java.sql.SQLException" result="exception" />
<result name="exception">/chapter8/exception.jsp</result>
<result name="success">/chapter8/success.jsp</result>
<result name="error">/chapter8/error.jsp</result>
</action>
</package>
</struts>
除了在action标签中设置异常映射,还可以在package标签中进行设置。下面需要注意的是,global-results标签要放在global-exception-mappings前面。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="testActionContext" extends="struts-default">
<global-results>
<result name="exception">/chapter8/exception.jsp </result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.sql.SQLException" result="exception"/>
</global-exception-mappings>
<action name="login" class="chapter8.LoginAction">
<result name="success">/chapter8/success.jsp</result>
<result name="error">/chapter8/error.jsp</result>
</action>
</package>
</struts>
如果想要在jsp页面显示异常信息,代码如下:
//输出异常信息
<s:property value="exception.message"/>
//输出异常堆栈信息
<s:property value="exceptionStack"/>