Hibernate+Spring+Struts擴(kuò)展Struts 1(轉(zhuǎn))
我看到很多項(xiàng)目中,開發(fā)者實(shí)現(xiàn)了自己的MVC框架,并不是因?yàn)樗麄兿胱鐾琒truts根本不同的東西,而是因?yàn)樗麄儾]有意識(shí)到如何擴(kuò)展Struts。開發(fā)自己的MVC框架可以獲得全部的控制權(quán),但是這也意味著需要很多資源來實(shí)現(xiàn)它(人力物力),在緊張的日程安排下,有時(shí)候這是不可能的。Struts不僅僅是一個(gè)強(qiáng)大的框架,同時(shí)它也是可擴(kuò)展的。你可以以三種方式來擴(kuò)展Struts。
1、PlugIn:如果你想在application startup或shutdown的時(shí)候做一些業(yè)務(wù)邏輯的話,那就創(chuàng)建你自己的PlugIn類。
2、RequestProcessor:如果你想在請(qǐng)求被處理的過程中某個(gè)時(shí)刻做一些業(yè)務(wù)邏輯的話,那么創(chuàng)建你自己的RequestProcessor類。比如說,在每次請(qǐng)求執(zhí)行之前,你可以擴(kuò)展RequestProcessor來檢查用戶是否登陸了以及他是否有權(quán)限去執(zhí)行某個(gè)特定的action。
3、ActionServlet:如果你想在application startup和shutdown的時(shí)候以及請(qǐng)求被處理的時(shí)候做某些業(yè)務(wù)邏輯,你也可以擴(kuò)張ActionServlet類。不過你應(yīng)當(dāng)在PlugIn和RequestProcessor都不能解決你的需求的時(shí)候來使用ActionServlet。
在這篇文章中,我們將使用一個(gè)Struts應(yīng)用的示例來示范如何使用這三種方式來擴(kuò)展Struts。示例程序的代碼可以從http://www.onjava.com/onjava/2004/11/10/examples/sample1.zip下載。兩個(gè)擴(kuò)展Struts成功的范例是Struts自身的Validation和Tiles框架。
我們假設(shè)你已經(jīng)比較熟悉Struts框架并且知道如何使用它創(chuàng)建一個(gè)簡(jiǎn)單的應(yīng)用。如果你想知道更多關(guān)于Struts的內(nèi)容,請(qǐng)參考官方主頁(yè)。
PlugIn
PlugIn是一個(gè)接口,你可以創(chuàng)建一個(gè)實(shí)現(xiàn)該接口的類,當(dāng)application startup或shutdown的時(shí)候做些事情。
比方說,我創(chuàng)建了一個(gè)使用Hibernate作為持久層的web應(yīng)用,我想當(dāng)應(yīng)用啟動(dòng)的時(shí)候就初始化Hibernate,這樣子當(dāng)我的web應(yīng)用受到第一個(gè)請(qǐng)求的時(shí)候,Hibernate就已經(jīng)是配置好的并且可用的。同時(shí)我們想當(dāng)application關(guān)閉的時(shí)候關(guān)閉Hibernate。我們可以用一個(gè)Hibernate PlugIn來實(shí)現(xiàn)這個(gè)需求,通過如下的兩步:
1、創(chuàng)建一個(gè)類實(shí)現(xiàn)了PlugIn接口:
public class HibernatePlugIn implements PlugIn{ private String configFile; // This method will be called at application shutdown time public void destroy() { System.out.println("Entering HibernatePlugIn.destroy()"); //Put hibernate cleanup code here System.out.println("Exiting HibernatePlugIn.destroy()"); } //This method will be called at application startup time public void init(ActionServlet actionServlet, ModuleConfig config) throws ServletException { System.out.println("Entering HibernatePlugIn.init()"); System.out.println("value of init parameter " + getConfigFile()); System.out.println("Exiting HibernatePlugIn.init()"); } public String getConfigFile() { return name; } public void setConfigFile(String string) { configFile = string; } } |
實(shí)現(xiàn)PlugIn接口的類必須完成兩個(gè)方法:init()和destroy()。當(dāng)application startup的時(shí)候init()方法被調(diào)用,當(dāng)shutdown的時(shí)候destroy()方法被調(diào)用。Struts還允許給你的PlugIn類傳遞初始化參數(shù)。為了傳遞參數(shù),你必須在PlugIn類中為每一個(gè)參數(shù)創(chuàng)建JavaBean式的setter方法。在我們的HibernatePlugIn類中,我會(huì)把configFile的name作為參數(shù)傳進(jìn)去,而不是硬編碼到程序中。
2、在struts-config.xml中添加如下的代碼來通告Struts有新的PlugIn:
<struts-config> ... <!-- Message Resources --> ?。糾essage-resources parameter= "sample1.resources.ApplicationResources"/> <!-- Declare your plugins --> <plug-in className="com.sample.util.HibernatePlugIn"> <set-property property="configFile" value="/hibernate.cfg.xml"/> </plug-in> </struts-config> |
屬性className是實(shí)現(xiàn)了PlugIn接口的類的全限定名。對(duì)于每一個(gè)初始化參數(shù),可以使用<set-property>元素傳遞參數(shù)。在我們的例子中,我要把config文件的名字傳進(jìn)去,所以使用了一個(gè)帶有配置文件路徑的<set-property>。
Struts的Tiles和Validator框架都使用PlugIn來讀取配置文件進(jìn)行初始化。另外兩件PlugIn可以幫你做到的事情是:
·如果你的application依賴于某些配置文件,那么你可以在PlugIn類中檢查它們是否可用,如果不可用的話拋出一個(gè)ServletException,這樣就可以使ActionServlet變?yōu)椴豢捎谩?BR>
·PlugIn接口的init()方法是你可以改變ModuleConfig的最后機(jī)會(huì),ModuleConfig是一組靜態(tài)配置信息的集合,用來描述基于Struts模塊。Struts將會(huì)在所有PlugIn處理完后釋放ModuleConfig。
posted on 2005-09-14 13:06 Victor 閱讀(310) 評(píng)論(0) 編輯 收藏 所屬分類: 開源相關(guān)