Struts的異常處理機制 (轉)

gugu99發表於2007-08-16
Struts的異常處理機制 (轉)[@more@]

的異常處理機制

 :namespace prefix = o ns = "urn:schemas--com::office" />

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

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

 

  下面著重講一下在struts中是如何透過來解決異常。

 

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

 

  透過配置檔案(主要是struts-config.xml)來定製異常處理,就象定義formbean一樣,定製異常也有兩種方法,姑且把它分為:“全域性異常”和“區域性異常”。

 

  全域性異常,定義方法如下:

……

……

 

 

  pe="request"

  path="error."/> 

……

……

上述程式碼在struts-config.xml中定義了一個全域性異常,它的作用是丟擲InvalidiItemsCatalogNameException(本處的意思是當在新增商品分類的時候發現該類別已經存在)異常的時候返回到error.jsp中,並且攜帶自定的比較規範的異常資訊expired.InvalidItemsCatalogName,expired.InvalidItemsCatalogName可以在應用的資源配置檔案中找到,如:

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

 

區域性異常,定義方法如下:

 

……

……

 

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

    name=”itemsCatalogForm”>

   

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

path=”/error.jsp”/>

 

   

 

……

……

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

 

 

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

 

ItemsCatalogAction.

 

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,

    ActionFoform,

    HttpRequest request,

    HttpServletResponse response)

    throws Exception {

    String flg=”error”;

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

    ItemsCatalogMap map=new ItemsCatalogMap();

ItemsCatalogForm thiorm=( 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要處理的操作,如act為cteate的時候,處理的是商品類別的新增等等。

看了上邊的程式碼,可以瞭解,在具體的業務類進行新增商品類別以前先要判斷此時要新增的商品類別的合法性,如:

呼叫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..struts.action. ExceptionHandler來處理的,你可以定義自己的處理方式,只要繼承它並實現其中的execute方法,這個方法在ExceptionHandler的定義如下:

  public ActionForward execute(Exception ex,

  ExceptionConfig ae,

  ActionMapping mapping,

  ActionForm fonstance,

  HttpServletRequest request,

  HttpServletResponse response)

  throws ServletException

 

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-960858/,如需轉載,請註明出處,否則將追究法律責任。

相關文章