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



















