計應134班(實驗班) 陳興html
Struts2概述java
Struts2其實並非一個陌生的Web框架,Struts2是以Webwork的設計思想爲核心,吸取了Struts1的優勢,所以,能夠認爲Struts2是Struts1和Webwork結合的產物。web
1、MVC簡介apache
Struts2是一個兼容Struts1和WebWork的MVC框架,既然,提到了MVC框架,就不得不對MVC框架作一個簡單介紹,僅限於簡單介紹,若是,想了解更多的MVC的知識能夠查看相關的文檔,或者找一本Struts1的書籍,相信上面關於MVC的篇幅不會不多。言歸正傳,其實,Java目前出現的這些框架而言,其最終目的都是爲了接觸耦合,不管是Spring、Hibernate或MVC框架,目的都是爲了接觸耦合增長複用。MVC接觸的是View和Model間的耦合。編程
MVC包含三個基礎部分:Model、View和Controller,這三個部分以最小的耦合協同工做,以增長程序的可擴展性和可維護性。各個部分的實現技術能夠總結以下:
1)Model:JavaBean、EJB的EntityBean
2)View:JSP、Struts的TagLib
3)Controller:Struts的ActionServlet、Action設計模式
歸納起來MVC的優勢主要有一下方面:
1)多個視圖能夠對應一個模型。按MVC設計模式,一個模型對應多個視圖,能夠減小代碼的複製及代碼的維護量,一旦模型發生改變,也易於維護
2)模型返回的數據與顯示邏輯分離。模型數據能夠應用任何的顯示技術,例如,使用JSP頁面、Velocity模板或者直接產生Excel文檔等
3)應用被分隔爲三層,下降了各層之間的耦合,提供了應用的可擴展性
4)控制層的概念也頗有效,因爲它把不一樣的模型和不一樣的視圖組合在一塊兒,完成不一樣的請求。所以,控制層能夠說是包含了用戶請求權限的概念
5)MVC更符合軟件工程化管理的精神。不一樣的層各司其職,每一層的組件具備相同的特徵,有利於經過工程化和工具化產生管理程序代碼瀏覽器
2、Struts2簡介安全
Struts2看似是從Struts1發展而來,但實際上Struts2與Struts1在框架的設計思想上面仍是有很大的區別,Struts2是以WebWork的設計思想爲核心,爲何Struts2不沿用Struts1的設計思想,畢竟Struts1在目前的企業應用中仍是有很是大的市場在的,那麼,來看下Struts1的一些缺點吧:
1)支持的表現層技術單一
2)與Servlet API嚴重耦合,這點能夠從Action的Execute的方法聲明裏面就能夠看的出來
3)代碼依賴Struts1 API,有侵入性,這點能夠從寫Action類和FormBean的時候看的出來,Action必須實現Struts的Action類app
而Struts2之因此以WebWork的設計思想爲其核心,一點就是最近WebWork的上升勢頭,再就是WebWork沒有Struts1上面的那些缺點,更符合MVC的設計思想,也更利於代碼的複用。框架
基於以上介紹能夠看的出,Struts2體系結構與Struts1的體系結構有很大的差異,Struts1是使用ActionServlet作爲其中心處理器,Struts2則使用一個攔截器(FilterDispatcher)作爲其中心處理器,這樣作的一個好處就是將Action類和Servlet API進行了分離。
Struts2的簡單處理流程以下:
1)瀏覽器發送請求
2)中心處理器根據struts.xml文件查找對應的處理請求的Action類
3)WebWork的攔截器鏈自動對請求應用通用功能,例如:WorkFlow、Validation等功 能
4)若是Struts.xml文件中配置Method參數,則調用Method參數對應的Action類中的Method方法,不然調用通用的Execute方法來處理用戶請求
5)將Action類中的對應方法返回的結果響應給瀏覽器
3、Struts2與Struts1對比
1)Action類的實現方式:
Struts1的Action在實現的時候必須擴展Action類或者Action的子類,Struts2的 Action類實現的時候能夠不用實現任何類和接口,雖然Struts2中提供一個ActionSupport類,可是,不是必須的。
2)Struts1的Action類是單例模式,必須設計成線程安全的,Struts2則爲每個請求產生一個實例
3)Struts1的Action類依賴與Servlet API,從其execute的方法簽名可看出,execute方法有兩個Servlet的參數HttpServletRequest和HttpServletResponse,Struts2則不依賴於Servlet API
4)Struts1依賴於Servlet API這些Web元素,所以對Struts1的Action進行測試的時候是很困難的,須要藉助與其餘的測試工具,Struts2的Action能夠象測試其餘的一些Model層的Service類同樣進行測試
5)Struts1的Action與View經過ActionForm或者其子類進行數據傳遞,雖然也有LazyValidationForm這樣的ActionForm的出現,可是,仍是不能象其餘層面那樣經過一個簡單的POJO進行數據傳遞,而Struts2將這樣的奢望變成了現實
6)Struts1綁定了JSTL,爲頁面的編寫帶來方便,Struts2整合了ONGL,也可使用JSTL,所以,Struts2下的表達式語言更增強大
4、Struts2與WebWork對比
Struts2實際上就是WebWork2.3,不過,Struts2仍是與WebWork有少量的差異:
1)Struts2再也不支持內置IOC容器,改用Spring的IOC容器
2)Struts2對於Webwork的一些Ajax的特性的標籤改用Dojo進行替換
(二)Struts2工做流程
Struts 2框架自己大體能夠分爲3個部分:核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。
1、核心控制器FilterDispatcher
核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯組件是須要用戶來本身實現的。用戶在開發Action和業務邏輯組件的同時,還須要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。
Struts 2的工做流程相對於Struts 1要簡單,與WebWork框架基本相同,因此說Struts 2是WebWork的升級版本。Struts 2框架按照模塊來劃分,能夠分爲Servlet Filters、Struts核心模塊、攔截器和用戶實現部分。Struts 2框架結構圖下圖所示。
一個請求在Struts 2框架中的處理大概分爲如下幾個步驟。
1)客戶端提交一個(HttpServletRequest)請求。
2)請求被提交到一系列(主要是3層)的過濾器(Filter),如(ActionContextCleanUp、其餘過濾器(SiteMesh等)、 FilterDispatcher)。注意:這裏是有順序的,先ActionContext CleanUp,再其餘過濾器(Othter Filters、SiteMesh等),最後到FilterDispatcher。
3)FilterDispatcher是控制器的核心,就是MVC的Struts 2實現中控制層(Controller)的核心。
4)FilterDispatcher詢問ActionMapper是否須要調用某個Action來處理這個(HttpServlet Request)請求,若是ActionMapper決定須要調用某個Action,FilterDispatcher則把請求的處理交給ActionProxy。
5)ActionProxy經過Configuration Manager(struts.xml)詢問框架的配置文件,找到須要調用的Action類。例如,用戶註冊示例將找到UserReg類。
6)ActionProxy建立一個ActionInvocation實例,同時ActionInvocation經過代理模式調用Action。但在調用以前,ActionInvocation會根據配置加載Action相關的全部Interceptor(攔截器)。
7)一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果result。
Struts 2設計的精巧之處就是使用了Action代理,Action代理能夠根據系統的配置,加載一系列的攔截器,由攔截器將HttpServletRequest參數解析出來,傳入Action。一樣,Action處理的結果也是經過攔截器傳入HttpServletResponse,而後由HttpServletRequest傳給用戶。
其實,該處理過程是典型的AOP(面向切面編程)的方式。Struts 2處理過程模型以下圖所示。
★ 說明 ★
攔截器是Struts 2框架的核心,經過攔截器,實現了AOP(面向切面編程)。使用攔截器,能夠簡化Web開發中的某些應用,例如,權限攔截器能夠簡化Web應用中的權限檢查。
2、業務控制器Action
業務控制器Action是由開發者本身編寫實現的,Action類能夠是一個簡單的Java類,與Servlet API徹底分離。Action通常都有一個execute()方法,也能夠定義其餘業務控制方法。
Action的execute()返回一個String類型值,這與Struts 1返回的ActionForward相比,簡單易懂。Struts 2提供了一個ActionSupport工具類,該類實現了Action接口和validate()方法,通常開發者編寫Action能夠直接繼承ActionSupport類。編寫Action類後,開發者還必須在配置文件中配置Action。一個Action的配置應該包含下面幾個元素:
— 該Action的name,即用戶請求所指向的URL。
— Action所對應的class元素,對應Action類的位置。
— 指定result邏輯名稱和實際資源的定位。
Action是業務控制器,在編寫Action的時候,儘可能避免將業務邏輯放到其中,儘可能減小Action與業務邏輯模塊或者組件的耦合程度。
3、業務模型組件
業務模型組件能夠是實現業務邏輯的模塊,能夠是EJB、POJO或者JavaBean,在實際開發中,對業務模型組件的區分和定義也是比較模糊的,實際上也超出了Struts 2框架的範圍。不一樣的開發者或者團隊,都有本身的方式來實現業務邏輯模塊,Struts 2框架的目的就是使用Action來調用業務邏輯模塊。
實際開發中,可使用靜態工廠得到業務邏輯組件的實例或者使用IoC容器來管理。Action中不實現任何業務邏輯,只是負責組織調度業務邏輯組件。調用關係如圖所示。
★ 說明 ★
業務控制器Action通常狀況下不是直接建立業務邏輯組件實例,而是使用工廠模式或者是從Spring容器中得到業務邏輯組件實例,這樣能夠提升系統的性能。
4、視圖組件
Struts 1只能支持JSP做爲視圖資源,而Struts 2的進步之處就是可使用其餘視圖技術,如FreeMarker、Velocity等。經過前面的學習和示例,讀者會知道Action的返回結果只是一個簡單的字符串,也就是一個邏輯上的視圖名稱,要與實際視圖資源對應,必須經過配置文件來實現。
在struts.xml配置文件中,每個Aciton定義都有name和class屬性,同時還要指定result元素。result元素指定了邏輯視圖名稱和實際視圖的對應關係。每一個result都有一個type屬性,前面介紹的struts.xml中並無顯式指定type值,即便用了默認的type類型:dispatcher,該結果類型支持JSP所謂視圖資源。
總結Strurs 2的框架工做流程,與WebWork基本相同,
(三)Struts2簡單實例
下面是struts2的helloWorld示例。建工程,導入struts2包之類的就很少說了,主要說一下代碼的構建過程。
1、配置web.xml文件
下面是登錄實例中的完整web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<!— 配置filter-- >
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<!—攔截全部URL用戶請求
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!—配置歡迎界面文件-- >
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>