国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

運用Jakarta Struts的七大實戰(zhàn)心法(1)

2019-11-17 05:54:29
字體:
供稿:網(wǎng)友

編者按:當(dāng)作者 ChUCk Cavaness(著有《PRogramming Jakarta Struts》一書)所在的網(wǎng)絡(luò)公司決定采用Struts框架之后,Chuck曾經(jīng)花費了好幾個月來研究如何用它來構(gòu)建公司的應(yīng)用系統(tǒng)。本文敘述的正是作者在運用Struts過程中來之不易的若干經(jīng)驗和心得。假如你是個負(fù)責(zé)通過jsp和servlet開發(fā)Web應(yīng)用的java程序員,并且也正在考慮采用基于Struts的構(gòu)建方法的話,那么你會在這里發(fā)現(xiàn)很多頗有見地同時也很有價值的信息。

1. 只在必要的時候才考慮擴展Struts框架

一個好的framework有很多優(yōu)點,首先,它必須能夠滿足用戶的可預(yù)見的需求。為此 Struts為Web 應(yīng)用提供了一個通用的架構(gòu),這樣開發(fā)人員可以把精力集中在如何解決實際業(yè)務(wù)問題上。其次,一個好的framework還必須能夠在適當(dāng)?shù)牡胤教峁U展接口,以便應(yīng)用程序能擴展該框架來更好的適應(yīng)使用者的實際需要。

假如Struts framework在任何場合,任何項目中都能很好的滿足需求,那真是太棒了。但是實際上,沒有一個框架聲稱能做到這一點。一定會有一些特定的應(yīng)用需求是框架的開發(fā)者們無法預(yù)見到的。因此,最好的辦法就是提供足夠的擴展接口,使得開發(fā)工程師能夠調(diào)整struts來更好的符合他們的非凡要求。

在Struts framework中有很多地方可供擴展和定制。幾乎所有的配置類都能被替換為某個用戶定制的版本,這只要簡單的修改一下Struts的配置文件就可以做到。

其他組件如ActionServlet和 RequestProcessor 也能用自定義的版本代替. 甚至連Struts 1.1里才有的新特性也是按照擴展的原則來設(shè)計的。例如,在異常處理機制中就答應(yīng)用戶定制異常處理的句柄,以便更好的對應(yīng)用系統(tǒng)發(fā)生的錯誤做出響應(yīng)。

作為框架的這種可調(diào)整特性在它更適合你的應(yīng)用的同時也在很大的程度上影響了項目開發(fā)的效果。首先,由于您的應(yīng)用是基于一個現(xiàn)有的成熟的、穩(wěn)定的framework如Struts,測試過程中發(fā)現(xiàn)的錯誤數(shù)量將會大大減少,同時也能縮短開發(fā)時間和減少資源的投入。因為你不再需要投入開發(fā)力量用于編寫基礎(chǔ)框架的代碼了。

然而, 實現(xiàn)更多的功能是要花費更大的代價的。我們必須小心避免不必要的濫用擴展性能, Struts是由核心包加上很多工具包構(gòu)成的,它們已經(jīng)提供了很多已經(jīng)實現(xiàn)的功能。因此不要盲目的擴展Struts框架,要先確定能不能采用其他方法使用現(xiàn)有的功能來實現(xiàn)。 在決定編寫擴展代碼前務(wù)必要確認(rèn)Struts的確沒有實現(xiàn)你要的功能。否則重復(fù)的功能會導(dǎo)致混亂將來還得花費額外的精力清除它。

2. 使用異常處理聲明

要定義應(yīng)用程序的邏輯流程,成熟的經(jīng)驗是推薦在代碼之外,用配置的方法來實現(xiàn),而不是寫死在程序代碼中的。在J2EE中,這樣的例子比比皆是。從實現(xiàn)EJB的安全性和事務(wù)性行為到描述JMS消息和目的地之間的關(guān)系,很多運行時的處理流程都是可以在程序之外定義的。

Struts 創(chuàng)建者從一開始就采用這種方法,通過配置Struts的配置文件來定制應(yīng)用系統(tǒng)運行時的各個方面。這一點在版本1.1的新特性上得到延續(xù),包括新的異常處理功能。在Struts framework以前的版本中,開發(fā)人員不得不自己處理Struts應(yīng)用中發(fā)生的錯誤情況。在最新的版本中,情況大大的改觀了,Struts Framework提供了內(nèi)置的一個稱為 ExceptionHandler 的類, 用于系統(tǒng)缺省處理action類運行中產(chǎn)生的錯誤。這也是在上一個技巧中我們提到的framework許多可擴展接口之一。

Struts缺省的 ExceptionHandler類會生成一個ActionError對象并保存在適當(dāng)?shù)姆秶╯cope)對象中。這樣就答應(yīng)JSP頁面使用錯誤類來提醒用戶出現(xiàn)什么問題。假如你認(rèn)為這不能滿足你的需求,那么可以很方便的實現(xiàn)你自己的ExcepionHandler類。

具體定制異常處理的方法和機制

要定制自己的異常處理機制,第一步是繼續(xù)org.apache.struts.action.ExceptionHandler類。這個類有2個方法可以覆蓋,一個是excute()另外一個是storeException(). 在多數(shù)情況下,只需要覆蓋其中的excute()方法。下面是ExceptionHandler類的excute()方法聲明:

public ActionForward execute( Exception ex,

ExceptionConfig exConfig,

ActionMapping mapping,

ActionForm formInstance,

HttpServletRequest request,

HttpServletResponse response

) throws ServletException;

正如你看到的,該方法有好幾個參數(shù),其中包括原始的異常。方法返回一個ActionForward對象,用于異常處理結(jié)束后將controller類帶到請求必須轉(zhuǎn)發(fā)的地方去。

當(dāng)然您可以實現(xiàn)任何處理,但一般而言,我們必須檢查拋出的異常,并針對該類型的異常進行特定的處理。缺省的,系統(tǒng)的異常處理功能是創(chuàng)建一個出錯信息,同時把請求轉(zhuǎn)發(fā)到配置文件中指定的地方去。 定制異常處理的一個常見的例子是處理嵌套異常。假設(shè)該異常包含有嵌套異常,這些嵌套異常又包含了其他異常,因此我們必須覆蓋原來的execute()方法,對每個異常編寫出錯信息。

一旦你創(chuàng)建了自己的ExceptionHandler 類,就應(yīng)該在Struts配置文件中的部分聲明這個類,以便讓Struts知道改用你自定義的異常處理取代缺省的異常處理.

可以配置你自己的ExceptionHandler 類是用于Action Mapping特定的部分還是所有的Action對象。假如是用于Action Mapping特定的部分就在<action>元素中配置。假如想讓這個類可用于所有的Action對象,可以在<global-sections> 元素中指定。例如,假設(shè)我們創(chuàng)建了異常處理類CustomizedExceptionHandler用于所有的Action類, <global-exceptions>元素定義如下所示:


<global-exceptions>

<exception

handler="com.cavaness.storefront.CustomizedExceptionHandler"

key="global.error.message"

path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

</global-exceptions>

在<exception />元素中可以對很多屬性進行設(shè)置。在本文中,最重要的屬性莫過于handler屬性, handler屬性的值就是自定義的繼續(xù)了ExceptionHandler類的子類的全名。 假如該屬性沒有定義,Struts會采用自己的缺省值。當(dāng)然,其他的屬性也很重要,但假如想覆蓋缺省的異常處理的話,handler無疑是最重要的屬性。

最后必須指出的一點是,你可以有不同的異常處理類來處理不同的異常。在上面的例子中,CustomizedExceptionHandler用來處理任何java.lang.Exception的子類. 其實,你也可以定義多個異常處理類,每一個專門處理不同的異常樹。下面的xml片斷解釋了如何配置以實現(xiàn)這一點。

<global-exceptions>

<exception

handler="com.cavaness.storefront.CustomizedExceptionHandler"

key="global.error.message"

path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

<exception

handler="com.cavaness.storefront.SecurityExceptionHandler"

key="security.error.message"

path="/login.jsp"

scope="request"

type="com.cavaness.storefront.SecurityException"/>

</global-exceptions>

在這里,一旦有異常拋出,struts framework將試圖在配置文件中找到ExceptionHandler,假如沒有找到,那么struts將沿著該異常的父類鏈一層層往上找直到發(fā)現(xiàn)匹配的為止。因此,我們可以定義一個層次型的異常處理關(guān)系結(jié)構(gòu),在配置文件中已經(jīng)體現(xiàn)了這一點。

3. 使用應(yīng)用模塊(application Modules)

Struts 1.1的一個新特性是應(yīng)用模塊的概念。應(yīng)用模塊答應(yīng)將單個Struts應(yīng)用劃分成幾個模塊,每個模塊有自己的Struts配置文件,JSP頁面,Action等等。這個新特性是為了解決大中型的開發(fā)隊伍抱怨最多的一個問題,即為了更好的支持并行開發(fā)答應(yīng)多個配置文件而不是單個配置文件。

注:在早期的beta版本中,該特性被稱為子應(yīng)用(sub-applications),最近的改名目的是為了更多地反映它們在邏輯上的分工。

顯然,當(dāng)很多開發(fā)人員一起參加一個項目時,單個的Struts配置文件很輕易引起資源沖突。應(yīng)用模塊答應(yīng)Struts按照功能要求進行劃分,許多情況已經(jīng)證實這樣更貼近實際。例如,假設(shè)我們要開發(fā)一個典型的商店應(yīng)用程序。可以將組成部分劃分成模塊比如catalog(商品目錄), customer(顧客), customer service(顧客服務(wù)), order(訂單)等。每個模塊可以分布到不同的目錄下,這樣各部分的資源很輕易定位,有助于開發(fā)和部署。圖1 顯示了該應(yīng)用的目錄結(jié)構(gòu)。

圖 1. 一個典型的商店應(yīng)用程序的目錄結(jié)構(gòu)

運用Jakarta Struts的七大實戰(zhàn)心法(1)(圖一)

注:假如你無需將項目劃分成多個模塊,Struts框架支持一個缺省的應(yīng)用模塊。這就使得應(yīng)用程序也可以在1.0版本下創(chuàng)建,具有可移植性,因為應(yīng)用程序會自動作為缺省的應(yīng)用模塊。

為了使用多應(yīng)用模塊功能,必須執(zhí)行以下幾個預(yù)備步驟:

• 為每個應(yīng)用模塊創(chuàng)建獨立的Struts配置文件。

• 配置Web 部署描述符 Web.xml文件。

• 使用org.apache.struts.actions.SwitchAction 來實現(xiàn)程序在模塊之間的跳轉(zhuǎn).

更多的請看:http://www.QQread.com/windows/2003/index.Html

編者按:當(dāng)作者 Chuck Cavaness(著有《Programming Jakarta Struts》一書)所在的網(wǎng)絡(luò)公司決定采用Struts框架之后,Chuck曾經(jīng)花費了好幾個月來研究如何用它來構(gòu)建公司的應(yīng)用系統(tǒng)。本文敘述的正是作者在運用Struts過程中來之不易的若干經(jīng)驗和心得。假如你是個負(fù)責(zé)通過jsp和servlet開發(fā)Web應(yīng)用的Java程序員,并且也正在考慮采用基于Struts的構(gòu)建方法的話,那么你會在這里發(fā)現(xiàn)很多頗有見地同時也很有價值的信息。

1. 只在必要的時候才考慮擴展Struts框架

一個好的framework有很多優(yōu)點,首先,它必須能夠滿足用戶的可預(yù)見的需求。為此 Struts為Web 應(yīng)用提供了一個通用的架構(gòu),這樣開發(fā)人員可以把精力集中在如何解決實際業(yè)務(wù)問題上。其次,一個好的framework還必須能夠在適當(dāng)?shù)牡胤教峁U展接口,以便應(yīng)用程序能擴展該框架來更好的適應(yīng)使用者的實際需要。


假如Struts framework在任何場合,任何項目中都能很好的滿足需求,那真是太棒了。但是實際上,沒有一個框架聲稱能做到這一點。一定會有一些特定的應(yīng)用需求是框架的開發(fā)者們無法預(yù)見到的。因此,最好的辦法就是提供足夠的擴展接口,使得開發(fā)工程師能夠調(diào)整struts來更好的符合他們的非凡要求。

在Struts framework中有很多地方可供擴展和定制。幾乎所有的配置類都能被替換為某個用戶定制的版本,這只要簡單的修改一下Struts的配置文件就可以做到。

其他組件如ActionServlet和 RequestProcessor 也能用自定義的版本代替. 甚至連Struts 1.1里才有的新特性也是按照擴展的原則來設(shè)計的。例如,在異常處理機制中就答應(yīng)用戶定制異常處理的句柄,以便更好的對應(yīng)用系統(tǒng)發(fā)生的錯誤做出響應(yīng)。

作為框架的這種可調(diào)整特性在它更適合你的應(yīng)用的同時也在很大的程度上影響了項目開發(fā)的效果。首先,由于您的應(yīng)用是基于一個現(xiàn)有的成熟的、穩(wěn)定的framework如Struts,測試過程中發(fā)現(xiàn)的錯誤數(shù)量將會大大減少,同時也能縮短開發(fā)時間和減少資源的投入。因為你不再需要投入開發(fā)力量用于編寫基礎(chǔ)框架的代碼了。

