Struts的異常處理機制

Struts的異常處理機制

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

       總的來說,在struts新的版本中加入了對異常的處理,稱之爲:Exception Handling,標誌着作爲一個整體的解決框架,struts原來越趨於成熟。

       通常來說,以前在用struts開發的過程中,對於異常的處理,主要是採用手動處理的方式:如通過try/catch等等捕獲異常,然後定製個性化的比較詳細的錯誤信息放進ActionError中,然後在具體的返回頁面中把這些錯誤信息反饋給用戶(包括開發員)。異常原始的信息不管是最終用戶還是開發員都是不希望看到的。

 

       下面着重講一下在struts中是如何通過配置文件來解決異常。

 

       Struts中的Exception Handleing不難,簡單高效是業內給其的一個比較好的評價。

 

       通過配置文件(主要是struts-config.xml)來定製異常處理,就象定義formbean一樣,定製異常也有兩種方法,姑且把它分爲:“全局異常”和“局部異常”。

 

       全局異常,定義方法如下:

……

……

    <global-exceptions>

            <exception key="expired.InvalidItemsCatalogName"                        type="com.iplateau.jshop.common.waf.exceptions.InvalidiItemsCatalogNameException"

                       scope="request"

                       path="error.jsp"/>           

</global-exceptions>

……

……

上述代碼在struts-config.xml中定義了一個全局異常,它的作用是拋出InvalidiItemsCatalogNameException(本處的意思是當在添加商品分類的時候發現該類別已經存在)異常的時候返回到error.jsp中,並且攜帶自定的比較規範的異常信息expired.InvalidItemsCatalogName,expired.InvalidItemsCatalogName可以在應用程序的資源配置文件中找到,如:

expired.InvalidItemsCatalogName=你要添加的商品類別已經存在,請添加新的類別!

 

局部異常,定義方法如下:

 

……

……

<action-mappings>

    <action path=”/addItemsCatalogAction”

            type=”com.iplateau.jsop.action.ItemsCatalogAction”

            name=”itemsCatalogForm”>

        <exception key=” expired.InvalidItemsCatalogName”

type=” com.iplateau.jshop.common.waf.exceptions.InvalidiItemsCatalogNameException”

path=”/error.jsp”/>

 

        <forward name=”success” path=”***Layout(此處採用Tiles進行輔助開發)”/>

        </ation>

</action-mappings>

……

……

(關於Tiles的內容參看我的另一篇文章“Struts使用Tiles輔助開發”)

 

 

下面我們把關注的目光放在具體action裏,看看struts是如何進行異常處理的

 

ItemsCatalogAction.java

 

package com.iplateau.jshop.action.ItemsCatalogAction

 

import com.iplateau.jshop.business.ItemsCatalogMap;

import com.iplateau.jshop.action.ItemsCatalogForm;

import ***;

 

public class ItemsCatalogAction extends BaseAction {

        public ActionForward execute(

        ActionMapping mapping,

        ActionForm form,

        HttpServletRequest request,

        HttpServletResponse response)

        throws Exception {

        String flg=”error”;

        String act=request.getParameter(“act”);

        ItemsCatalogMap map=new ItemsCatalogMap();

ItemsCatalogForm thisform=( ItemsCatalogForm)form;

        // ItemsCatalogMap爲具體的處理商品類別的類

        If(act.equals(“create”)){

        map.validateNameOfCatalog(thisform);

        map.create(thisform);

        flg=”success”;

        return mapping.findForward(flg);

}else{

return mapping.findForward(flg);

}

}

 

}

上便是一個簡單的action,其中用act的具體內容來判斷此時的action要處理的操作,如actcteate的時候,處理的是商品類別的添加等等。

看了上邊的代碼,可以瞭解,在調用具體的業務類進行添加商品類別以前先要判斷此時要添加的商品類別的合法性,如:

調用map.validateNameOfCatalog(thisform);

其中在ItemsCatalogMap定義的validateNameOfCatalog方法拋出InvalidiItemsCatalogNameException。

 

下面讓我們運行一下添加商品類別的例子,如果此時數據庫中已經存在“牛奶製品”這個商品類別,而我們又要添加此類別的時候,程序如我們預想的一樣轉到error.jsp並且顯示了我們要先是的錯誤信息:你要添加的商品類別已經存在,請添加新的類別!

 

其實就這麼簡單,我們的定製的異常在程序中並不需要用try/catch來捕獲,一旦出現了我們已經定義的異常那麼就會轉到相應得頁面,並且攜帶定製的信息。

 

還記得在struts先前的版本中我們的請求都是通過action的perform來處理,可是現在都要通過execute來處理,就其原因一個很重要的就是“成全”Exception Handling。爲什麼呢?

因爲perform在聲明的時候僅僅拋出IOException 和ServletException,這遠遠不能滿足Exception Handling的要求,那麼讓我們看看execute是怎樣的:它籠統的拋出Exception(所有異常的父類)

 

上面的闡述只是一個引子,而且默認struts的異常是通過org.apache.struts.action. ExceptionHandler來處理的,你可以定義自己的處理方式,只要繼承它並實現其中的execute方法,這個方法在ExceptionHandler的定義如下:

    public ActionForward execute(Exception ex,

                                 ExceptionConfig ae,

                                 ActionMapping mapping,

                                 ActionForm formInstance,

                                 HttpServletRequest request,

                                 HttpServletResponse response)

        throws ServletException

 

具體而且專業的分析Exception Handling的內容,請參看《Programming Jakarta Struts》第10章——這本書的電子版網上很多地方可以下載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章