今天無意中翻看了一下Struts2.0,結果發現它與Struts1.1有很大的變化,可以說已經變的面目全非了。作為程序員,又必須掌握最新的技術,因此,它一升級,我們就得跟著學習,真可謂不亦苦乎!但水來土掩兵來將擋,你有降龍十八掌,我有乾坤大挪移,咱們見招拆招,以不變應萬變;管你山大王還是蜘蛛精,在我眼裡,都是一堆白骨而已!
首先需要說明的是:在web開發中最好不要濫用Struts標簽——能用html標簽的就盡量使用html標簽,比如一些最基本的頁面對象如button,radio,label,text,textarea,table,form,select,submit等等;除非一些html標簽做不了的事情,例如進行邏輯判斷、 遍歷、比較等等,才需要使用Struts標簽。另外,向視圖中填充數據,也必須要使用Struts標簽,例如:(這是Struts1.x版本中的標簽,不知道Struts2.x中是什麼?)。
這樣,如果需要由Struts1.x版本遷移至Struts2.x版本時,頁面中就無需進行大幅度修改了。而事實上,我開發這麼多網站,還沒有發現html標簽干不了的事情(當然除去一些需要後台進行邏輯處理的事情,但只要是單純用於顯示,html標簽皆足以勝任!) 。
這樣的觀點對於Struts的學習也有一定的指導意義:Struts更新換代的速度也挺快的,如果我們什麼都要學,那豈不是整天要關注它?因此,對於Struts的學習,只需關注如下5個方面即可:
(1)標簽庫的學習:如上所言,Struts標簽庫中的標簽也有好幾十個,我們沒必要去一個一個的學,只需要學習一下需要服務器(或所謂的後台)進行邏輯處理的Struts標簽即可,而對於那些由浏覽器(即所謂的前台)便可以直接解釋的標簽,例如button,text,font,table,radio,form,select……,能不用Struts標簽代替,就最好別用它。這樣,Struts標簽的學習就可以少去4/5的學習量!
(2)Action類的學習:Action一直是Struts框架的核心,它負責頁面呈現,因此需要與中間件打交道,也因此,它是連接Struts框架與其他各層的樞紐。有了Struts1.x的基礎,學習Struts2.x的Action,會很容易掌握。因此,對於有Struts基礎的programer而言,這一部分的學習相當容易,稍微一看就明白。
需要注意的是:如果直接學習Struts2.x,也許不知道Struts1.x中的formbean組件。建議還是盡量了解一下這些,這樣有助於更深入地理解Struts框架的工作原理。
(3)Struts-config.xml配置文件:這是Struts核心之核心——控制器。頁面跳轉、視圖數據傳遞都靠它來控制和指揮。Struts1.x中,需要重點理解和 的原理,同時會使用全局轉發,就OK了!但Struts2.x中,由於視圖數據都被封裝在了action中,因此我不知道它需要怎樣的配置。但只要掌握了Struts1.x的配置,Struts2.x的也不是問題,稍微一看就明白。
(4)Struts與spring的協作:似乎Struts2.x中內置了Ioc,但就如同其發布者所言一樣:能用spring實現Ioc的,就盡量使用spring。因此,無論Struts怎樣更新換代,spring必須要掌握。
(5)Struts與hibernate的協作:作為經典的SSH組合,使用了Struts和spring,怎能丟下hibernate呢?只要以前配置過hibernate的programer們,無論Struts怎樣升級怎樣變相,hibernate的配置幾乎都大同小異的,不會因為Struts的變化就會變難。
綜上,實際上在學習新版本的Struts時,我們只需了解一下其標簽庫、Action和配置,而標簽庫中需要了解的也僅僅是寥寥幾個帶有邏輯功能的標簽便已足夠了。當然,如果你徹底放棄HTML,非要使用Struts標簽,那就多花點時間去看一下。
Struts2.0與Struts1.x的區別
不過,除了上面三個最核心最基本的需要掌握,對於新版本的Struts,還需要了解一些別的改進,以下的內容是我從網上找來的,它對Struts2.0於Struts1.x作了一些比較,看一看,便會了解Struts為什麼要升級了(無非就是使它更完善):
一.Struts2 的簡介
◆ 雖然 Struts2 號稱是一個全新的框架,但是這僅僅是相對於 Struts1 而言的.
◆ Struts2 和 Struts1 相比,確實有很多革命性的改進,但是並不是新發布的新框架.二是另一個框架 WebWork 基礎上發展起來的.
◆ Struts2 沒有繼承 Struts1 的血統,而是繼承 webWork 的血統.
◆ Struts2是 WebWork 的升級,而不是一個全新的框架,穩定性和性能等各方面都有很好的保證
◆ 而且吸收了 Struts1 和 WebWork 兩者的優勢,因此是一個非常值得期待的框架
二. Apache Struts2 是一個可擴展的 Java EE WEB框架:框架設計的目標貫穿整個開發的周期
三. Struts2 和 Struts1 的不同
◆ Action類:
- Struts1 要求 Action 類繼承一個抽象基類. Struts1 的一個普遍的問題是使用抽象類編程而不是接口
- Struts2 Action 類可以實現一個 Action 接口,也可實現其他的接口,使可選和定制的服務稱為可能.
- Struts2 提供了一個 ActionSupport 基類去實現常用的接口; Action接口不是必須的,任何有 execute 標識的POJO
對象都可以用作 Struts2 的 Action 對象
◆ 線程模式:
- Struts1 Action 是單例的模式並且必須是線程安全的,因為僅有 Action 的一個實例來處理所有的請求.單例的策略限制了Struts1 Action 能做的事情,並且要在開發的時候特別的小心. Action 資源必須是線程安全或者同步的
- Struts2 Action 對象為每一個請求產生一個實例,因此沒有線程安全的問題
◆ Servlet依賴:
- Struts1 Action 依賴於 Servlet API,因為當一個Action被調用 HttpServletRequest 和 HttpServletResponse 被傳遞給 execute() 方法
- Struts2 Action 不依賴於容器,允許 Action 脫離容器單獨的被測試.如果需要的話 Struts2 Action 仍然可以訪問初始的 request 和 response但是,其他的元素減少或者消除了直接訪問 HttpServletRequest 和 HttpServletResponse 的必要性
◆ 可測性:
- Struts1 Action 測試的一個主要的問題是 execute 方法暴露了 Servlet API (使得測試要依賴容器).一個第三方的擴展
Struts TestCase -- 提供了一套 Struts1 的模擬對象 (來進行測試)
- Struts2 Action 可以通過初始化, 設置屬性,調用方法來測試 "依賴注入" 支持也使得測試更加的容易
◆ 捕獲輸入:
- Struts1 Action 使用ActionForm對象來捕獲輸入.所有的 ActionForm 必須繼承一個基類.因為其他的JavaBean 不能用作
ActionForm ,開發者經常創建多余的類捕獲輸入.動態的 Bean (DynaBeans) 可以作為創建傳統的ActionForm選擇,但是,開發者可能是在重新描述(創建)已經存在的 JavaBean 會導致冗余的 JavaBean)
- Struts2 Action 直接使用 Action 屬性作為輸入的屬性,消除了對第二個輸入對象的需求. Action 屬性能夠通過web頁面上的taglibs 訪問. Struts2 也支持 ActionForm 模式
◆ 表達式語言:
- Struts1 整合了 JSTL ,因此使用 JSTL EL .這種EL 的基本的對象圖遍歷,但是對集合和索引屬性的支持很弱
- Struts2 可以使用 JSTL ,但是也支持一個更強大的和靈活的表達式語言 -- "Object Graph Notation Language" (OGNL)
◆ 綁定值到頁面 (view) :
- Struts1 使用標准 JSP 機制把對象綁定到頁面來訪問
- Struts2 使用 "ValueStack" 技術,使 taglib 能夠訪問值而不需要把你的頁面 (view) 和對象綁定起來ValueStack 策略允許通過一些列的名稱相同但是類型不同的屬性重用頁面 (view)
◆ 類型的轉換 :
- Struts1 ActionForm 屬性通常都是 String 類型的. Struts1使用 Commons-Beanutils 進行類型的轉換每個類一個轉換器,對每一個實例來說是不可配置的。
- Struts2 使用OGNL 進行類型的轉換. 提供基本的和常用的對象的轉換器
◆ 校驗 :
- Struts1 支持在 ActioNForm 的 validate 方法中手動的校驗,或者通過 Commons Validator 的擴展來校驗. 同一個類可以有不同的校驗內容,但不能校驗子對象
- Struts2 支持通過 validate 方法和 XWork 校驗框架來進行校驗. XWork 校驗框架使用為屬性類類型定義的校驗和內容校驗來支持 chain 校驗子屬性
◆ Action 執行的控制 :
- Struts1 支持每一個模塊有單獨的 Request Processors (生命周期);但是模塊中的所有的 Action 必須功效那個相同的生命周期
- Struts2 支持通過攔截器堆棧 (Interceptor Stacks) 為每一個 Action 創建不同的生命周期.
堆棧能夠根據需要和不同的 Action 一起使用
在項目中導入Struts框架:
接下來,還需要知道在eclipse(myeclipse)中怎樣導入Struts包,以下的內容也是我從網上拷下來的導入Struts2.0的方法:
◆ commons-logging-1.0.4.jar :Struts2框架的日志包
◆ freemarker-2.3.8.jar : Struts2的 UI 標簽的模板
◆ ognl-2.6.11.jar : 對象導航語言包
◆ Struts2-core.2.0.11.jar : Struts框架的核心包
◆ xwork-2.0.4.jar : XWork類庫,Struts2 基於此構建
通過做一個簡單的項目來學會使用新版本的Struts
學習了上面這些,都已經理解了,但是最好通過一個項目實戰來加深一下印象,說不定在項目中你會有新發現!這個項目是:基於 Struts2 創建一個簡單的登陸項目:
1:導入 Struts2 核心支持包
2:在 web.xml 中配置 FilterDispatcher
3:編寫前台顯示的頁面
4:開發 DAO
5:開發 action
6:創建 Struts.xml
搭建開發平台
當然,在開發這個項目之前,還需要搭建一個開發平台:
1:安裝JDK(最好是綠色版本 ),創建環境變量;
2:安裝tomcat(最好是綠色版本),創建環境變量;
3:安裝eclipse或者myeclipse;如果安裝前者,還需要下載一個tomcat-plugin和lomboz-plugin;而後者不需要;
4:回到上面項目第一步——導入Struts核心包(注意:如果安裝的是myeclipse,切不要被其所謂的內置了Struts包所忽悠!在開發項目時,如果視圖層使用Struts框架的,必須在項目的WEB-INF/lib/目錄下導入該有的Struts包)