然而, 實現(xiàn)更多的功能是要花費更大的代價的。我們必須小心避免不必要的濫用擴展性能, Struts是由核心包加上很多工具包構(gòu)成的,它們已經(jīng)提供了很多已經(jīng)實現(xiàn)的功能。因此不要盲目的擴展Struts框架,要先確定能不能采用其他方法使用現(xiàn)有的功能來實現(xiàn)。 在決定編寫擴展代碼前務(wù)必要確認(rèn)Struts的確沒有實現(xiàn)你要的功能。否則重復(fù)的功能會導(dǎo)致混亂將來還得花費額外的精力清除它。

2. 使用異常處理聲明

要定義應(yīng)用程序的邏輯流程,成熟的經(jīng)驗是推薦在代碼之外,用配置的方法來實現(xiàn),而不是寫死在程序代碼中的。在J2EE中,這樣的例子比比皆是。從實現(xiàn)EJB的安全性和事務(wù)性行為到描述JMS消息和目的地之間的關(guān)系,很多運行時的處理流程都是可以在程序之外定義的。

Struts 創(chuàng)建者從一開始就采用這種方法,通過配置Struts的配置文件來定制應(yīng)用系統(tǒng)運行時的各個方面。這一點在版本1.1的新特性上得到延續(xù),包括新的異常處理功能。在Struts framework以前的版本中,開發(fā)人員不得不自己處理Struts應(yīng)用中發(fā)生的錯誤情況。在最新的版本中,情況大大的改觀了,Struts Framework提供了內(nèi)置的一個稱為 ExceptionHandler 的類, 用于系統(tǒng)缺省處理action類運行中產(chǎn)生的錯誤。這也是在上一個技巧中我們提到的framework許多可擴展接口之一。

Struts缺省的 ExceptionHandler類會生成一個ActionError對象并保存在適當(dāng)?shù)姆秶╯cope)對象中。這樣就答應(yīng)JSP頁面使用錯誤類來提醒用戶出現(xiàn)什么問題。假如你認(rèn)為這不能滿足你的需求,那么可以很方便的實現(xiàn)你自己的ExcepionHandler類。

具體定制異常處理的方法和機制

要定制自己的異常處理機制,第一步是繼續(xù)org.apache.struts.action.ExceptionHandler類。這個類有2個方法可以覆蓋,一個是excute()另外一個是storeException(). 在多數(shù)情況下,只需要覆蓋其中的excute()方法。下面是ExceptionHandler類的excute()方法聲明:

public ActionForward execute( Exception ex,

ExceptionConfig exConfig,

ActionMapping mapping,

ActionForm formInstance,

HttpServletRequest request,

HttpServletResponse response

) throws ServletException;

正如你看到的,該方法有好幾個參數(shù),其中包括原始的異常。方法返回一個ActionForward對象,用于異常處理結(jié)束后將controller類帶到請求必須轉(zhuǎn)發(fā)的地方去。

當(dāng)然您可以實現(xiàn)任何處理,但一般而言,我們必須檢查拋出的異常,并針對該類型的異常進行特定的處理。缺省的,系統(tǒng)的異常處理功能是創(chuàng)建一個出錯信息,同時把請求轉(zhuǎn)發(fā)到配置文件中指定的地方去。 定制異常處理的一個常見的例子是處理嵌套異常。假設(shè)該異常包含有嵌套異常,這些嵌套異常又包含了其他異常,因此我們必須覆蓋原來的execute()方法,對每個異常編寫出錯信息。

一旦你創(chuàng)建了自己的ExceptionHandler 類,就應(yīng)該在Struts配置文件中的部分聲明這個類,以便讓Struts知道改用你自定義的異常處理取代缺省的異常處理.

可以配置你自己的ExceptionHandler 類是用于Action Mapping特定的部分還是所有的Action對象。假如是用于Action Mapping特定的部分就在<action>元素中配置。假如想讓這個類可用于所有的Action對象,可以在<global-sections> 元素中指定。例如,假設(shè)我們創(chuàng)建了異常處理類CustomizedExceptionHandler用于所有的Action類, <global-exceptions>元素定義如下所示:

<global-exceptions>

<exception

handler="com.cavaness.storefront.CustomizedExceptionHandler"

key="global.error.message"

path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

</global-exceptions>

在<exception />元素中可以對很多屬性進行設(shè)置。在本文中,最重要的屬性莫過于handler屬性, handler屬性的值就是自定義的繼續(xù)了ExceptionHandler類的子類的全名。 假如該屬性沒有定義,Struts會采用自己的缺省值。當(dāng)然,其他的屬性也很重要,但假如想覆蓋缺省的異常處理的話,handler無疑是最重要的屬性。

最后必須指出的一點是,你可以有不同的異常處理類來處理不同的異常。在上面的例子中,CustomizedExceptionHandler用來處理任何java.lang.Exception的子類. 其實,你也可以定義多個異常處理類,每一個專門處理不同的異常樹。下面的XML片斷解釋了如何配置以實現(xiàn)這一點。


<global-exceptions>

<exception

handler="com.cavaness.storefront.CustomizedExceptionHandler"

key="global.error.message"

path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

<exception

handler="com.cavaness.storefront.SecurityExceptionHandler"

key="security.error.message"

path="/login.jsp"

scope="request"

type="com.cavaness.storefront.SecurityException"/>

</global-exceptions>

在這里,一旦有異常拋出,struts framework將試圖在配置文件中找到ExceptionHandler,假如沒有找到,那么struts將沿著該異常的父類鏈一層層往上找直到發(fā)現(xiàn)匹配的為止。因此,我們可以定義一個層次型的異常處理關(guān)系結(jié)構(gòu),在配置文件中已經(jīng)體現(xiàn)了這一點。

3. 使用應(yīng)用模塊(Application Modules)

Struts 1.1的一個新特性是應(yīng)用模塊的概念。應(yīng)用模塊答應(yīng)將單個Struts應(yīng)用劃分成幾個模塊,每個模塊有自己的Struts配置文件,JSP頁面,Action等等。這個新特性是為了解決大中型的開發(fā)隊伍抱怨最多的一個問題,即為了更好的支持并行開發(fā)答應(yīng)多個配置文件而不是單個配置文件。

注:在早期的beta版本中,該特性被稱為子應(yīng)用(sub-applications),最近的改名目的是為了更多地反映它們在邏輯上的分工。

顯然,當(dāng)很多開發(fā)人員一起參加一個項目時,單個的Struts配置文件很輕易引起資源沖突。應(yīng)用模塊答應(yīng)Struts按照功能要求進行劃分,許多情況已經(jīng)證實這樣更貼近實際。例如,假設(shè)我們要開發(fā)一個典型的商店應(yīng)用程序。可以將組成部分劃分成模塊比如catalog(商品目錄), customer(顧客), customer service(顧客服務(wù)), order(訂單)等。每個模塊可以分布到不同的目錄下,這樣各部分的資源很輕易定位,有助于開發(fā)和部署。圖1 顯示了該應(yīng)用的目錄結(jié)構(gòu)。

