忠實的和Model-View-Controller設計模式對應,Struts程序有三個主要的部件:一個Servlet Controller,它由Struts本身提供,JSP 頁面("view"),還有程序的商業邏輯("model").我們來看看他們是怎么組合到一起的。
Struts的Controller servlet把HTTP 請求打包并傳送到框架中的其他對象,包括JavaServer Pages和由Struts開發者編寫的org.apache.struts.action.Action 的子類。當(系統)初始化的時候,Controller 解釋一個配置資源文件。這個文件定義了(和其他配置一起)這個程序的org.apache.struts.action.ActionMapping 。Controller用這些映射來把HTTP 請求轉換為程序的actions(動作)。
一個ActionMapping通常會指出:
- 一個request請求的路徑 (簡稱 "URI"),
- 用于處理請求的object type(對象) (Action 的子類),
- 和其他一些必要的屬性。
Action 對象可以處理請求并響應客戶端(通常是一個web browser),或者指出流程應該被指向另一個地方。例如,如果登錄成功,一個login Action可能希望把流程轉移到主菜單。
Action對象可以操作程序的Controller servlet,所以可以操作這個Controller的方法。當轉發控制的時候,一個Action對象可以不直接的轉發一個或多個共享對象,包括JavaBeans,這個過程是通過把它們放到Java servlet共享的某一個標準collection對象里去。
Action對象可以創建一個購物車Bean,在購物車里面加上一個條目,把這個bean放到session 結構里去,然后把控制轉發到另一個映射。那個映射會使用一個JavaServer Page來顯示用戶的購物車里的內容。因為每個用戶都有他自己的session,他們也會有自己的購物車。在一個Struts程序里,大部分商業邏輯都可以由JavaBeans表示。一個Action可以調用一個JavaBean的屬性,不需要知道她實際上是如何工作的。這封裝了 商業邏輯,所以Action可以專注于錯誤處理和如何轉發控制。
JavaBeans也可以用來管理輸入的Forms.設計一個web程序的主要問題是得到并檢查用戶在請求中的輸入。通過Struts,你可以 定義你自己的Form Bean 類集合,他們都是org.apache.struts.action.ActionForm 的子類,并很容易的把用戶form(這里是指HTTP form--譯者注)輸入的內容放到這些Form bean里去。這個bean被存放到一個標準的共享上下文集合里去,所以另一個對象可以使用它,特別是指一個Action對象。 (我的理解,使用ActionForm是因為這樣可以標準化的檢查Form里的值,也可以標準化的調用Action--譯者注。)
Form bean可以被一個JSP使用來從用戶收集數據...通過一個Action 對象來檢查用戶輸入的數據...然后再通過JSP來重新顯示form的字段。如果檢查錯誤,Struts由一個公用的機制來提交和顯示錯誤信息。
Struts 的Form bean在配置文件中聲明,在一個Java文件中被定義,并且通過一個通用的屬性名字來連接到一個ActionMapping去。當一個請求 調用一個需要FormBean 的Action時候,Controller servlet要么從輸入中獲取form bean,要么自己構造一個form bean,把它傳遞到Action對象去。Action 對象可以在顯示之前檢查form bean的內容,也可以為要在form里顯示的內容排隊。準備好之后,Action對象返回控制權并轉移到它的輸入葉面去。controller就可以響應HTTP請求,并重定向到JavaServer Page去。
Struts 框架包括自定義的Tag來自動從一個formBean填充子段。JavaServer Page唯一需要知道的是確切的字段名和下一步提交form到何處。一些部件例如被Action排隊的消息可以在一個自定義tag就被輸 出。也可以定制其他為程序定制的tag來從jsp中隱藏實現細節。
在Struts框架中的自定義tag被設計為使用Java平臺內置的國際化特性。所有的字段名和消息都可以從消息資源中獲取,并且Java可以自動為一個客戶端的國家和語言提供想對應的資源。為了提供另一種語言的支持,只需簡單的的增加另一個資源文件。
除了國際化之外,這個進步的好處還在于在不同的form中保持一樣的標簽名字,也可以全局化的復查所有的標簽和消息。
對于最簡單的程序來說,有時候一個Action對象可以處理一個請求對應的商業邏輯。但是,在大多數情況下,一個Action對 象應該調用另一個對象,一般是一個JavaBean來處理實際的業務邏輯。這讓Action專注于錯誤處理和流程控制,而非商業邏 輯。為了在其他平臺上重用,商業邏輯JavaBean不應該引用任何web程序的對象。Action對象應該從HTTP請求翻譯必要的細節并 象普通的java變量一樣傳遞到商業邏輯對象去。
舉個例子,在一個數據庫程序中:
- 一個商業邏輯bean會連接到數據庫并進行查詢,
- 商業邏輯bean把結果傳遞到Action,
- Action把結果保存在一個form bean中,放置到request中去,
- JavaServer Page把結果顯示到一個HTML Form中去。
不管是Action還是JSP都不需要知道結果是從哪兒來的。他們只需要知道如何打包和顯示結果。
用戶指南的其它部分非常詳細的解釋了Struts的不同部件。Struts發布版本也包含了一些開發者手冊包含幾個不同的主題,也包括例子程序,標準的Javadoc API,當然還有全部的源代碼!
Struts 在Apache軟件基金會協議下發布。代碼擁有版權,但是可以在任何程序中自由的使用。參閱ASF license 得到詳細信息.
|