当前位置: 代码迷 >> 编程 >> Struts2课程八——Exception Handling
  详细解决方案

Struts2课程八——Exception Handling

热度:4009   发布时间:2013-02-26 00:00:00.0
Struts2教程八——Exception Handling
本教程代码可在Google Code - http://code.google.com/p/struts2-examples/downloads/list下载,项目名称为Exception_Handling_Struts2_Ant或者Exception_Handling_Struts2_Mvn,解压后按照README.txt说明构建即可。

引言

本课程将学习Struts 2 framework如何处理未捕获异常, struts 2提供了健壮的异常处理机制,包括自动记录理未捕获异常日志和重定向到用户自定义错误页面的能力。

全局异常处理

使用Struts 2 framework你可以在struts.xml中标明如何处理未捕获异常,处理逻辑可以被应用到所有action,也可以是特定的action,我们先看看怎样处理全局异常。

在struts.xml中加入两个节点:global-exception-mapping和global-results。从http://code.google.com/p/struts2-examples/downloads/list下载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>  

global-exception-mapping节点告诉Struts 2 framework如果标明的异常被抛出该怎么办,例如SecurityBreachException抛出但未捕捉,Struts 2 Action类会返回一个"securityerror"。对于剩余其他的未捕捉异常Struts 2 Action类返回"error"。

global-results节点映射了返回值和特定页面的关系。例如返回"securityerror"会导致framework重定向到securityerror.jsp页面返回给浏览器。

每个Action的异常处理

如果想处理特定action的异常,可以在action节点的内部加入exception-mapping节点。

   <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方法如果抛出SecurityBreachException,Struts 2 framework应该返回login。login会导致用户浏览器重定向到login.jsp。

特定action的异常声明优先于全局异常。

异常日志记录

你还可以配置Struts 2 framework使其将异常写入日志。要实现此功能要在struts.xml中定义一些参数值。如果查看ExceptionMappingInterceptor class API,有三个参数可以设置, there are three parameter values you can set to enable logging (logEnabled), the log level to use (logLevel), and the log category (logCategory) to specify in the log message.

为了给所有action设置这些参数,我们利用一个特定的interceptors栈,在struts.xml文件的package节点后加入以下内容。

<interceptors>  <interceptor-stack name="appDefaultStack">    <interceptor-ref name="defaultStack">     <param name="exception.logEnabled">true</param>     <param name="exception.logLevel">ERROR</param>    </interceptor-ref> </interceptor-stack></interceptors><default-interceptor-ref name="appDefaultStack" />

上面interceptors节点配置了一个叫做appDefaultStack的Struts 2 interceptors栈,这个栈基于叫defaultStack的interceptors栈 (这个栈里的interceptor在每次action类执行方法时都被Struts 2 framework默认执行)。

ExceptionMappingInterceptor是Struts 2默认栈的一个interceptor。在struts的defaultStack定义中,ExceptionMappingInterceptor叫做exception。通过param节点把ExceptionMappingInterceptor类的logEnabled参数设为了true。

这样当应用抛出一个未捕获异常,Struts 2 framework会处理并将栈轨迹通过一个日志入口写入日志,本例中,log level被设置为error。

例子中,只是将日志信息写入Servlet容器的控制台(可以在log4j.xml文件自行中配置)。

在浏览器中显示异常信息

可以在浏览器中用s:property标签显示异常信息,value属性为exception或者exceptionStack。例如,在error.jsp加入下面标记。

   <h4>The application has malfunctioned.</h4>   <p>  Please contact technical support with the following information:</p>    <h4>Exception Name: <s:property value="exception" /> </h4>   <h4>Exception Details: <s:property value="exceptionStack" /></h4> 

当异常拦截器被触发时,它会添加一些可用的域来帮助显示exception消息和exception的栈轨迹。

总结

Struts 2提供了易于使用的处理异常和重定向页面的特性。你可以处理全局异常,也可以处理特定action异常,还可以将他们记录日志。

下篇

下篇将学习怎样配置Struts 2使调试更加简单。

  相关解决方案