Struts2 介紹, 原理,攔截器

Struts2 相 關 資 料


Struts2並非繼承自Struts1的構架機制,而是繼承自WebWork,因爲Struts2是對WebWork的升級而產生的,Struts2吸收了Struts1WebWork兩者的優勢,從而在穩定性、性能等各方面都有很好的保證。

Apache Struts2即使之前的WebWork2,經歷幾年的發展後WebWorkStruts2社區決定合併,也即是現在的Struts2

Struts1Struts2的不同

Action類:

Struts1要求Action類繼承一個抽象基類,Struts1的普遍問題是使用抽象類編程而不是接口

Struts2 Action類可以實現一個Action接口,也可實現其他接口使可選和定製的服務成爲可能。Struts2提供一個ActionSupport基類去實現常用接口,Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2Action對象

注:POJOPlains and old Java Object普通的Java類,不繼承自特殊類,包含但不限於JavaBean

Struts1Struts2的不同

線程模式:

Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。

Struts2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。

Struts1Struts2的不同

Servlet依賴:

Struts1Action依賴於Servlet API因爲Action被調用時HttpServletRequestHttpServletResponse被傳遞給execute方法。

Struts2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要Struts2 Action仍然可以訪問初始的requestresponse。但是,其他元素減少或者消除了直接訪問HttpServletRequestHttpServletResponse的必要性

Struts1Struts2的不同

捕獲輸入:

Struts1使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因爲其他JavaBean不能用作ActionForm,開發者經常創建多餘的類捕獲輸入。

Struts2直接使用Action屬性作爲輸入屬性,消除了對第二輸入對象的要求。Action屬性能夠通過web頁面上的taglibs訪問。

Struts2也支持AcionForm模式。

Struts1Struts2的不同

類型轉換:

Struts1 ActionForm屬性通常是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每個實例來說是不可配置的。

Struts2使用OGNL進行類型轉換。提供基本和常用對象的轉換器。

校驗:

Struts1支持在ActionFormvalidate方法手動校驗,或者通過Commons Validateor的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。

Struts2支持通過validate方法和Xwork校驗框架來進行校驗。Xwork叫要框架使用爲屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性

XWork

實現獨立運行的命令模式框架:

Action作爲命令對象存在於XWork中。

添加了高級功能

攔截器

包括設置表單數,處理文件上傳等

結果

包括多個Action之間的連接,轉向表示層

簡單的IoC(或者DI,依賴注入)容器,可對Action對象注入值(Spring

強大的對象查詢語言-OGNL

自動類型轉換

元數據驅動的驗證框架

插件機制

Struts2基礎包

struts2-core-2.0.11.jar

Struts2框架的核心類庫

commons-logging-1.0.4.jar

Struts2框架日誌包

freemaker-2.3.8.jar

Struts2UI標籤的模板

ognl-2.6.11.jar

對象圖導航語言包

xwork-2.0.4.jar

XWork類庫,struts2基於此構建

注:

加入所有jar包後項目無法啓動:

struts2基於插件機制,插件載入時會自動實例化需要的類庫,此時會出錯。

Struts Core

封裝HTTP請求/響應對象爲Map

處理Sessions/Application範圍

ServletDispatcher轉換HTTP請求執行Action

提供了Web層的攔截器

Result轉換爲具體的redirect&dispatch,或者其他表示層

Struts2的系統架構圖

MVC

MVCModelViewController的簡寫。"Model"代表的是應用的業務邏輯(通過JavaBeanEJB組件實現),"View"是應用的表示面(由JSP頁面產生),"Controller"是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。從而彌補了Model 1的不足。

*Model 1: JSP頁面中可以非常容易地結合業務邏輯(jsp:useBean)、服務端處理過程(jsp:scriplet)和HTML(),在JSP頁面中同時實現顯示,業務邏輯和流程控制,從而可以快速地完成應用開發。現在很多的Web應用就是由一組JSP頁面構成的。這種以JSP爲中心的開發模型我們可以稱之爲Model 1

Struts2

Controller:FilterDispatcher

Model:ActionInterceptors

Struts2流程

一個請求在Struts 2框架中的處理大概分爲以下幾個步驟。

客戶端提交一個(HttpServletRequest)請求,如上文在瀏覽器中輸入
http://localhost: 8080/bookcode/ch2/Reg.action
就是提交一個(HttpServletRequest)請求。

求被提交到一系列(主要是3層)的過濾器(Filter),如(ActionContextCleanUp、其他過濾器(SiteMesh等)、FilterDispatcher)。注意:這裏是有順序的,先ActionContext CleanUp,再其他過濾器(Othter FiltersSiteMesh等),最後到FilterDispatcher

FilterDispatcher是控制器的核心,就是MVCStruts 2中實現控制層(Controller)的核心。

Struts2流程

FilterDispatcher詢問ActionMapper是否需要調用某個Action來處理這個(HttpServlet Request)請求,如果ActionMapper決定需要調用某個ActionFilterDispatcher則把請求的處理交給ActionProxy

ActionProxy通過Configuration Managerstruts.xml)詢問框架的配置文件,找到需要調用的Action類。例如,用戶註冊示例將找到UserReg類。

ActionProxy創建一個ActionInvocation實例,同時ActionInvocation通過代理模式調用Action。但在調用之前,ActionInvocation會根據配置加載Action相關的所有Interceptor(攔截器)。

一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果result

執行流程

Action->FilterDispatcher->struts.xml

->namespace+ActionName->new Action

->填充表單setXxx()->action.execute()

->success->Result->設置request屬性

->跳轉目標頁

下載Struts2

下載地址:

http://struts.apache.org/2.x/點擊Download,選擇下載

完整版:

http://apache.etoak.com/struts/binaries/struts-2.1.8-all.zip

