Struts是Apache軟件基金會(ASF)贊助的一個開源項目。它最初是jakarta項目中的一個子項目,並在2004年3月成為ASF的頂級項目。它通過采用JavaServlet/JSP技術,實現了基於JavaEEWeb應用的MVC設計模式的應用框架,是MVC經典設計模式中的一個經典產品。
Struts是作為ApacheJakarta項目的組成部分,項目的創立者希望通過對該項目的研究,改進和提高JavaServerPages、servlet、標簽庫以及面向對象的技術水准。
Struts這個名字的來源於在建築和舊式飛機中使用的支持金屬架。之所以這個框架叫做“struts”,是為了提醒我們記住那些支撐我們房屋,建築,橋梁,甚至我們踩高跷的基礎支撐。這也是解釋struts在開發web應用程序中所扮演的角色的精彩描述。
Struts的含義是”支柱,枝干”,它的目的是為了減少程序開發的時間,項目的創建者認為JSP,servlet的存在雖然可以幫助用戶解決大部分問題,但是由於它們的編碼對項目的開發帶來了許多的不方便,可重用性也差,所以struts應運而生,幫助用戶在最短的時間內解決這些問題。Struts框架提供如下服務:
(1)作為控制器的Servlet。
(2)提供大量的標簽庫。
(3)提供了用於國際化的框架,利用不同的配置文件,可以幫助用戶選擇合適自己的語言。
(4)提供了JDBC的實現,來定義數據源和數據庫連接池。
(5)XML語法分析工具。
(6)文件下載機制。
Struts是對JSPModel2設計標准的一種實現,下面分別從模型(Model)、視圖(view)和控制器3個部分介紹Struts的體系結構和工作原理。調用流程如下所示(圖1.1)。
圖1.1
(1)視圖(view)
在Struts中,視圖層包含兩個部分,JSP頁面和ActionForm。
ActionForm封裝了用戶提交的表單信息,其實ActonForm本質上就是JavaBean,這些JavaBean中沒有業務邏輯,只提供了所有屬性的getter和setter方法,這些屬性和用戶表單中的輸入項是一一對應的。在Struts中就是通過ActionForm把用戶表單信息提交給控制器。
JSP頁面是經典MVC中主要的視圖組件,主要是信息顯示和控制器處理結果顯示的功能。
除了以上,struts還提供了一個強大的struts標簽庫,來幫助用戶解決顯示邏輯,並且利用ActonForm組件將信息傳遞到控制層。
(2)控制器(Controller)
在控制層,struts提供了一個控制器組件ActionServlet,它繼承自HttpServlet,並重載了HttpServlet的doGet(),doPost()方法,可以接受HTTP的響應,並進行轉發,同時還提供了使用XML進行轉發Mapping(映射)的功能。
(3)模型(Model)
模型表示狀態和業務邏輯的處理,在一般的web應用程序中,用JavaBean或者EJB來實現系統的業務邏輯。在Struts中,struts提供Action對象,來管理業務邏輯的調用,幫助用戶分離業務邏輯,也就是說struts本身不實現業務邏輯,但可以調用已完成的業務邏輯。
Struts工作流程如下(圖1.2)所示。
圖1.2
ActionServlet是struts中核心的控制器,所有的用戶請求都必須通過ActionServlet的處理,而struts-config.xml是struts中核心的配置文件,在這個文件中配置了用戶請求URL和控制器Action的映射關系,ActionServlet通過這個配置文件把用戶的請求發送到對應的控制器中。
在struts web應用程序中,當web應用程序啟動的時候,就會初始化ActionServlet在初始化ActionServlet的時候會加載struts-config.xml配置文件,在加載成功後會把這些URL和控制器映射關系存放在ActionMapping對象或者其他對象中。當ActionServlet接收到用戶請求的時候,就會按照下面的流程對用戶請求進行處理。
(1)ActionServlet接收到用戶的請求後,會根據請求URL尋找匹配的ActionMapping對象,如果匹配失敗,說明用戶請求的URL路徑信息有誤,所以返回請求路徑無效的信息,當找到匹配的ActionMapping的時候,進入到下一步。
(2)當ActionServlet找到匹配的ActionMapping對象的時候,會根據ActionMapping中的映射信息判斷對應的ActionForm對象是否存在,如果不存在對應的ActionForm對象就創建一個新的ActionForm對應,並把用戶提交的表單信息保存到這個ActionForm對象中。
(3)在struts-config.xml中這個配置文件,可以配置表單是否需要驗證,如果需要驗證,就調用ActionForm中的validate()方法對用戶輸入的表單進行驗證。
(4)如果ActionForm的validate()方法返回了ActionErrors對象,則表明驗證失敗,ActionServlet把這個頁面返回到用戶輸入的界面,提示用戶重新輸入。如果方法的返回值為null,就表明驗證已經通過,可以進入下一步處理。
(5)ActionServlet可以根據ActionMapping對象查找用戶請求轉發給哪個控制器Action,如果對應的Action對象不存在,就創建這個對象,並調用這個Action的excute()方法。
(6)業務邏輯控制器Action的execute()方法就會返回一個ActionForward對象,ActionServlet把控制器處理的結果轉發到ActionForward對象指定的JSP頁面。
(7)ActionForward對象指定的JSP頁面根據返回的處理結果,用合適形式把服務器處理的結果展示給用戶,到這裡為止,一個客戶請求的整個過程完畢。
以 上初步struts框架進行了介紹,和對原理進行了簡單的分析。至於struts是如何實現MVC的,ActionServlet屬於 Controller部分,Action和ActionForm屬於Model層,還是Action屬於Controller層,不同的人對struts 有不同的理解。接下來真正的運用到實踐中,在實踐中深刻去體會,原理固然重要,重要的是運用,是能駕馭和使用這個框架。就像學習開車一樣,不是一蹴而就 的。