程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts開發過程中的異常處理機制

Struts開發過程中的異常處理機制

編輯:關於JAVA

總的來說,在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>

下面我們把關注的目光放在具體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要處理的操作,如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.apache.struts.action. ExceptionHandler來處理的,你可以定義自己的處理方式,只要繼承它並實現其中的execute方法,這個方法在ExceptionHandler的定義如下:

public ActionForward execute
(Exception ex,
ExceptionConfig ae,
ActionMapping mapping,
ActionForm formInstance,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved