擴展Struts框架

一個好的軟件框架應該具備可擴展特性。在Struts框架中提供了許多可擴展之處,不放將其稱為可擴展點(Extension Point)。以下是Struts的擴展點:

· 一般性擴展點:Struts插件(PlugIn)、擴展Struts配置類。

· 控制器的擴展點:擴展ActionServlet類、RequestProcessor類和Action類。

· 視圖的擴展點:擴展Struts客戶化標簽。

· 模型的擴展點:擴展SessionContainer類和ApplicationContainer類。

 

1.   Struts插件(PlugIn

Struts1.1框架提供了動態插入和加載組件的功能,這種組件被成為Struts插件。Struts插件實際上就是一個Java類,它在Struts應用啟動時被初始化,在應用關閉時被銷毀。任何作為插件的Java類都應該實現org.apache.struts.action.PlugIn接口。PlugIn接口包括兩個方法:

 

public interface PlugIn {

/**

* Notification that the specified application module is being started.

*/

public void init(ActionServlet servlet, ApplicationConfig config)

throws ServletException;

       /**

* Notification that the application module is being shut down.

*/

public void destroy();

}

 

一個Struts應用可以包含一個或多個插件。在Struts應用啟動時,Struts框架調用每個插件類的init()方法進行初始化。在插件的初始化階段,可以完成一些初始化操作,如建立數據庫連接,或者和遠程系統的連接等。

當應用被關閉時,Struts框架就會調用每個插件類的destroy()方法,destroy()方法可以用來完成釋放資源的人物,如關閉數據庫連接或遠程系統連接等。

除了創建插件類外,還需要在Struts配置文件中配置插件,Struts框架在啟動時將根據相關的配置信息來初始化插件。與插件對應的配置元素為<plug-in>

根據Struts配置文件的DTD定義,在Struts配置文件中,<plug-in>元素必需位于其他配置元素的后面。此外,如果在配置文件中配置了多個插件,Struts框架將按照它們在配置文件中的先后順序來一次初始化他們。

 

2.   擴展Struts的配置類

Struts應用啟動時,Struts配置文件中的所有信息都會被讀到內存中,這些信息存放在org.apache.struts.config包的相應配置類的實例中。

多數配置元素都由一個className屬性,這個屬性用來設置和配置元素對應的配置類。每個配置元素都有默認配置類,Struts框架允許對這些莫爾那配置類進行擴展。

 

3.   控制器擴展點

Struts框架在控制器中提供了許多可擴展之處,允許擴展ActionServletRequestProcessorAction類,來實現各種客戶化功能。

3.1 擴展ActionServlet

Struts1.1以前的版本中,Struts應用通常都需要擴展ActionServlet類,來實現各種定制的控制功能。在Struts1.1中,擴展ActionServlet類不再是必需的。不過在某些情況下,根據實際情況需要,可不妨擴展ActionServlet類。

Struts應用啟動時會加載ActionServlet類并調用它的init()方法,來對Struts框架進行初始化。如果需要修改Struts框架的初始化行為,可以創建一個org.apache.struts.action.ActionServlet類的子類,然后覆蓋它的init()方法。

接下來,應該在web.xml文件中對自定義的ActionServlet進行配置。

Struts1.1中,預處理HTTP請求的具體操作由RequestProcessor類來完成。因此,如果需要對預處理HTTP請求的方式進行客戶化,可以擴展RequestProcessor類。

 

3.2 擴展RequestProcessor

如果擴展了RequestProcessor類,應該在Struts配置文件中通過<controller>元素對自定義的RequestProcessor類進行配置。

<controller>元素的processorClass屬性用來指定使用的RequestProcessor類。Struts框架在啟動時會創建這個RequestProcessor類的實例,并利用它來處理所有的HTTP請求。由于每個子應用模塊都有各自的配置文件,因此可以為每個子應用模塊配置不同的RequestProcessor類。

RequestProcessor類的一個擴展點為processPreprocess()方法。在RequestProcessor基類中,該方法不執行任何操作,志軍誒返回true

RequestProcessor類在process()方法中處理請求,Process()方法在調用Actionexecute()方法之前,就會調用processPreprocess()方法,如果processPreprocess()方法返回true,則表示繼續按正常的流程處理請求。

在自定義的RequestProcessor類中,可以覆蓋processPreprocess()方法來執行特定的邏輯。如果在某些條件下希望終止處理請求,只需讓processPreprocess()方法false即可。在這種情況下,仍需要以編程的方式來決定如何轉發或重定向請求。

Servlet 2.3 API提供了Servlet過濾器,它可以實現和processPreprocess()方法相同的功能。Servlet過濾器也可以用來執行客戶化的預處理請求操作,Web容器先調用Servlet過濾器,再把請求轉發給Struts控制器。

與擴展RequestProcessor類相比,通過Servlet過濾器來預處理請求有兩大弱點:

 

3.3 擴展Action

Struts框架的Action類是最頻繁的擴展點。對于具體的Struts應用,可以先為應用創建一個擴展Struts Action類的Action基類,在這個Action基類中定義應用中所有Action的一些公共邏輯,它可以作為其他Action的父類。這種處理方式可以提高代碼的可重用性,減少代碼的重復。

 

 

4.   擴展視圖組件

一般說來,沒有必要擴展視圖組件,因為不同的應用有不同的外觀和界面,一個應用的JSP頁面不大可能適用于另一個不同的應用。不過,可以擴展Struts客戶化標簽,因為標簽處理器為常規的Java類,可以通過定義子類的方式來擴展它們,這些擴展后的客戶化標簽能夠被不同的應用重用。

Struts HTML標簽庫中的標簽對視圖內容的影響最大。因此可以擴展這些標簽來創建客戶化的應用外觀。當擴展了標簽后,應該定義存放這些標簽的標簽庫。盡管可以把自定義的標簽加入到標準的Struts標簽庫中,但是這會使將應用升級到新的Struts版本變得更加麻煩。所以建議定義單獨的標簽庫,來存放和特定應用相關的客戶化標簽。

一旦為客戶華標簽庫創建了TLD文件,并且在web.xml中注冊了標簽庫,就可以在JSP文件中方便地使用這些標簽了。

5.   擴展模型組件

Struts框架本身沒有在模型層提供現成的模型組件,因此擴展模型組件不屬于Struts技術。

6.   小結

本篇文檔歸納了Struts框架的所有可擴展點。Struts框架的可擴展性使開發者可以方便地定制客戶化功能,提高應用的靈活性和多各種需求的可適應性。然而,實現更多的功能使要花費更大代價的,應該避免濫用Struts的可擴展特性。Struts由核心包加上很多工具包構成。它們已經提供了很多現成的功能。因此不要盲目地擴展Struts框架,在決定編寫擴展代碼前,務必先確認Struts沒有提供現成的您需要的功能。否則,重復的功能會導致應用結構的混亂,將來還得花費額外的經歷來清除重復功能。

此外,必需考慮擴展后的框架是否會和將來的新的Struts版本兼容,從Struts 1.0Struts 1.1就發生了很大的改動。在先有的Struts版本的API中,如果有的類的方法已經聲明將要被廢棄,應該盡量不要覆蓋這些方法,否則,當采用新的Struts版本時,就不得不對應用做相應的升級。



閱讀材料:《精通Struts:基于MVC的Java Web設計與開發》






                                        2005年05月19日 2:37 AM