STRUCT2 權威指南(1)
MVC思想將一個應用分成三個基本部分:Model(模型)、View(視圖)和Controller(控制器),這三個部分以最少的耦合協同工作,從而提高應用的可擴展性及可維護性。
(1)Model部分
Struts 1的Model部分主要由底層的業務邏輯組件充當,這些業務邏輯組件封裝了底層數據庫訪問、業務邏輯方法實現。實際上,對於一個成熟的企業應用而言,Model部分也不是一個簡單的JavaBean所能完成的,它可能是一個或多個EJB組件,可能是一個WebService服務。總之,Model部分封裝了整個應用的所有業務邏輯,但整個部分並不是由Struts 1提供的,Struts 1也沒有為實現Model組件提供任何支持。
(2)View部分
Struts 1的View部分采用JSP實現。Struts 1提供了豐富的標簽庫,通過這些標簽庫可以最大限度地減少腳本的使用。這些自定義的標簽庫可以輸出控制器的處理結果。
雖然Struts 1提供了與Ties框架的整合,但Struts 1所支持的表現層技術非常單一:既不支持FreeMarker、Velocity等模板技術,也不支持JasperReports等報表技術。
(3)Controller部分
Struts 1的Controller由兩個部分組成。
— 系統核心控制器:由Struts 1框架提供,就是系統中的ActionServlet。
— 業務邏輯控制器:由Struts 1框架提供,就是用戶自己實現的Action實例。
Struts 1的核心控制器對應圖1.7中的核心控制器(ActionServlet)。該控制器由Struts 1框架提供,繼承HttpServlet類,因此可以配置成一個標准的Servlet,該控制器負責攔截所有HTTP請求,然后根據用戶請求決定是否需要調用業務邏輯控制器,如果需要調用業務邏輯控制器,則將請求轉發給Action處理,否則直接轉向請求的JSP頁面。
業務邏輯控制器負責處理用戶請求,但業務邏輯控制器本身並不具有處理能力,而是調用Model來完成處理。
Struts 1提供了系統所需要的核心控制器,也為實現業務邏輯控制器提供了許多支持。因此,控制器部分就是Struts 1框架的核心。有時候,我們直接將MVC層稱為控制器層。
1.1 常見的MVC框架
常見的MVC框架有JSF、Tapestry和SpringMVC。我們主要介紹SpringMVC框架
1.2 Struct2體系介紹
Struts 2的體系與Struts 1體系的差別非常大,因為Struts 2使用了WebWork的設計核心,而不是使用Struts 1的設計核心。Struts 2大量使用攔截器來處理用戶請求,從而允許用戶的業務邏輯控制器與Servlet API分離
1.3 struct2的配置文件
Struts 2的配置文件有兩份:
— 配置Action的struts.xml文件。
— 配置Struts 2全局屬性的struts.properties文件。
struts.xml文件內定義了Struts 2的系列Action,定義Action時,指定該Action的實現類,並定義該Action處理結果與視圖資源之間的映射關系
文件實例(structs.xml):
1 <struts> 2 <!-- Struts 2的Action都必須配置在package里 --> 3 <package name="default" extends="struts-default"> 4 <!-- 定義一個Logon的Action,實現類為lee.Logon --> 5 <action name="Logon" class="lee.Logon"> 6 <!-- 配置Action返回input時轉入/pages/Logon.jsp頁面 --> 7 <result name="input">/pages/Logon.jsp</result> 8 <!-- 配置Action返回cancel時重定向到Welcome的Action--> 9 <result name="cancel" type="redirect-action">Welcome</result> 10 <!-- 配置Action返回success時重定向到MainMenu的Action --> 11 <result type="redirect-action">MainMenu</result> 12 <!-- 配置Action返回expired時進入ChangePassword的Action鏈 --> 13 <result name="expired" type="chain">ChangePassword</result> 14 </action> 15 <!-- 定義Logoff的Action,實現類為lee.Logoff --> 16 <action name="Logoff" class=" lee.Logoff"> 17 <!-- 配置Action返回success時重定向到MainMenu的Action --> 18 <result type="redirect-action">Welcome</result> 19 </action> 20 </package> 21 </struts>
在上面的struts.xml文件中,定義了兩個Action。定義Action時,不僅定義了Action的實現類,而且的定義Action的處理結果時,指定了多個result,result元素指定execute方法返回值和視圖資源之間的映射關系。對於如下配置片段:
<result name="cancel" type="redirect-action">Welcome</result>
表示當execute方法返回cancel的字符串時,跳轉到Welcome的Action。定義result元素時,可以指定兩個屬性:type和name。其中name指定了execute方法返回的字符串,而type指定轉向的資源類型,此處轉向的資源可以是JSP,也可以是FreeMarker等,甚至是另一個Action——這也是Struts 2可以支持多種視圖技術的原因。
除此之外,Struts 2還有一個配置Struts 2全局屬性的Properties文件:struts.properties。該文件的示例如下:
#指定Struts 2處於開發狀態
struts.devMode = false
//指定當Struts 2配置文件改變后,Web框架是否重新加載Struts 2配置文件
struts.configuration.xml.reload=true
正如上面見到的,struts.properties文件的形式是系列的key、value對,它指定了Struts 2應用的全局屬性