圖 1. 一個典型的商店應(yīng)用程序的目錄結(jié)構(gòu)

運用Jakarta Struts的七大實戰(zhàn)心法(1)(圖一)

注:假如你無需將項目劃分成多個模塊,Struts框架支持一個缺省的應(yīng)用模塊。這就使得應(yīng)用程序也可以在1.0版本下創(chuàng)建,具有可移植性,因為應(yīng)用程序會自動作為缺省的應(yīng)用模塊。

為了使用多應(yīng)用模塊功能,必須執(zhí)行以下幾個預(yù)備步驟:

• 為每個應(yīng)用模塊創(chuàng)建獨立的Struts配置文件。

• 配置Web 部署描述符 Web.xml文件。

• 使用org.apache.struts.actions.SwitchAction 來實現(xiàn)程序在模塊之間的跳轉(zhuǎn).

編者按:當(dāng)作者 Chuck Cavaness(著有《Programming Jakarta Struts》一書)所在的網(wǎng)絡(luò)公司決定采用Struts框架之后,Chuck曾經(jīng)花費了好幾個月來研究如何用它來構(gòu)建公司的應(yīng)用系統(tǒng)。本文敘述的正是作者在運用Struts過程中來之不易的若干經(jīng)驗和心得。假如你是個負(fù)責(zé)通過jsp和servlet開發(fā)Web應(yīng)用的Java程序員,并且也正在考慮采用基于Struts的構(gòu)建方法的話,那么你會在這里發(fā)現(xiàn)很多頗有見地同時也很有價值的信息。

1. 只在必要的時候才考慮擴展Struts框架

一個好的framework有很多優(yōu)點,首先,它必須能夠滿足用戶的可預(yù)見的需求。為此 Struts為Web 應(yīng)用提供了一個通用的架構(gòu),這樣開發(fā)人員可以把精力集中在如何解決實際業(yè)務(wù)問題上。其次,一個好的framework還必須能夠在適當(dāng)?shù)牡胤教峁U展接口,以便應(yīng)用程序能擴展該框架來更好的適應(yīng)使用者的實際需要。

假如Struts framework在任何場合,任何項目中都能很好的滿足需求,那真是太棒了。但是實際上,沒有一個框架聲稱能做到這一點。一定會有一些特定的應(yīng)用需求是框架的開發(fā)者們無法預(yù)見到的。因此,最好的辦法就是提供足夠的擴展接口,使得開發(fā)工程師能夠調(diào)整struts來更好的符合他們的非凡要求。

在Struts framework中有很多地方可供擴展和定制。幾乎所有的配置類都能被替換為某個用戶定制的版本,這只要簡單的修改一下Struts的配置文件就可以做到。

其他組件如ActionServlet和 RequestProcessor 也能用自定義的版本代替. 甚至連Struts 1.1里才有的新特性也是按照擴展的原則來設(shè)計的。例如,在異常處理機制中就答應(yīng)用戶定制異常處理的句柄,以便更好的對應(yīng)用系統(tǒng)發(fā)生的錯誤做出響應(yīng)。

作為框架的這種可調(diào)整特性在它更適合你的應(yīng)用的同時也在很大的程度上影響了項目開發(fā)的效果。首先,由于您的應(yīng)用是基于一個現(xiàn)有的成熟的、穩(wěn)定的framework如Struts,測試過程中發(fā)現(xiàn)的錯誤數(shù)量將會大大減少,同時也能縮短開發(fā)時間和減少資源的投入。因為你不再需要投入開發(fā)力量用于編寫基礎(chǔ)框架的代碼了。

然而, 實現(xiàn)更多的功能是要花費更大的代價的。我們必須小心避免不必要的濫用擴展性能, Struts是由核心包加上很多工具包構(gòu)成的,它們已經(jīng)提供了很多已經(jīng)實現(xiàn)的功能。因此不要盲目的擴展Struts框架,要先確定能不能采用其他方法使用現(xiàn)有的功能來實現(xiàn)。 在決定編寫擴展代碼前務(wù)必要確認(rèn)Struts的確沒有實現(xiàn)你要的功能。否則重復(fù)的功能會導(dǎo)致混亂將來還得花費額外的精力清除它。

2. 使用異常處理聲明

要定義應(yīng)用程序的邏輯流程,成熟的經(jīng)驗是推薦在代碼之外,用配置的方法來實現(xiàn),而不是寫死在程序代碼中的。在J2EE中,這樣的例子比比皆是。從實現(xiàn)EJB的安全性和事務(wù)性行為到描述JMS消息和目的地之間的關(guān)系,很多運行時的處理流程都是可以在程序之外定義的。

Struts 創(chuàng)建者從一開始就采用這種方法,通過配置Struts的配置文件來定制應(yīng)用系統(tǒng)運行時的各個方面。這一點在版本1.1的新特性上得到延續(xù),包括新的異常處理功能。在Struts framework以前的版本中,開發(fā)人員不得不自己處理Struts應(yīng)用中發(fā)生的錯誤情況。在最新的版本中,情況大大的改觀了,Struts Framework提供了內(nèi)置的一個稱為 ExceptionHandler 的類, 用于系統(tǒng)缺省處理action類運行中產(chǎn)生的錯誤。這也是在上一個技巧中我們提到的framework許多可擴展接口之一。


Struts缺省的 ExceptionHandler類會生成一個ActionError對象并保存在適當(dāng)?shù)姆秶╯cope)對象中。這樣就答應(yīng)JSP頁面使用錯誤類來提醒用戶出現(xiàn)什么問題。假如你認(rèn)為這不能滿足你的需求,那么可以很方便的實現(xiàn)你自己的ExcepionHandler類。

具體定制異常處理的方法和機制

要定制自己的異常處理機制,第一步是繼續(xù)org.apache.struts.action.ExceptionHandler類。這個類有2個方法可以覆蓋,一個是excute()另外一個是storeException(). 在多數(shù)情況下,只需要覆蓋其中的excute()方法。下面是ExceptionHandler類的excute()方法聲明:

public ActionForward execute( Exception ex,

ExceptionConfig exConfig,

ActionMapping mapping,

ActionForm formInstance,

HttpServletRequest request,

HttpServletResponse response

) throws ServletException;

正如你看到的,該方法有好幾個參數(shù),其中包括原始的異常。方法返回一個ActionForward對象,用于異常處理結(jié)束后將controller類帶到請求必須轉(zhuǎn)發(fā)的地方去。

