重溫Struts--Action
作者:Flyingis
在Struts中,ActionServlet擔(dān)任分配工作的控制器角色,實際的工作是交給Action對象來進(jìn)行的。Action是Struts框架的核心類之一,它主要用來訪問業(yè)務(wù)層、為表現(xiàn)層準(zhǔn)備數(shù)據(jù)對象和處理錯誤異常。
Action在Struts框架中基本上屬于控制器的角色,通常不建議在Action中加入過多的業(yè)務(wù)邏輯,將業(yè)務(wù)邏輯封裝在其他的類中,然后在Action中建立這些類的對象,調(diào)用對象的方法來實現(xiàn)業(yè)務(wù)功能。比較遺憾的是,當(dāng)業(yè)務(wù)邏輯中出現(xiàn)異常的時候沒有辦法將異常說明在頁面中直接反應(yīng)出來,展現(xiàn)給用戶,在Action中控制這些異??梢宰龅竭@點。
要更詳細(xì)的了解Action的工作機(jī)理,就要剖析ActionServlet控制器的工作流程及其核心方法。在Struts中,擔(dān)任控制器角色的核心是ActionServlet,所有的請求都必須先通過它,而對所有請求的處理是交付給RequestProcessor來完成的,既然處理請求的任務(wù)是交給RequestProcessor來完成,那么可以直接查看org.apche.struts.action.RequestProcessor類,看其process()方法實現(xiàn)了哪些功能,從源代碼中的英文注釋我們可以更深入了解到整個處理過程,很多書籍和網(wǎng)上不少文章都描述了這個過程,還有典型的處理過程圖示,這里就不再詳述。只是從這個過程可以看出,通過繼承ActionServlet來定義自己的控制器請求意義不大,重寫init()方法倒是可以修改初始化工作,如果需要定義自己的控制器,可以繼承RequestProcessor并修改其中的process()方法來實現(xiàn)。
在Struts應(yīng)用中,除了直接繼承org.apache.struts.action.Action類實現(xiàn)Action功能外,Struts還提供了其他幾種Action類來滿足某種特定需要,這些書本上已經(jīng)寫了很多,這里只是照葫蘆畫瓢略作總結(jié):
ForwardAction—當(dāng)需要從一個頁面轉(zhuǎn)到另一個頁面或資源時,不提倡直接使用頁面或資源路徑調(diào)用,除了與MVC/Model2架構(gòu)向背之外,有時還會帶來其他的問題,前幾天在網(wǎng)上看到一個帖子就是因為直接調(diào)用資源出現(xiàn)了異常,具體出自于哪里沒有記住。這里,應(yīng)該通過控制器使用ForwardAction來完成鏈接的跳轉(zhuǎn),使用屬性parameter設(shè)定forward的鏈接地址。
IncludeAction—和ForwardAction類似,當(dāng)需要引入一個資源時,可以使用IncludeAction來實現(xiàn),屬性parameter設(shè)定include的鏈接地址。
SwitchAction—用于從一個模塊轉(zhuǎn)換至另一個模塊,一種方法是使用相對于Context的路徑來進(jìn)行forward查找,另外一種就是使用SwithAction,它需要在請求中帶兩個參數(shù),一個是prefix用來指定模塊前綴名稱,一個是page用來指定相對于模塊的資源路徑。
DispatchAction—隨著Struts Web應(yīng)用規(guī)模擴(kuò)大,維護(hù)Action復(fù)雜度提高,可以使用模塊化來管理Action。另一方面,當(dāng)一個頁面需要多個Action時,我們就可以使用DispatchAction來將一個頁面中所有相關(guān)的動作放在一個action類中實現(xiàn),此時不需要重定義execute()方法,它已經(jīng)在DispatchAction抽象類中定義,我們需要編寫自己的方法來響應(yīng)一個頁面上不同的動作。它的關(guān)鍵屬性是parameter。
LookupDispatchAction—它是DispatchAction的子類,不同的是,當(dāng)頁面按鈕的property屬性相同的時候,它可以通過查詢資源文件來確定相應(yīng)的動作,這個功能主要是通過重寫getKeyMethodMap()方法實現(xiàn)的。
posted on 2006-03-06 00:07 Flyingis 閱讀(1198) 評論(0) 編輯 收藏 所屬分類: Web 框架與開發(fā)