MVC思想概述:
前端
現在見到的大部分應用都是基於B/S(瀏覽器/服務器)架構的,其中服務器就是Web服務器。可見,Web應用是目前普遍使用的應用模式,而Struts 2是一個具備很好的使用價值的Web MVC框架。在介紹Struts 2以前,咱們先簡單瞭解Web應用的發展歷史和MVC思想。
數據庫
Web技術發展歷程:
後端
(1) 早期的Web應用所有是靜態的HTML頁面(特色: 將固定的文本信息呈現給瀏覽者,不具有與用戶交互的能力,無動態顯示功能);
設計模式
(2) CGI(通用網關接口)技術(優點: 使得Web應用能夠與客戶端瀏覽器交互,再也不須要使用靜態的HTML頁面,可從數據庫讀取信息,能夠獲取用戶的請求參數;劣勢: 開發動態Web應用難度很是大,性能等各方面也存在限制);
瀏覽器
(3) Servlet技術成爲動態Web應用的主要開發技術(優點: Servlet基於Java語言建立的,能夠利用Java語言的優點,如JDBC、多線程等等)
服務器
Servlet在Web應用中被映射成一個URL,該URL能夠被客戶端瀏覽器請求,當用戶向指定URL對應的Servlet發送請求時,該請求被Web服務器接收到,該Web服務器負責處理多線程、網絡通訊等功能,而Servlet的內容決定了服務器對客戶端的響應內容。網絡
(4) JSP技術(特色:JSP做爲腳本語言,不能被當即執行,JSP必須先編譯成Servlet,也就是說JSP的實質是Servlet。但JSP的書寫要比Servlet簡單的多)
多線程
Model1和Model2:架構
Model1:框架
在Model1模式下,整個Web應用幾乎所有由JSP頁面組成,JSP頁面接受處理客戶端請求,對請求處理後直接做出相應。用少許的JavaBean來處理數據庫鏈接、數據庫訪問等操做.
缺點: 從工程化的角度來看,Model1的侷限性很是明顯。JSP頁面身兼View和Controller兩種角色,將控制邏輯和表現邏輯混雜在一塊兒,致使代碼的重用性很是低,增長了應用的擴展性和維護的難度。
Model2:
Model2採用了MVC的設計: 在Model2架構中,Servlet做爲前端控制器,負責接收客戶端的請求,在Servlet中包含控制邏輯和簡單的前端處理; Servlet調用後端JavaBean來完成實際的邏輯處理; 最後轉發到相應的JSP頁面負責顯示.
特色: Model2下JSP再也不承擔控制器的責任,它僅僅是表現層角色,僅僅用於將結果呈現給用戶,JSP頁面的請求與Servlet(控制器)交互,而Servlet負責與後臺的JavaBean通訊。在Model2模式下,模型(Model)由JavaBean充當,視圖(View)由JSP頁面充當,而控制器(Controller)則由Servlet充當。
MVC模式及其優點:
MVC思想講一個應用分紅三個基本部分: Model(模型)、View(視圖) 和 Controller(控制器),這三個部分以最少的耦合協同工做,從而提升應用的可擴展性及可維護性。
特色:
(1) 多個視圖對應一個模型。按MVC設計模式,一個模型對應多個視圖,能夠減小代碼的複製及代碼的維護量,一旦模型發生改變,也易於維護。
(2) 模型返回的數據與顯示邏輯分離。模型數據能夠應用任何顯示技術,如JSP、Velocity模板或者直接產生Excel文檔等。
(3) 應用被分隔爲三層,下降了各層之間的耦合,提供了應用的可擴展性。
(4) 控制層的概念也頗有效,因爲它把不一樣的模型和不一樣的視圖組合在一塊兒,完成不一樣的請求。所以,控制層能夠說是包含了用戶請求權限的概念。
(5) MVC更符合軟件工程化管理的精神。不一樣的層各司其職,每一層的組件具備相同的特徵,有利於經過工程化和工具化產生管理程序代碼。
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Struts1的缺陷與現狀:
Struts目前已經分化成兩個大相徑庭的版本: (1)基於傳統Struts的Struts 1; (2)基於WebWork的Struts 2。因爲Struts1與JSP/Servlet耦合很是緊密,於是致使了許多不可避免的缺陷,下面簡單介紹Struts1的缺陷:
(1) 支持的表現層技術單一。Struts 1只支持JSP做爲表現層技術,不提供與其餘表現層技術,如Velocity、FreeMarker等技術的整合.
(2) 與ServletAPI嚴重耦合。
(3) 代碼依賴於Struts 1 API。
Struts 1已基本無人使用,故從此不會再對Struts 1作相關介紹。
Struts 2的天生優點與體系:
Struts 2是由WebWork升級而來的,WebWork已經不存在了,完全變成了Struts 2。Struts 2採用了一種更加鬆耦合的設計,讓系統的Action不在與ServletAPI耦合,是單元測試更加方便,容許系統從B/S接口向C/S結構轉換。
Struts2的優點:
(1) Action無須與Servlet API耦合,更易測試。Struts 2的Action更像一個普通的Java對象,該控制器代碼中沒有耦合任何Servlet API。
(2) Action無須與WebWork耦合,代碼重用率高。
(3) 支持更多的表現層技術,有更好的適應性。對JSP、Velocity和FreeMark等多種表現層技術都提供了很好的支持。
(4) 更好的模塊化支持。不管是Action管理、Action的輸入校驗,仍是國際化資源文件的管理,Struts2都提供了更好的模塊化支持。
(5) 更好的可擴展性。Struts 2框架的核心由大量攔截器實現,這些攔截器都是可"插拔式"的,所以開發者能夠隨時替換、升級其中的一個或多個攔截器。
Struts 2架構:
Struts 2架構的大體處理流程以下:
(1) 瀏覽器發送請求,例如請求/mypage.action、/reports/myreport.pdf等。
(2) 核心控制器StrutsPrepareAndExecuteFilter根據請求決定調用合適的Action。
(3) Struts 2的攔截器鏈自動對請求應用通用功能,如workflow、validation或文件上傳等功能。
(4) 回調Action的execute方法,該execute方法先獲取用戶請求參數,而後執行某種數據庫操做,既能夠將數據保存到數據庫,也能夠從數據庫中檢索信息。實際上,Action只是一個控制器,它會調用業務邏輯組件來處理用戶的請求。
(5) Action的execute方法將處理結果存入Stack Context中,並返回一個字符串; StrutsPrepareAndExecuteFilter將根據返回的字符串跳轉到指定視圖資源,該視圖資源將會讀取Stack Context中的信息,並向瀏覽器生成響應數據。這些響應數據既能夠是HTML頁面、圖像,也能夠是PDF文檔或者其餘文檔。此時支持的視圖技術很是多,既支持JSP,也支持Velocity、FreeMarker等模板技術。
Struts 2的配置文件:
當Struts建立系統的Action代理時,須要使用Struts 2的配置文件。Struts 2的配置文件有兩份:
配置Action的struts.xml文件.
配置Struts 2全局屬性的struts.properties文件.
struts.xml文件內定義了Struts 2的系列Action,定義Action時,指定該Action的實現類,並定義該Action處理結果與視圖資源之間的映射關係。
Struts 2的全局屬性的配置文件Properties文件: struts.properties:
# 指定Struts 2處於開發狀態 struts.devMode = false # 指定當Struts 2配置文件改變後,Web框架是否從新加載Struts 2配置文件 struts.configuration.xml.reload=true
Struts 2的標籤庫:
Struts 2的標籤庫也是Struts 2的重要組成部分,Struts 2的標籤庫提供了很是豐富的功能,這些標籤庫不加提供了表現層數據處理,並且提供了基本的流程控制功能,還提供了國際化、Ajax支持等功能。
Struts 2的控制器組件:
Struts 2的控制器組件是Struts 2框架的核心,事實上,全部的MVC框架都是以控制器組件爲核心的。正如前面提到的,Struts 2的控制器由兩部分組成: StrutsPrepareAndExecuteFilter和業務控制器Action。Struts 2應用中起做用的業務控制器不是用戶定義的Action,而是系統生成的Action代理,但該Action代理事宜用戶定義的Action爲目標的。
Action的特色:
(1) Action類徹底是一個POJO,所以具備很好的代碼複用性。
(2) Action類無須與Servlet API耦合,所以進行單元測試很是簡單。
(3) Action類的execute方法返回一個字符串做爲處理結果,該處理結果能夠映射到任何視圖,甚至是另外一個Action。