當(dāng)然您可以實現(xiàn)任何處理,但一般而言,我們必須檢查拋出的異常,并針對該類型的異常進行特定的處理。缺省的,系統(tǒng)的異常處理功能是創(chuàng)建一個出錯信息,同時把請求轉(zhuǎn)發(fā)到配置文件中指定的地方去。 定制異常處理的一個常見的例子是處理嵌套異常。假設(shè)該異常包含有嵌套異常,這些嵌套異常又包含了其他異常,因此我們必須覆蓋原來的execute()方法,對每個異常編寫出錯信息。

一旦你創(chuàng)建了自己的ExceptionHandler 類,就應(yīng)該在Struts配置文件中的部分聲明這個類,以便讓Struts知道改用你自定義的異常處理取代缺省的異常處理.

可以配置你自己的ExceptionHandler 類是用于Action Mapping特定的部分還是所有的Action對象。假如是用于Action Mapping特定的部分就在<action>元素中配置。假如想讓這個類可用于所有的Action對象,可以在<global-sections> 元素中指定。例如,假設(shè)我們創(chuàng)建了異常處理類CustomizedExceptionHandler用于所有的Action類, <global-exceptions>元素定義如下所示:

<global-exceptions>

<exception

handler="com.cavaness.storefront.CustomizedExceptionHandler"

key="global.error.message"

path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

</global-exceptions>

在<exception />元素中可以對很多屬性進行設(shè)置。在本文中,最重要的屬性莫過于handler屬性, handler屬性的值就是自定義的繼續(xù)了ExceptionHandler類的子類的全名。 假如該屬性沒有定義,Struts會采用自己的缺省值。當(dāng)然,其他的屬性也很重要,但假如想覆蓋缺省的異常處理的話,handler無疑是最重要的屬性。

最后必須指出的一點是,你可以有不同的異常處理類來處理不同的異常。在上面的例子中,CustomizedExceptionHandler用來處理任何java.lang.Exception的子類. 其實,你也可以定義多個異常處理類,每一個專門處理不同的異常樹。下面的XML片斷解釋了如何配置以實現(xiàn)這一點。

<global-exceptions>

<exception

handler="com.cavaness.storefront.CustomizedExceptionHandler"

key="global.error.message"

path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

<exception

handler="com.cavaness.storefront.SecurityExceptionHandler"

key="security.error.message"

path="/login.jsp"

scope="request"

type="com.cavaness.storefront.SecurityException"/>

</global-exceptions>

在這里,一旦有異常拋出,struts framework將試圖在配置文件中找到ExceptionHandler,假如沒有找到,那么struts將沿著該異常的父類鏈一層層往上找直到發(fā)現(xiàn)匹配的為止。因此,我們可以定義一個層次型的異常處理關(guān)系結(jié)構(gòu),在配置文件中已經(jīng)體現(xiàn)了這一點。

3. 使用應(yīng)用模塊(Application Modules)

Struts 1.1的一個新特性是應(yīng)用模塊的概念。應(yīng)用模塊答應(yīng)將單個Struts應(yīng)用劃分成幾個模塊,每個模塊有自己的Struts配置文件,JSP頁面,Action等等。這個新特性是為了解決大中型的開發(fā)隊伍抱怨最多的一個問題,即為了更好的支持并行開發(fā)答應(yīng)多個配置文件而不是單個配置文件。

注:在早期的beta版本中,該特性被稱為子應(yīng)用(sub-applications),最近的改名目的是為了更多地反映它們在邏輯上的分工。

顯然,當(dāng)很多開發(fā)人員一起參加一個項目時,單個的Struts配置文件很輕易引起資源沖突。應(yīng)用模塊答應(yīng)Struts按照功能要求進行劃分,許多情況已經(jīng)證實這樣更貼近實際。例如,假設(shè)我們要開發(fā)一個典型的商店應(yīng)用程序。可以將組成部分劃分成模塊比如catalog(商品目錄), customer(顧客), customer service(顧客服務(wù)), order(訂單)等。每個模塊可以分布到不同的目錄下,這樣各部分的資源很輕易定位,有助于開發(fā)和部署。圖1 顯示了該應(yīng)用的目錄結(jié)構(gòu)。


圖 1. 一個典型的商店應(yīng)用程序的目錄結(jié)構(gòu)

運用Jakarta Struts的七大實戰(zhàn)心法(1)(圖一)

注:假如你無需將項目劃分成多個模塊,Struts框架支持一個缺省的應(yīng)用模塊。這就使得應(yīng)用程序也可以在1.0版本下創(chuàng)建,具有可移植性,因為應(yīng)用程序會自動作為缺省的應(yīng)用模塊。

為了使用多應(yīng)用模塊功能,必須執(zhí)行以下幾個預(yù)備步驟:

• 為每個應(yīng)用模塊創(chuàng)建獨立的Struts配置文件。

• 配置Web 部署描述符 Web.xml文件。

• 使用org.apache.struts.actions.SwitchAction 來實現(xiàn)程序在模塊之間的跳轉(zhuǎn).

編者按:當(dāng)作者 Chuck Cavaness(著有《Programming Jakarta Struts》一書)所在的網(wǎng)絡(luò)公司決定采用Struts框架之后,Chuck曾經(jīng)花費了好幾個月來研究如何用它來構(gòu)建公司的應(yīng)用系統(tǒng)。本文敘述的正是作者在運用Struts過程中來之不易的若干經(jīng)驗和心得。假如你是個負(fù)責(zé)通過jsp和servlet開發(fā)Web應(yīng)用的Java程序員,并且也正在考慮采用基于Struts的構(gòu)建方法的話,那么你會在這里發(fā)現(xiàn)很多頗有見地同時也很有價值的信息。

1. 只在必要的時候才考慮擴展Struts框架

一個好的framework有很多優(yōu)點,首先,它必須能夠滿足用戶的可預(yù)見的需求。為此 Struts為Web 應(yīng)用提供了一個通用的架構(gòu),這樣開發(fā)人員可以把精力集中在如何解決實際業(yè)務(wù)問題上。其次,一個好的framework還必須能夠在適當(dāng)?shù)牡胤教峁U展接口,以便應(yīng)用程序能擴展該框架來更好的適應(yīng)使用者的實際需要。

假如Struts framework在任何場合,任何項目中都能很好的滿足需求,那真是太棒了。但是實際上,沒有一個框架聲稱能做到這一點。一定會有一些特定的應(yīng)用需求是框架的開發(fā)者們無法預(yù)見到的。因此,最好的辦法就是提供足夠的擴展接口,使得開發(fā)工程師能夠調(diào)整struts來更好的符合他們的非凡要求。

