1. 程式人生 > >Struts2中的異常處理

Struts2中的異常處理

因為在Action的execute方法宣告時就丟擲了Exception異常,所以我們無需再execute方法中捕捉異常,僅需在struts.xml 中配置異常處理。

為了使用Struts2的異常處理機制,必須開啟Struts2的異常對映功能,這需要exception攔截器。在struts-default.xml檔案中已經開啟了exception攔截器。

宣告式異常捕捉

Struts2的異常處理機制是通過在struts.xml檔案中配置<exception-mapping……/>元素完成的,配置該元素時,需要指定兩個屬性: exception:指定該異常型別的完全限定名。 result:指定邏輯檢視名。

根據<exception-mapping……/>元素出現位置的不同,異常對映又可分為兩種:

區域性異常對映:將<exception-mapping… />元素作為<action…/>元素的子元素配置; 全域性異常對映:將<exception-mapping… />元素作為<global-exception-mappings… />元素的子元素配置;

全域性異常對映對所有的Action都有效,但區域性異常對映僅對該異常對映所在的Action有效。

如果區域性異常對映和全域性異常對映配置了同一個異常型別,在<action…./>元素內的區域性異常對映將覆蓋全域性異常對映。

Struts.xml

  <package name="ssh2" extends="struts-default">

     <global-results>
           <result name="sql">/exception.jsp</result>
           <result name="root">/exception.jsp</result>
     </global-results>

     **<global-exception-mappings>
           <exception-mapping exception="java.sql.SQLException" result="sql"/>
           <exception-mapping exception="java.lang.Exception" result="root"/>
     </global-exception-mappings>**

     <action name="login" class="loginAction">
         <result>/welcome.jsp</result>
         <result name="nullPointer">/nullPointer.jsp</result>
         <exception-mapping exception="java.lang.NullPointerException" result="nullPointer"/>
      </action>

  </package>

我們可以使用Struts2的標籤輸出異常資訊:

輸出異常的message屬性資訊:<s:property value=“exception.message” />

輸出異常堆疊資訊:<s:property value=“exceptionStack” />。

有了處理系統異常的基礎,我們來看一看自定義異常:

package com.exception ;

public class MyException extends Exception 
{
 
    private String message;
 
    public MyException(String message)
    {
           super(message);
           this.message = message ;
    }

    public String getMessage() {
          return message;
    }

    public void setMessage(String message) {
           this.message = message;
    }
}


public String execute() throws Exception
{
    if(!"hello".equals(usename) || !"world".equals(password))
    {
             throw new MyException("使用者名稱或密碼錯誤,您發現了吧!");
    }
    return "success" ;
}

在action配置中的異常處理

<struts>
   <package name="struts2" extends="struts-default">       
      <action name="login" class="com.struts2.LoginAction">
            <exception-mapping result="myex" exception="com.exception.MyException">          
            </exception-mapping>
            <result name="myex">/error.jsp</result>
            <result name="success">/result.jsp</result>
      </action>
   </package> 
</struts>

在全域性配置中的異常處理

<struts>
   <package name="struts2" extends="struts-default">
      <global-results>
          <result name="myexception1">/error.jsp</result>
      </global-results>
      
      <global-exception-mappings>
          <exception-mapping result="myexception1"
               exception="com.exception.MyException">           
          </exception-mapping>
      </global-exception-mappings>
     
      <action name="login" class="com.struts2.LoginAction">
            <result name="success">/result.jsp</result>
      </action>
   </package>
</struts>

錯誤頁面error.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s"  uri="/struts-tags"%>  
<html>
  <body>
    <!-- 這個exception 是 exception="com.exception.MyException" -->
    <s:property value="exception.message"/>
  </body>
</html>

總結

區域性異常處理比全域性異常處理高,並且可覆蓋全域性異常處理,如果定義了全域性異常對映,那麼會對所有的Action生效,反之定義了局部異常對映則會對當前Action生效,

如果在全域性區域和區域性區域定義了相同的異常對映,首先去區域性異常區域找result結果頁面,如果找到了,則直接跳轉到錯誤結果頁面,不管全域性有沒有相同的結果,都被區域性所覆蓋,如果在區域性區域沒找到,則去全域性區域找。