完整版-------------------------------------

示例應用----------------------------------

基礎依賴類庫----------------------------

文檔----------------------------------------

源代碼-------------------------------------

下載XWork

Struts2下載包內不含XWork源碼,如有需要需從XWork網站下載

下載地址:http://www.opensymphony.com/xwork/download.action

Struts2開發環境需求

JDK 1.5或者更高版本

Tomcat 5.5或者更高版本

EclipseMyEclipse)或者NetBeans

暫無專門的Eclipse struts2插件】

MyEclipseJavaEE 5.0支持存在問題,一般使用J2EE1.4建立新項目

MyEclipse的漢化

運行後MyEclipse,進入主界面。在主菜單欄處依次點:help-->software update-->Find And Install”,這時彈出一個界面,選擇要安裝的功能部件,選擇第2項(搜索要安裝的新功能部件),然後點next,進入下一步。

然後選擇New Remote Site(新建遠程站點),彈出一個對話框,有兩項,第一項是起的名字,隨便起,就叫language吧,第2項是個URL,填入:http://download.eclipse.org/technology/babel/update-site/ganymedehttp://download.eclipse.org/technology/babel/update-site/europa這個下載地址,(finish)確定就行了。

更新了一段時間後,會彈出一個對話框,選擇一個站點,比如選擇chinabeijing)這個下載站點,速度挺快的(15分鐘的樣子就能下完漢化包),選擇好站點後,又更新一段時間,然後會彈出一個語言包列表框(language pack),一共有32個語言包,不需要全部下載,只需下載chineseSimplified)”這個語言包就行了,選擇好後,點next,繼續下載更新。最後,會彈出一個對話框,讓選擇安裝路徑,默認即可(D:\Program Files\MyEclipse 6.5\eclipse),點"finish"。下載完後,會提示安裝,然後點“install all”就行了。安裝完後,提示要關閉myelicpse,確認即可。

MyEclipse6.5漢化包安裝完成後,把D:\Program Files\MyEclipse 6.5\eclipse\eclipse.ini裏的-Duser.language=en刪除掉並保存,重啓Myeclipse,則漢化成功

Struts2項目開發基本配置

啓動MyEclipse

創建Web Project

添加必須的struts2 jar

web.xml加入Struts2過濾器

創建jsp表示層頁面

創建Action

創建struts.xml並加入Action定義

運行測試

struts.xml配置

<package name="test1" extends="struts-default">

<action name="test" class="a.c.b.s">

<result name="success">OK.jsp</result>

</action>

</package>

表單標籤

Radio單選標籤

Select下拉列表標籤

Optgroup分組列表

Checkboxlist複選框

Doubleselect雙關聯列表

Combobox文本框+下拉列表

Updownselect複選框

Optiontransferselect傳輸選擇列表

Submit提交

*附:表單標籤屬性及配置實例

Radio

radio標籤

radio標籤將呈現爲一組單選按鈕,單選按鈕的個數與程序員通過該標籤的list屬性提供的選項的個數相同。雖說radio標籤也可以用於只用提供一種選項的場合,但正規的做法是用它來實現一組"多選一"選項。對於那些可以歸結爲"/"選擇的情況,你應該選用checkbox標籤而不是radio標籤來處理。

Select標籤

struts2select標籤中,常用的有以下幾個屬性:

(1)struts2中的select標籤中,必須設置的屬性只有一個,即是list

(2)select標籤的list中必須有值,不然會報錯。如果沒有值,可以加上headerKey, headerValue,這樣就可以通過了
其中,即使list中有值,我們也通常會加上headerKey, headerValue,即列表中顯示的第一個選項。注意,headerKey不可以爲空,不可以爲-1

(3)list屬性:通常是在action中定義的,必須是一個可以迭代的源,如爲一個List, Map, Set等。如果是一個Map,那麼mapkey就對應於select標籤中的valuemap中的value就對應於select標籤中的option。而如果是一個List或者是一個Set,那麼可以通過listKeylistValue指定。

(4)listKeylistValuelistKey即對應於select標籤中的valuelistValue即對應於select標籤中的option

(5)name屬性:即是表單中select的名稱。

Optgroup

optgroup標籤對選項進行分組

你可以用optgroup標籤對select元素所提供的選項進行分組。每個選項組有它自己的來源。

Checkboxlist

checkboxlist標籤

checkboxlist標籤將呈現爲一組單選框。

Combobox

combobox標籤將呈現爲一個文本輸入字段和一個select元素。

Updownselect

updownselect標籤的功能與checklist標籤相似,它也允許你從一組選項裏選中多個選項。updownselect標籤將呈現爲一個select元素,這個select元素的multiple屬性被設置爲multiple,並且還有用來同時選中所有選項的按鈕,和用來對那些選項重新排序的按鈕

Optiontransferselect

optiontransferselect標籤將呈現爲兩個select元素,內建在這個標籤裏的Javascript函數可以在那兩個select元素之間來回“傳輸”各個選項。

注意只有被選中(突出顯示)的選項纔會被髮送到服務器。把一個選項從左側的select元素移動到右側的select元素並不等於選中了它。

Doubleselect

doubleselect標籤將呈現爲兩個相互關聯的select元素

OGNL

OGNLObject-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言(Expression Language,簡稱爲EL),通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。

OGNL的應用場景:

標籤中:<s:propertyvalue="user.name"/>

配置文件中:<result type="redirect">/main.jsp?name=${name}</result>

OGNL%的使用:

%{}可以取出存在值堆棧中的Action對象,直接調用它的方法.

例如你的Action如果繼承了ActionSupport .那麼在頁面標籤中,用%{getText('key')}的方式可以拿出國際化信息.

OGNL中“$”有兩個主要

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章