在Struts framework中有很多地方可供擴展和定制。幾乎所有的配置類都能被替換為某個用戶定制的版本,這只要簡單的修改一下Struts的配置文件就可以做到。

其他組件如ActionServlet和 RequestProcessor 也能用自定義的版本代替. 甚至連Struts 1.1里才有的新特性也是按照擴展的原則來設(shè)計的。例如,在異常處理機制中就答應(yīng)用戶定制異常處理的句柄,以便更好的對應(yīng)用系統(tǒng)發(fā)生的錯誤做出響應(yīng)。

作為框架的這種可調(diào)整特性在它更適合你的應(yīng)用的同時也在很大的程度上影響了項目開發(fā)的效果。首先,由于您的應(yīng)用是基于一個現(xiàn)有的成熟的、穩(wěn)定的framework如Struts,測試過程中發(fā)現(xiàn)的錯誤數(shù)量將會大大減少,同時也能縮短開發(fā)時間和減少資源的投入。因為你不再需要投入開發(fā)力量用于編寫基礎(chǔ)框架的代碼了。

然而, 實現(xiàn)更多的功能是要花費更大的代價的。我們必須小心避免不必要的濫用擴展性能, Struts是由核心包加上很多工具包構(gòu)成的,它們已經(jīng)提供了很多已經(jīng)實現(xiàn)的功能。因此不要盲目的擴展Struts框架,要先確定能不能采用其他方法使用現(xiàn)有的功能來實現(xiàn)。 在決定編寫擴展代碼前務(wù)必要確認(rèn)Struts的確沒有實現(xiàn)你要的功能。否則重復(fù)的功能會導(dǎo)致混亂將來還得花費額外的精力清除它。

2. 使用異常處理聲明

要定義應(yīng)用程序的邏輯流程,成熟的經(jīng)驗是推薦在代碼之外,用配置的方法來實現(xiàn),而不是寫死在程序代碼中的。在J2EE中,這樣的例子比比皆是。從實現(xiàn)EJB的安全性和事務(wù)性行為到描述JMS消息和目的地之間的關(guān)系,很多運行時的處理流程都是可以在程序之外定義的。

Struts 創(chuàng)建者從一開始就采用這種方法,通過配置Struts的配置文件來定制應(yīng)用系統(tǒng)運行時的各個方面。這一點在版本1.1的新特性上得到延續(xù),包括新的異常處理功能。在Struts framework以前的版本中,開發(fā)人員不得不自己處理Struts應(yīng)用中發(fā)生的錯誤情況。在最新的版本中,情況大大的改觀了,Struts Framework提供了內(nèi)置的一個稱為 ExceptionHandler 的類, 用于系統(tǒng)缺省處理action類運行中產(chǎn)生的錯誤。這也是在上一個技巧中我們提到的framework許多可擴展接口之一。

Struts缺省的 ExceptionHandler類會生成一個ActionError對象并保存在適當(dāng)?shù)姆秶╯cope)對象中。這樣就答應(yīng)JSP頁面使用錯誤類來提醒用戶出現(xiàn)什么問題。假如你認(rèn)為這不能滿足你的需求,那么可以很方便的實現(xiàn)你自己的ExcepionHandler類。

具體定制異常處理的方法和機制

要定制自己的異常處理機制,第一步是繼續(xù)org.apache.struts.action.ExceptionHandler類。這個類有2個方法可以覆蓋,一個是excute()另外一個是storeException(). 在多數(shù)情況下,只需要覆蓋其中的excute()方法。下面是ExceptionHandler類的excute()方法聲明:

public ActionForward execute( Exception ex,

ExceptionConfig exConfig,

ActionMapping mapping,

ActionForm formInstance,

HttpServletRequest request,

HttpServletResponse response

) throws ServletException;

正如你看到的,該方法有好幾個參數(shù),其中包括原始的異常。方法返回一個ActionForward對象,用于異常處理結(jié)束后將controller類帶到請求必須轉(zhuǎn)發(fā)的地方去。

當(dāng)然您可以實現(xiàn)任何處理,但一般而言,我們必須檢查拋出的異常,并針對該類型的異常進行特定的處理。缺省的,系統(tǒng)的異常處理功能是創(chuàng)建一個出錯信息,同時把請求轉(zhuǎn)發(fā)到配置文件中指定的地方去。 定制異常處理的一個常見的例子是處理嵌套異常。假設(shè)該異常包含有嵌套異常,這些嵌套異常又包含了其他異常,因此我們必須覆蓋原來的execute()方法,對每個異常編寫出錯信息。

一旦你創(chuàng)建了自己的ExceptionHandler 類,就應(yīng)該在Struts配置文件中的部分聲明這個類,以便讓Struts知道改用你自定義的異常處理取代缺省的異常處理.


可以配置你自己的ExceptionHandler 類是用于Action Mapping特定的部分還是所有的Action對象。假如是用于Action Mapping特定的部分就在<action>元素中配置。假如想讓這個類可用于所有的Action對象,可以在<global-sections> 元素中指定。例如,假設(shè)我們創(chuàng)建了異常處理類CustomizedExceptionHandler用于所有的Action類, <global-exceptions>元素定義如下所示:

<global-exceptions>

<exception

handler="com.cavaness.storefront.CustomizedExceptionHandler"

key="global.error.message"

path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

</global-exceptions>

在<exception />元素中可以對很多屬性進行設(shè)置。在本文中,最重要的屬性莫過于handler屬性, handler屬性的值就是自定義的繼續(xù)了ExceptionHandler類的子類的全名。 假如該屬性沒有定義,Struts會采用自己的缺省值。當(dāng)然,其他的屬性也很重要,但假如想覆蓋缺省的異常處理的話,handler無疑是最重要的屬性。

最后必須指出的一點是,你可以有不同的異常處理類來處理不同的異常。在上面的例子中,CustomizedExceptionHandler用來處理任何java.lang.Exception的子類. 其實,你也可以定義多個異常處理類,每一個專門處理不同的異常樹。下面的XML片斷解釋了如何配置以實現(xiàn)這一點。

<global-exceptions>

<exception

handler="com.cavaness.storefront.CustomizedExceptionHandler"

key="global.error.message"

path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

<exception

handler="com.cavaness.storefront.SecurityExceptionHandler"

key="security.error.message"

path="/login.jsp"

scope="request"

type="com.cavaness.storefront.SecurityException"/>

</global-exceptions>

在這里,一旦有異常拋出,struts framework將試圖在配置文件中找到ExceptionHandler,假如沒有找到,那么struts將沿著該異常的父類鏈一層層往上找直到發(fā)現(xiàn)匹配的為止。因此,我們可以定義一個層次型的異常處理關(guān)系結(jié)構(gòu),在配置文件中已經(jīng)體現(xiàn)了這一點。

3. 使用應(yīng)用模塊(Application Modules)

