通常,我们在应用Struts1.0进行开发的过程中,对于异常的处理,主要是采用手动处理的方式。 
    如通过 try/catch 等捕获异常,然后通过 FormBean.returnString ()或Debug.println ("");的方式 ,把这些错误信息反馈给用户或开发人员。 
       在 Struts 1.1 中,引入了新的异常处理机制,让我们可以通过配置文件(主要是struts-config.xml)来定制异常处理,就象定义formbean一样。 
    下面,我们就来看看如何具体地运用这个新特性。 
  
一、定制异常(在 struts-config.xml文件中定义) 
  
     定制异常也有两种方法,姑且把它分为:“全局异常(Global Exceptions)”和“局部异常 (Local Exception)”。 
       “全局异常”定义方法如下: 
    <global-exceptions> 
<exception key="struts.test.InvalidUserName"                        type="struts.test.InvalidiUserNameException" 
scope="request" 
Handler="org.apache.struts.action.ExceptionHandler" 
path="error.jsp"/>             
</global-exceptions> 
上述代码在struts-config.xml中定义了一个全局异常,它的作用是抛出InvalidiUserNameException(在这里的意思是当在添加用户的时候,发现该用户已经存在)异常的时候返回到error.jsp中,并且携带自定的比较规范的异常信息struts.test.InvalidUserName,struts.test.InvalidUserName可以在应用程序的资源配置文件中找到,如: 
struts.test.InvalidUserName =重复注册用户! 
局部异常,定义方法如下: 
<action-mappings> 
       <action path="/userLogonAction" 
                     type="struts.test.UserLogonAction" 
                     name="userLogonForm"> 
              <exception key="struts.test.InvalidUserName" 
type="struts.test.InvalidiUserNameException" 
Handler="org.apache.struts.action.ExceptionHandler" 
path="/error.jsp"/> 
             <forward name="success" path="/index.jsp"/> 
        </action> 
</action-mappings>  
关于异常在 Struts 1.1 中 Struts-config.xml 的定义就这么简单。 
二、实现我们的异常类(struts.test.InvalidiUserNameException) 
  
为了实现 struts.test.InvalidiUserNameException 这个异常,我们必须自己编写一个继承于 Exception 的异常:InvalidiUserNameException。 
File name : InvalidiUserNameException.java 
package struts.test; 
 public class InvalidiUserNameException extends Exception 
{ 
       public InvalidiUserNameException ()  
       { 
           super(); 
      } 
} 
  
 三、一个抛出异常的Action 
  我们假设下面这个异常将会抛出 struts.test.InvalidiUserNameException :
public class UserLogonAction extends BaseAction { 
              public ActionForward execute(ActionMapping mapping, 
                                                               ActionForm form, 
                                                               HttpServletRequest request, 
                                                               HttpServletResponse response)throws Exception { 
                     throw new struts.test.InvalidiUserNameException (); 
                } 
} 
  
四、显示我们的异常信息 
为了显示我们的友好错误提示信息,我们可以编写一个error.jsp 文件,内容如下: 
error.jsp  
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>   <html:html locale="true"> <head>     <title>Struts 1.1 Exception Handler Demo</title>     <html:base />   </head>   <body>     <h1>系统出现一个意外</h1>     请将下面的提示信息反馈给你的系统管理员:<br>     <html:errors />   <!--将在这里显示”重复注册用户!”-->         </body> 
</html:html> 
 五、出现我们的异常 
好了,我们可以看到我们的异常了。当执行到上面的 Action 的时候,程序将会抛出InvalidiUserNameException ,而 struts1.1的 Exception Handler 将会捕捉这个异常,并在 struts-config.xml寻找匹配的异常定义信息,最终转到error.jsp并且显示了我们定义的错误信息: 
  
重复注册用户! 
  
 以上的代码只是从整体上介绍了如何使用 Struts 1.1 的异常处理机制,在我们具体的实现中,我们可以在 DAO/Oper 层抛出异常,并不需要在 Action 层抛出。 
 所以,我们定制的异常在程序中并不需要用try/catch来捕获,一旦出现了我们已经定义的异常那么就会转到相应的页面,并且显示相应定制的信息。 
我们上面是使用 Struts 默认的异常处理 Handler org.apache.struts.action. ExceptionHandler  来处理的。 
我们也可以定义自己的处理方式,只要继承它并实现其中的execute方法,这个方法在 ExceptionHandler 的定义如下: 
    public ActionForward execute(Exception ex, 
                                 ExceptionConfig ae, 
                                 ActionMapping mapping, 
                                 ActionForm formInstance, 
                                 HttpServletRequest request, 
                                 HttpServletResponse response) 
        throws ServletException 
补充说明: 
FormBean.returnString ():是我们自己定义的一个用于显示在用户页面的友好提示信息 
 Debug 是我们自己定义的一个显示控制台错误信息的类 
DAO/Oper :具体实现数据库操作或其他的类 
  
感谢: 
http://www.scioworks.net 
2003-8-8  
 
  |