February 6, 2008

認識Struts2

何謂 Struts2

引言自 Apache Struts2 官網中的一段開宗明義的內容:

Apache Struts 2 was originally known as WebWork 2. After working independently for several years, the WebWork and Struts communities joined forces to create Struts2. This new version of Struts is simpler to use and closer to how Struts was always meant to be.

其大意為:

Apache Struts 2即是眾所熟知的WebWork 2,在經歷了數年的各自發展之後,WebWorkStruts社群決定合併,產生了Struts2。而這一創新的版本將會比原本的Struts更為簡單使用及更貼近Struts原本的精神。


Struts2 的由來

Struts的最初構思是想透過結合JSPServlet,使Web應用程式的景觀頁面(View)與商務邏輯(Business Logic)得以清晰地分離開來。在Struts之前,最常見的做法是直接在JSP頁面上寫入商務邏輯(Business Logic),或是在Servlet中藉由 println() 語法產生景觀頁面(View)

20015月份初版發佈以來,Struts儼然成為了業界公認的Web應用程式標準。而隨著Web應用框架需求不斷變化及需與日漸增多眾框架的特性相融合,Struts仍不斷的改進和變更。

到最後,產生了下一代Struts的解決方案。其中兩個最受矚目的方案為 Shale Struts Ti

Shale是一個基於元件(component)的框架,並在最近成為Apache的主要計畫(Project)之一。而Struts Ti則著眼在Struts的成功經驗上,繼續堅持對前端控制器(Front Controller)和MVC(model-view-controller)模式進行改進。

WebWork計畫(Project)是一個成熟的框架,自20023月初版發佈以來,經歷過了好幾次重大的改進與發佈,其對Struts框架進行了革命性的改進,當中引進了不少新的思維、概念和功能,如pull MVC等,但和原Struts程式碼(Code)並不兼容。

200512月,WebWorkStruts Ti 正式宣佈合併。於此同時,Struts Ti 更名為Struts Action Framework 2.0,並正式成為Struts真正的繼承者。

最後需注意的是,雖然兩者結合共同開發Struts2,這並非表示StrutsWebWork計畫(Project)將停止開發。由於人們對這兩個計畫仍然有很高的興趣,而且也有很多開發者仍然願意使用它們,因此這兩個計畫仍在持續開發中,繼續改進與更新。


Struts2 的架構

Struts2 仍是以前端控制器(front controller)框架主體。這表示:

  1. Action仍然是通過URL所呼叫的,資料(Data)仍是藉由URL夾帶了請求參數和Form表單上的參數傳送到遠端伺服器。
  2. 所有Servlet類物件(如requestresponsesession等)仍可在Action中可用。


請求(Request)生命週期(Life cycle)Struts2框架中的運作流程

Struts2處理請求(Request)過程的概覽

  1. 使用者送出請求:使用者對遠端伺服器送出請求(request)以獲取所需資源。
  2. 過濾控制器(FilterDispatcher)的佈署:透過過濾器(Filter)攔截請求(request),並根據請求內容以送往合適的處理對象(ex: *.action*.do)。
  3. 攔截器(Interceptors)的佈署:可透過攔截器的調控自動佈署一些基本功能如流程(workflow)、驗證(validation)、檔案上傳(file upload)等,攔截器和攔截器組可以按照不同級別進行組合配置來處理請求。它們為請求提供各種預設處理和切面處理(AOP)的功能。這和Struts使用Jakarta Commons Chain元件的RequestProcessor很相似。
  4. 執行Action產生一個新的Action實例(Instance),根據請求執行其所對應的處理邏輯。
  5. 產出結果:將其所要求的資源或是結果回送到Action
  6. 回傳請求的資源請求(request) 以和進入時相反的方向再次經過一系列攔截器處理後返回,亦可以在這個過程中進行額外的處理工作。
  7. 將回傳結果呈現給使用者:最後一步是將控制權交還給Servlet Container,將產出的結果呈現在使用者的瀏覽器(Browser)


Struts2處理請求(Request)過程的詳細圖表

0 comments :