Struts 1.1的一個新特性是應(yīng)用模塊的概念。應(yīng)用模塊答應(yīng)將單個Struts應(yīng)用劃分成幾個模塊,每個模塊有自己的Struts配置文件,JSP頁面,Action等等。這個新特性是為了解決大中型的開發(fā)隊伍抱怨最多的一個問題,即為了更好的支持并行開發(fā)答應(yīng)多個配置文件而不是單個配置文件。

注:在早期的beta版本中,該特性被稱為子應(yīng)用(sub-applications),最近的改名目的是為了更多地反映它們在邏輯上的分工。

顯然,當(dāng)很多開發(fā)人員一起參加一個項目時,單個的Struts配置文件很輕易引起資源沖突。應(yīng)用模塊答應(yīng)Struts按照功能要求進行劃分,許多情況已經(jīng)證實這樣更貼近實際。例如,假設(shè)我們要開發(fā)一個典型的商店應(yīng)用程序。可以將組成部分劃分成模塊比如catalog(商品目錄), customer(顧客), customer service(顧客服務(wù)), order(訂單)等。每個模塊可以分布到不同的目錄下,這樣各部分的資源很輕易定位,有助于開發(fā)和部署。圖1 顯示了該應(yīng)用的目錄結(jié)構(gòu)。

圖 1. 一個典型的商店應(yīng)用程序的目錄結(jié)構(gòu)

運用Jakarta Struts的七大實戰(zhàn)心法(1)(圖一)

注:假如你無需將項目劃分成多個模塊,Struts框架支持一個缺省的應(yīng)用模塊。這就使得應(yīng)用程序也可以在1.0版本下創(chuàng)建,具有可移植性,因為應(yīng)用程序會自動作為缺省的應(yīng)用模塊。

為了使用多應(yīng)用模塊功能,必須執(zhí)行以下幾個預(yù)備步驟:

• 為每個應(yīng)用模塊創(chuàng)建獨立的Struts配置文件。

• 配置Web 部署描述符 Web.xml文件。

• 使用org.apache.struts.actions.SwitchAction 來實現(xiàn)程序在模塊之間的跳轉(zhuǎn).

更多的請看:http://www.qqread.com/windows/2003/index.html

編者按:當(dāng)作者 Chuck Cavaness(著有《Programming Jakarta Struts》一書)所在的網(wǎng)絡(luò)公司決定采用Struts框架之后,Chuck曾經(jīng)花費了好幾個月來研究如何用它來構(gòu)建公司的應(yīng)用系統(tǒng)。本文敘述的正是作者在運用Struts過程中來之不易的若干經(jīng)驗和心得。假如你是個負(fù)責(zé)通過jsp和servlet開發(fā)Web應(yīng)用的Java程序員,并且也正在考慮采用基于Struts的構(gòu)建方法的話,那么你會在這里發(fā)現(xiàn)很多頗有見地同時也很有價值的信息。

1. 只在必要的時候才考慮擴展Struts框架

一個好的framework有很多優(yōu)點,首先,它必須能夠滿足用戶的可預(yù)見的需求。為此 Struts為Web 應(yīng)用提供了一個通用的架構(gòu),這樣開發(fā)人員可以把精力集中在如何解決實際業(yè)務(wù)問題上。其次,一個好的framework還必須能夠在適當(dāng)?shù)牡胤教峁U展接口,以便應(yīng)用程序能擴展該框架來更好的適應(yīng)使用者的實際需要。

假如Struts framework在任何場合,任何項目中都能很好的滿足需求,那真是太棒了。但是實際上,沒有一個框架聲稱能做到這一點。一定會有一些特定的應(yīng)用需求是框架的開發(fā)者們無法預(yù)見到的。因此,最好的辦法就是提供足夠的擴展接口,使得開發(fā)工程師能夠調(diào)整struts來更好的符合他們的非凡要求。


在Struts framework中有很多地方可供擴展和定制。幾乎所有的配置類都能被替換為某個用戶定制的版本,這只要簡單的修改一下Struts的配置文件就可以做到。

其他組件如ActionServlet和 RequestProcessor 也能用自定義的版本代替. 甚至連Struts 1.1里才有的新特性也是按照擴展的原則來設(shè)計的。例如,在異常處理機制中就答應(yīng)用戶定制異常處理的句柄,以便更好的對應(yīng)用系統(tǒng)發(fā)生的錯誤做出響應(yīng)。

作為框架的這種可調(diào)整特性在它更適合你的應(yīng)用的同時也在很大的程度上影響了項目開發(fā)的效果。首先,由于您的應(yīng)用是基于一個現(xiàn)有的成熟的、穩(wěn)定的framework如Struts,測試過程中發(fā)現(xiàn)的錯誤數(shù)量將會大大減少,同時也能縮短開發(fā)時間和減少資源的投入。因為你不再需要投入開發(fā)力量用于編寫基礎(chǔ)框架的代碼了。

然而, 實現(xiàn)更多的功能是要花費更大的代價的。我們必須小心避免不必要的濫用擴展性能, Struts是由核心包加上很多工具包構(gòu)成的,它們已經(jīng)提供了很多已經(jīng)實現(xiàn)的功能。因此不要盲目的擴展Struts框架,要先確定能不能采用其他方法使用現(xiàn)有的功能來實現(xiàn)。 在決定編寫擴展代碼前務(wù)必要確認(rèn)Struts的確沒有實現(xiàn)你要的功能。否則重復(fù)的功能會導(dǎo)致混亂將來還得花費額外的精力清除它。

2. 使用異常處理聲明

要定義應(yīng)用程序的邏輯流程,成熟的經(jīng)驗是推薦在代碼之外,用配置的方法來實現(xiàn),而不是寫死在程序代碼中的。在J2EE中,這樣的例子比比皆是。從實現(xiàn)EJB的安全性和事務(wù)性行為到描述JMS消息和目的地之間的關(guān)系,很多運行時的處理流程都是可以在程序之外定義的。

Struts 創(chuàng)建者從一開始就采用這種方法,通過配置Struts的配置文件來定制應(yīng)用系統(tǒng)運行時的各個方面。這一點在版本1.1的新特性上得到延續(xù),包括新的異常處理功能。在Struts framework以前的版本中,開發(fā)人員不得不自己處理Struts應(yīng)用中發(fā)生的錯誤情況。在最新的版本中,情況大大的改觀了,Struts Framework提供了內(nèi)置的一個稱為 ExceptionHandler 的類, 用于系統(tǒng)缺省處理action類運行中產(chǎn)生的錯誤。這也是在上一個技巧中我們提到的framework許多可擴展接口之一。

