1、Struts開發基礎 1.1 MVC的基本概念 mvc將一個應用系統的輸入、處理和輸出流程按照Model(模型)、View(視圖)和Controller(控制器)三部分進行分離,劃分成模型層、視圖層和控制層。三層之間以最少的耦合來協同工作,從而提高了應用 系統的可擴展性和可維護性。 MVC思想的 ...
1、Struts開發基礎
1.1 MVC的基本概念
mvc將一個應用系統的輸入、處理和輸出流程按照Model(模型)、View(視圖)和Controller(控制器)三部分進行分離,劃分成模型層、視圖層和控制層。三層之間以最少的耦合來協同工作,從而提高了應用
系統的可擴展性和可維護性。
MVC思想的核心就是分層。它將系統的各個組件進行分類,不同的組件扮演不同的角色,然後將系統中的組件分隔到不同的層中,這些組件將被嚴格限制在其所在的層內。各層之間則以鬆散耦合的方式組合在一起,從而保證良好的封裝性。MVC三層之間的關係如圖所示。
1. 模型層
模型層代表的是數據和其對應的業務邏輯。它負責對數據進行處理和更新。通常,模型和現實世界對數據的處理過程類似,業務處理的過程對於視圖層和控制層來說是黑箱操作:模型層接受視圖層(通過控制層傳送到)的請求數據,並返回最終的處理結果,以更新視圖層。
2.視圖層
視圖層實際上是模型層中各個模型的具體表現形式。它通過模型得到數據,然後再根據需要進行顯示。視圖層必須保持著與模型層的數據模型一致,即當模型層的數據發生變化時,視圖層必須隨之變化。
3.控制層
控制層在MVC結構中連接模型層和視圖層,起到了紐帶的作用。它將視圖層的交互信息進行過濾等處理後,再傳送到模型層相應的邏輯業務處理程式進行處理。
在Web應用中,視圖層首先向控制層發送信息,控制層接收到請求後,再把請求信息傳遞給模型層,告知模型應該做什麼處理,接著,模型接受請求數據,並產生最終的處理結果。模型層對應的動作包括:業務處理和模型狀態的改變,最後根據模型層產生的結果,控制層將數據反饋給用戶,併在瀏覽器中顯示。
總的來說,MVC有如下特點:
- 低耦合性。MVC架構通過分層,降低了層與層之間的耦合,提高了程式的可擴展性,有助於程式員靈活的進行編碼。
- 一個模型可以對應多個視圖。按照MVC的設計模式,一個模型對應多個視圖,可以提高代碼的可維護性。即使模型發生改變,也方便維護。
- 模型返回的數據與顯示邏輯分離。模型數據可以應用任何的顯示技術,各層只負責自己的任務,而不用去管其他層的任務。
- 有利於工程化管理。MVC將不同的模型和不同的視圖組合在一起進行管理,層與層之間分離,每一層都有各自的特色。由於代碼可復用,因此降低了軟體開發周期。
1.2 Struts的工作原理
1.Struts概述
Struts1是真正意義上的MVC模式,,但Struts1在性能高效、松耦低侵入等方面存在著不足之處。所以Struts2出現彌補了Struts1這方面的缺陷和不足,並且還提供了更加靈活與強大的功能。
Struts2並不是Struts1的升級版,而是一個全新的框架。它將Struts技術與WebWork技術完美地結合起來,所以功能更加靈活。
2.Struts2工作流程
Struts2是一個全新的開發框架,如圖所示為Struts2的體繫結構圖。
- 橙色是Servlet Filters,過濾器鏈,所有的請求都要經過Filter鏈的處理。
- 淺藍色是Struts Core,Struts2的核心部分,Struts2中已經做好的功能,在實際開發中不需要動它們。
- 淺綠色是Interceptors,Struts2的攔截器。Struts2提供了很多預設的攔截器,可以完成日常開發的絕大部分工作;當然,也可以自定義攔截器,用來實現具體業務需要的功能。
- 淺黃色是User Created,由開發人員創建的,包括struts.xml、Action、Template,是每個使用Struts2來進行開發的人員都必須會的。
各自功能:
- FilterDispatcher是整個Struts2的調度中心,根據ActionMapper的結果來決定是否處理請求,如果ActionMapper指出該URL應該被Struts2處理,那麼它將會執行Action處理,並停止過濾器鏈上還沒有執行的過濾器。
- ActionMapper提供了HTTP請求與action執行之間的映射,簡單點說,ActionMapper會判斷這個請求是否應該被Struts2處理,如果需要Struts2處理,ActionMapper會返回一個對象來描述請求對應的ActionInvocation的信息。
- ActionProxy是一個特別的中間層,位於Action和xwork之間,使得我們在將來有機會引入更多的實現方式,比如通過WebService來實現等。
- ConfigurationManager是xwork配置的管理中心,通俗的講,可以把它看做struts.xml這個配置文件在記憶體中的對應。
- struts.xml是Stuts2的應用配置文件,負責諸如URL與Action之間映射的配置、以及執行後頁面跳轉的Result配置等。
- ActionInvocation:真正調用並執行Action,它擁有一個Action實例和這個Action所依賴的攔截器實例。ActionInvocation會執行這些攔截器、Action以及相應的Result。
- Interceptor(攔截器):攔截器是一些無狀態的類,攔截器可以自動攔截Action,它們給開發者提供了在Action運行之前或Result運行之後來執行一些功能代碼的機會。類似於我們熟悉的javax.servlet.Filter。
- Action:動作類是Struts2中的動作執行單元。用來處理用戶請求,並封裝業務所需要的數據。
- Result:Result就是不同視圖類型的抽象封裝模型,不同的視圖類型會對應不同的Result實現,Struts2中支持多種視圖類型,比如Jsp,FreeMarker等。
- Templates:各種視圖類型的頁面模板,比如JSP就是一種模板頁面技術。
- Tag Subsystem:Struts2的標簽庫,它抽象了三種不同的視圖技術JSP、velocity、freemarker,可以在不同的視圖技術中,幾乎沒有差別的使用這些標簽。
Struts2處理請求步驟:
- 用戶發出一個HttpServletRequest請求。
- 該請求經過一系列的過濾器Filter來傳送。
- 調用FilterDispatcher。FilterDispatcher是控制器的核心,它通過詢問ActionMapper來確定該請求是否需要調用某個Action。如果需要調用某個Action,則FilterDispatcher就把請求轉交給ActionProxy處理。
- ActionProxy通過配置管理器Configuration Mannager詢問框架的配置文件Struts.xml,從而找到需要調用的Action類。
- ActionProxy創建一個ActionInvocation的實例,該實例使用命名模式來調用。在Action執行的前後,ActionInvocation實例根據配置文件載入與Action相關的所有攔截器Interceptor。
- 一旦Action執行完畢,ActionInvocation實例就根據Struts.xml文件中的配置找到相對應的返回結果。返回結果通常是一個JSP或者FreeMarker的模板。其中,FreeMarker是一個用Java語言編寫的模板引擎,它基於模板來生成文本輸出。FreeMarker與Web容器無關,即在Web運行時,它並不知道Servlet或Http。