Struts2 相 關 資 料
Struts2並非繼承自Struts1的構架機制,而是繼承自WebWork,因爲Struts2是對WebWork的升級而產生的,Struts2吸收了Struts1和WebWork兩者的優勢,從而在穩定性、性能等各方面都有很好的保證。
Apache Struts2即使之前的WebWork2,經歷幾年的發展後WebWork和Struts2社區決定合併,也即是現在的Struts2。
Struts1和Struts2的不同
Action類:
Struts1要求Action類繼承一個抽象基類,Struts1的普遍問題是使用抽象類編程而不是接口
Struts2 Action類可以實現一個Action接口,也可實現其他接口使可選和定製的服務成爲可能。Struts2提供一個ActionSupport基類去實現常用接口,Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象
注:POJO:Plains and old Java Object普通的Java類,不繼承自特殊類,包含但不限於JavaBean
Struts1和Struts2的不同
線程模式:
Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。
Struts2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。
Struts1和Struts2的不同
Servlet依賴:
Struts1Action依賴於Servlet API因爲Action被調用時HttpServletRequest和HttpServletResponse被傳遞給execute方法。
Struts2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要Struts2 Action仍然可以訪問初始的request和response。但是,其他元素減少或者消除了直接訪問HttpServletRequest和HttpServletResponse的必要性
Struts1和Struts2的不同
捕獲輸入:
Struts1使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因爲其他JavaBean不能用作ActionForm,開發者經常創建多餘的類捕獲輸入。
Struts2直接使用Action屬性作爲輸入屬性,消除了對第二輸入對象的要求。Action屬性能夠通過web頁面上的taglibs訪問。
Struts2也支持AcionForm模式。
Struts1和Struts2的不同
類型轉換:
Struts1 ActionForm屬性通常是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每個實例來說是不可配置的。
Struts2使用OGNL進行類型轉換。提供基本和常用對象的轉換器。
校驗:
Struts1支持在ActionForm的validate方法手動校驗,或者通過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
Struts2的UI標籤的模板
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
MVC是Model-View-Controller的簡寫。"Model"代表的是應用的業務邏輯(通過JavaBean,EJB組件實現),"View"是應用的表示面(由JSP頁面產生),"Controller"是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。從而彌補了Model 1的不足。
*Model 1: JSP頁面中可以非常容易地結合業務邏輯(jsp:useBean)、服務端處理過程(jsp:scriplet)和HTML(),在JSP頁面中同時實現顯示,業務邏輯和流程控制,從而可以快速地完成應用開發。現在很多的Web應用就是由一組JSP頁面構成的。這種以JSP爲中心的開發模型我們可以稱之爲Model 1。
在Struts2中
Controller:FilterDispatcher
Model:Action,Interceptors
Struts2流程
一個請求在Struts 2框架中的處理大概分爲以下幾個步驟。
客戶端提交一個(HttpServletRequest)請求,如上文在瀏覽器中輸入
http://localhost: 8080/bookcode/ch2/Reg.action就是提交一個(HttpServletRequest)請求。
請求被提交到一系列(主要是3層)的過濾器(Filter),如(ActionContextCleanUp、其他過濾器(SiteMesh等)、FilterDispatcher)。注意:這裏是有順序的,先ActionContext CleanUp,再其他過濾器(Othter Filters、SiteMesh等),最後到FilterDispatcher。
FilterDispatcher是控制器的核心,就是MVC的Struts 2中實現控制層(Controller)的核心。
Struts2流程
FilterDispatcher詢問ActionMapper是否需要調用某個Action來處理這個(HttpServlet Request)請求,如果ActionMapper決定需要調用某個Action,FilterDispatcher則把請求的處理交給ActionProxy。
ActionProxy通過Configuration Manager(struts.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或者更高版本
Eclipse(MyEclipse)或者NetBeans等
暫無專門的Eclipse struts2插件】
MyEclipse對JavaEE 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/ganymede或http://download.eclipse.org/technology/babel/update-site/europa這個下載地址,(finish)確定就行了。
更新了一段時間後,會彈出一個對話框,選擇一個站點,比如選擇china(beijing)這個下載站點,速度挺快的(15分鐘的樣子就能下完漢化包),選擇好站點後,又更新一段時間,然後會彈出一個語言包列表框(language pack),一共有32個語言包,不需要全部下載,只需下載chinese(Simplified)”這個語言包就行了,選擇好後,點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標籤
struts2的select標籤中,常用的有以下幾個屬性:
(1)struts2中的select標籤中,必須設置的屬性只有一個,即是list。
(2)select標籤的list中必須有值,不然會報錯。如果沒有值,可以加上headerKey, headerValue,這樣就可以通過了
其中,即使list中有值,我們也通常會加上headerKey, headerValue,即列表中顯示的第一個選項。注意,headerKey不可以爲空,不可以爲-1
(3)list屬性:通常是在action中定義的,必須是一個可以迭代的源,如爲一個List, Map, Set等。如果是一個Map,那麼map的key就對應於select標籤中的value,map中的value就對應於select標籤中的option。而如果是一個List或者是一個Set,那麼可以通過listKey和listValue指定。
(4)listKey和listValue:listKey即對應於select標籤中的value,listValue即對應於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
OGNL是Object-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中“$”有兩個主要