Struts缺省的 ExceptionHandler類會生成一個ActionError對象并保存在適當(dāng)?shù)姆秶╯cope)對象中。這樣就答應(yīng)JSP頁面使用錯誤類來提醒用戶出現(xiàn)什么問題。假如你認(rèn)為這不能滿足你的需求,那么可以很方便的實現(xiàn)你自己的ExcepionHandler類。

具體定制異常處理的方法和機制

要定制自己的異常處理機制,第一步是繼續(xù)org.apache.struts.action.ExceptionHandler類。這個類有2個方法可以覆蓋,一個是excute()另外一個是storeException(). 在多數(shù)情況下,只需要覆蓋其中的excute()方法。下面是ExceptionHandler類的excute()方法聲明:

public ActionForward execute( Exception ex,

ExceptionConfig exConfig,

ActionMapping mapping,

ActionForm formInstance,

HttpServletRequest request,

HttpServletResponse response

) throws ServletException;

正如你看到的,該方法有好幾個參數(shù),其中包括原始的異常。方法返回一個ActionForward對象,用于異常處理結(jié)束后將controller類帶到請求必須轉(zhuǎn)發(fā)的地方去。

當(dāng)然您可以實現(xiàn)任何處理,但一般而言,我們必須檢查拋出的異常,并針對該類型的異常進行特定的處理。缺省的,系統(tǒng)的異常處理功能是創(chuàng)建一個出錯信息,同時把請求轉(zhuǎn)發(fā)到配置文件中指定的地方去。 定制異常處理的一個常見的例子是處理嵌套異常。假設(shè)該異常包含有嵌套異常,這些嵌套異常又包含了其他異常,因此我們必須覆蓋原來的execute()方法,對每個異常編寫出錯信息。

一旦你創(chuàng)建了自己的ExceptionHandler 類,就應(yīng)該在Struts配置文件中的部分聲明這個類,以便讓Struts知道改用你自定義的異常處理取代缺省的異常處理.

可以配置你自己的ExceptionHandler 類是用于Action Mapping特定的部分還是所有的Action對象。假如是用于Action Mapping特定的部分就在<action>元素中配置。假如想讓這個類可用于所有的Action對象,可以在<global-sections> 元素中指定。例如,假設(shè)我們創(chuàng)建了異常處理類CustomizedExceptionHandler用于所有的Action類, <global-exceptions>元素定義如下所示:

<global-exceptions>

<exception

handler="com.cavaness.storefront.CustomizedExceptionHandler"

key="global.error.message"

path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

</global-exceptions>

在<exception />元素中可以對很多屬性進行設(shè)置。在本文中,最重要的屬性莫過于handler屬性, handler屬性的值就是自定義的繼續(xù)了ExceptionHandler類的子類的全名。 假如該屬性沒有定義,Struts會采用自己的缺省值。當(dāng)然,其他的屬性也很重要,但假如想覆蓋缺省的異常處理的話,handler無疑是最重要的屬性。

最后必須指出的一點是,你可以有不同的異常處理類來處理不同的異常。在上面的例子中,CustomizedExceptionHandler用來處理任何java.lang.Exception的子類. 其實,你也可以定義多個異常處理類,每一個專門處理不同的異常樹。下面的XML片斷解釋了如何配置以實現(xiàn)這一點。

<global-exceptions>

<exception

handler="com.cavaness.storefront.CustomizedExceptionHandler"

key="global.error.message"


path="/error.jsp"

scope="request"

type="java.lang.Exception"/>

<exception

handler="com.cavaness.storefront.SecurityExceptionHandler"

key="security.error.message"

path="/login.jsp"

scope="request"

type="com.cavaness.storefront.SecurityException"/>

</global-exceptions>

在這里,一旦有異常拋出,struts framework將試圖在配置文件中找到ExceptionHandler,假如沒有找到,那么struts將沿著該異常的父類鏈一層層往上找直到發(fā)現(xiàn)匹配的為止。因此,我們可以定義一個層次型的異常處理關(guān)系結(jié)構(gòu),在配置文件中已經(jīng)體現(xiàn)了這一點。

3. 使用應(yīng)用模塊(Application Modules)

Struts 1.1的一個新特性是應(yīng)用模塊的概念。應(yīng)用模塊答應(yīng)將單個Struts應(yīng)用劃分成幾個模塊,每個模塊有自己的Struts配置文件,JSP頁面,Action等等。這個新特性是為了解決大中型的開發(fā)隊伍抱怨最多的一個問題,即為了更好的支持并行開發(fā)答應(yīng)多個配置文件而不是單個配置文件。

注:在早期的beta版本中,該特性被稱為子應(yīng)用(sub-applications),最近的改名目的是為了更多地反映它們在邏輯上的分工。

顯然,當(dāng)很多開發(fā)人員一起參加一個項目時,單個的Struts配置文件很輕易引起資源沖突。應(yīng)用模塊答應(yīng)Struts按照功能要求進行劃分,許多情況已經(jīng)證實這樣更貼近實際。例如,假設(shè)我們要開發(fā)一個典型的商店應(yīng)用程序。可以將組成部分劃分成模塊比如catalog(商品目錄), customer(顧客), customer service(顧客服務(wù)), order(訂單)等。每個模塊可以分布到不同的目錄下,這樣各部分的資源很輕易定位,有助于開發(fā)和部署。圖1 顯示了該應(yīng)用的目錄結(jié)構(gòu)。

圖 1. 一個典型的商店應(yīng)用程序的目錄結(jié)構(gòu)

運用Jakarta Struts的七大實戰(zhàn)心法(1)(圖一)

注:假如你無需將項目劃分成多個模塊,Struts框架支持一個缺省的應(yīng)用模塊。這就使得應(yīng)用程序也可以在1.0版本下創(chuàng)建,具有可移植性,因為應(yīng)用程序會自動作為缺省的應(yīng)用模塊。

為了使用多應(yīng)用模塊功能,必須執(zhí)行以下幾個預(yù)備步驟:

• 為每個應(yīng)用模塊創(chuàng)建獨立的Struts配置文件。

• 配置Web 部署描述符 Web.xml文件。

• 使用org.apache.struts.actions.SwitchAction 來實現(xiàn)程序在模塊之間的跳轉(zhuǎn).



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 沁源县| 南部县| 台东市| 灯塔市| 建平县| 芦山县| 蚌埠市| 宾川县| 新绛县| 临漳县| 穆棱市| 女性| 东乡族自治县| 资源县| 清涧县| 措勤县| 名山县| 常州市| 康乐县| 当涂县| 花垣县| 沈丘县| 龙胜| 卫辉市| 育儿| 锡林郭勒盟| 西宁市| 札达县| 万州区| 诸城市| 绥滨县| 治多县| 和平县| 仪征市| 昌图县| 红河县| 澄城县| 平罗县| 平罗县| 揭西县| 土默特左旗|