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