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