如何在Struts2中创建自定义异常处理程序类?我尝试在execute()
中添加异常代码,但失败了。
答案 0 :(得分:2)
我希望此指南对您的问题有用,因为它看起来有点过于宽泛,所以如果您有特定要求,只需编辑您的问题。首先,我建议您阅读官方文档,以便检索有关Exception handling,Exception configuration和Exception Interceptor的信息。
现在,我尝试更详细,因为我可以解释如何处理Struts2中的异常:
<global-results>
文件中的<global-exception-mappings>
和struts.xml
标记来处理结果。<exception-mapping>
标记内的结果<action>
标记全局异常处理
使用Struts 2框架,您可以在struts.xml中指定框架应如何处理未捕获的异常。处理逻辑可以应用于所有操作(全局异常处理)或特定操作。我们首先讨论如何启用全局异常处理。
要启用全局异常处理,您需要向struts.xml添加两个节点:global-exception-mapping和global-results。例如,检查exception_handling项目中的struts.xml。
<global-results> <result name="securityerror">/securityerror.jsp</result> <result name="error">/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="org.apache.struts.register.exceptions.SecurityBreachException" result="securityerror" /> <exception-mapping exception="java.lang.Exception" result="error" /> </global-exception-mappings>
现在,当抛出SecurityBreachException
时,将加载securityerror.jsp
。在我看来,全局异常对于一般错误非常有用。例如,您可以创建一个ApplicationException视图,其中包含用于向您的协助发送问题的堆栈跟踪的表单。
操作异常处理
如果需要以特定方式处理特定操作的异常,可以使用操作节点中的异常映射节点。
<action name="actionspecificexception" class="org.apache.struts.register.action.Register" method="throwSecurityException"> <exception-mapping exception="org.apache.struts.register.exceptions.SecurityBreachException" result="login" /> <result>/register.jsp</result> <result name="login">/login.jsp</result> </action>
在此示例中,当throwSecurityException
操作的Register
方法抛出SecurityBreachException
时,它会返回LOGIN
结果并加载login.jsp
。我已经将这种解决方案用于可能在验证后抛出错误的操作(例如在我的数据库中执行CRUD操作)。
自定义错误jsp
默认情况下,ExceptionMappingInterceptor将以下值添加到值堆栈:
- exception:异常对象本身
- exceptionStack:堆栈跟踪中的值
您可以使用它们来创建自定义jsp,以打印发生的错误和堆栈跟踪。这里有一个例子:
<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>
<强>日志强>
我认为LoggingExceptions段也很有用。