SSH框架的底層機(jī)制及原理教學(xué)內(nèi)容_第1頁(yè)
SSH框架的底層機(jī)制及原理教學(xué)內(nèi)容_第2頁(yè)
SSH框架的底層機(jī)制及原理教學(xué)內(nèi)容_第3頁(yè)
SSH框架的底層機(jī)制及原理教學(xué)內(nèi)容_第4頁(yè)
SSH框架的底層機(jī)制及原理教學(xué)內(nèi)容_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Good is good, but better carries it.精益求精,善益求善。SSH框架的底層機(jī)制及原理-HYPERLINK/blog/688890Struts1的工作原理Struts1工作原理圖:1、初始化:struts框架的總控制器ActionServlet是一個(gè)Servlet,它在web.xml中配置成自動(dòng)啟動(dòng)的Servlet,在啟動(dòng)時(shí)總控制器會(huì)讀取配置文件(struts-config.xml)的配置信息,為struts中不同的模塊初始化相應(yīng)的對(duì)象。(面向?qū)ο笏枷?2、發(fā)送請(qǐng)求:用戶(hù)提交表單或通過(guò)URL向WEB服務(wù)器提交請(qǐng)求,請(qǐng)求的數(shù)據(jù)用HTTP協(xié)議傳給web服務(wù)器。3、f

2、orm填充:struts的總控制器ActionServlet在用戶(hù)提交請(qǐng)求時(shí)將數(shù)據(jù)放到對(duì)應(yīng)的form對(duì)象中的成員變量中。4、派發(fā)請(qǐng)求:控制器根據(jù)配置信息對(duì)象ActionConfig將請(qǐng)求派發(fā)到具體的Action,對(duì)應(yīng)的formBean一并傳給這個(gè)Action中的excute()方法。5、處理業(yè)務(wù):Action一般只包含一個(gè)excute()方法,它負(fù)責(zé)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯(調(diào)用其它的業(yè)務(wù)模塊)完畢后返回一個(gè)ActionForward對(duì)象。服務(wù)器通過(guò)ActionForward對(duì)象進(jìn)行轉(zhuǎn)發(fā)工作。6、返回響應(yīng):Action將業(yè)務(wù)處理的不同結(jié)果返回一個(gè)目標(biāo)響應(yīng)對(duì)象給總控制器。7、查找響應(yīng):總控制器根據(jù)Ac

3、tion處理業(yè)務(wù)返回的目標(biāo)響應(yīng)對(duì)象,找到對(duì)應(yīng)的資源對(duì)象,一般情況下為jsp頁(yè)面。8、響應(yīng)用戶(hù):目標(biāo)響應(yīng)對(duì)象將結(jié)果傳遞給資源對(duì)象,將結(jié)果展現(xiàn)給用戶(hù)。HYPERLINK/problems/13397ossh框架啟動(dòng)流程t_blankssh框架啟動(dòng)流程系統(tǒng)從職責(zé)上分為四層:表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)持久層和域模塊層。其中使用Struts作為系統(tǒng)的整體基礎(chǔ)架構(gòu),負(fù)責(zé)MVC的分離,在Struts框架的模型部分,利用Hibernate框架對(duì)持久層提供支持,業(yè)務(wù)層用Spring支持。具體做法是:用面向?qū)ο蟮姆治龇椒ǜ鶕?jù)需求提出一些模型,將這些模型實(shí)現(xiàn)為基本的Java對(duì)象,然后編寫(xiě)基本的DAO接口,并給出Hib

4、ernate的DAO實(shí)現(xiàn),采用Hibernate架構(gòu)實(shí)現(xiàn)的DAO類(lèi)來(lái)實(shí)現(xiàn)Java類(lèi)與數(shù)據(jù)庫(kù)之間的轉(zhuǎn)換和訪(fǎng)問(wèn),最后由Spring完成業(yè)務(wù)邏輯。系統(tǒng)的基本業(yè)務(wù)流程是:在表示層中,首先通過(guò)JSP頁(yè)面實(shí)現(xiàn)交互界面,負(fù)責(zé)傳送請(qǐng)求(Request)和接收響應(yīng)(Response),然后Struts根據(jù)配置文件(struts-config.xml)將ActionServlet接收到的Request委派給相應(yīng)的Action處理。在業(yè)務(wù)層中,管理服務(wù)組件的SpringIoC容器負(fù)責(zé)向Action提供業(yè)務(wù)模型(Model)組件和該組件的協(xié)作對(duì)象數(shù)據(jù)處理(DAO)組件完成業(yè)務(wù)邏輯,并提供事務(wù)處理、緩沖池等容器組件以提

5、升系統(tǒng)性能和保證數(shù)據(jù)的完整性。而在持久層中,則依賴(lài)于Hibernate的對(duì)象化映射和數(shù)據(jù)庫(kù)交互,處理DAO組件請(qǐng)求的數(shù)據(jù),并返回處理結(jié)果。采用上述開(kāi)發(fā)模型,不僅實(shí)現(xiàn)了視圖、控制器與模型的徹底分離,而且還實(shí)現(xiàn)了業(yè)務(wù)邏輯層與持久層的分離。這樣無(wú)論前端如何變化,模型層只需很少的改動(dòng),并且數(shù)據(jù)庫(kù)的變化也不會(huì)對(duì)前端有所影響,大大提高了系統(tǒng)的可復(fù)用性。而且由于不同層之間耦合度小,有利于團(tuán)隊(duì)成員并行工作,大大提高了開(kāi)發(fā)效率。Struts1與struts2有什么不同1.Action類(lèi)Stuts1要求Action類(lèi)繼承一個(gè)抽象基類(lèi)。Struts1的一個(gè)普通問(wèn)題是使用抽象類(lèi)編程而不是接口。Struts2Actio

6、n類(lèi)可以實(shí)現(xiàn)一個(gè)Action接口,也可以實(shí)現(xiàn)其它接口,使可選和定制的服務(wù)成為可能。Struts2提供一個(gè)ActionSupport基類(lèi)去實(shí)現(xiàn)常用的接口。Action接口不是必須的,任何有execute標(biāo)識(shí)的POJO對(duì)象都可以用作Struts2的Action對(duì)象。2.線(xiàn)程模式:Struts1Action是單例模式并且必須是線(xiàn)程安全的,因?yàn)閮H有Action的一個(gè)實(shí)例來(lái)處理所有的請(qǐng)求。單例策略限制了Struts1Action能作的事,并且要在開(kāi)發(fā)時(shí)特別小心。Action資源必須是線(xiàn)程安全的或同步的。Struts2Action對(duì)象為每一個(gè)請(qǐng)求產(chǎn)生一個(gè)實(shí)例,因此沒(méi)有線(xiàn)程安全問(wèn)題。3.Servlet依賴(lài):

7、Struts1Action依賴(lài)于ServletAPI,因?yàn)楫?dāng)一個(gè)Action被調(diào)用時(shí),HttpServletResquest和HttpServletResponse被傳遞給execute方法,即Action依賴(lài)了容器,測(cè)試變得非常麻煩。Struts2Action不依賴(lài)于容器,允許Action脫離容器單獨(dú)被測(cè)試。如果需要,Struts2Action仍然可以訪(fǎng)問(wèn)初始的request和response。但是,其它的元素減少或者消除了直接訪(fǎng)問(wèn)HttpServletRequset和HttpServletResponse的必要性。4.捕獲輸入:Struts1使用ActionForm對(duì)象捕獲輸入。所有的Ac

8、tionForm必須繼承一個(gè)基類(lèi)。因?yàn)槠渌麶avaBean不能用作ActionForm,開(kāi)發(fā)者經(jīng)常創(chuàng)建多余的類(lèi)捕獲輸入。動(dòng)態(tài)Bean可以作為創(chuàng)建傳統(tǒng)ActionForm的選擇,但是,開(kāi)發(fā)者可能是在重新描述已經(jīng)存在的JavaBean,仍然會(huì)導(dǎo)致有冗余的javabean。Struts2直接使用Action屬性作為輸入屬性,消除了對(duì)第二輸入對(duì)象的需求。Action屬性能夠通過(guò)web頁(yè)面上的taglibs訪(fǎng)問(wèn)。Struts2也支持ActionForm模式。(Struts2用普通的POJO來(lái)接收數(shù)據(jù))5.表達(dá)式語(yǔ)言:Struts1整合了JSTL,但對(duì)集合和索引屬性的支持很弱。Struts2可以是使用JS

9、TL,但是也支持一個(gè)更加強(qiáng)大和靈活的表達(dá)式語(yǔ)言“ObjectGraphNotationLanguage”(OGNL對(duì)象圖導(dǎo)航語(yǔ)言).6.綁定值到頁(yè)面(view):Struts1使用標(biāo)準(zhǔn)JSP機(jī)制把對(duì)象綁定到頁(yè)面中來(lái)訪(fǎng)問(wèn),Struts1要傳遞值的時(shí)候必須往request里放、往session里放,然后再傳遞到j(luò)sp里面,el表達(dá)式得到。Struts2使用“ValueStack”技術(shù),使taglib能夠訪(fǎng)問(wèn)值而不需要把你的頁(yè)面和對(duì)象綁定起來(lái)。ValueStack策略允許通過(guò)一系列名稱(chēng)相同但類(lèi)型不同的屬性重用頁(yè)面。值棧技術(shù)非常著名。不需要request、不需要session,直接從Action中取值

10、。7.類(lèi)型轉(zhuǎn)換:Struts1ActionForm屬性通常都是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)換器。8.校驗(yàn):Struts1支持在ActionForm的validate方法中手動(dòng)校驗(yàn),或者通過(guò)CommonsValidator的擴(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)子

11、屬性。9.Action執(zhí)行的控制:Struts1支持每一個(gè)模塊有單獨(dú)的RequestProcessors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。(服務(wù)器重啟時(shí),Action生命周期結(jié)束,即生命周期無(wú)法控制)。Struts2支持通過(guò)攔截器堆棧(InterceptorStacks)為每一個(gè)Action創(chuàng)建不同的生命周期。堆棧能夠根據(jù)需要和不同的Action一起使用。(可以控制Action的生命周期)簡(jiǎn)單的說(shuō):struts1和struts2的核心原理不同:struts1.X是基于servlet的struts2是xwork的變體:他的核心是filterstruts1是單例模式

12、開(kāi)發(fā),struts2是多例模式。struts1的單例模式好處是節(jié)省內(nèi)存,缺點(diǎn)是并發(fā)性查,非同步。struts2好處是線(xiàn)程安全是同步的每次使用開(kāi)辟新的內(nèi)存空間,缺點(diǎn)是占用資源多。Model1的原理:Struts1的工作原理:圖2它引入了控制器這個(gè)概念,控制器一般由servlet來(lái)?yè)?dān)任,客戶(hù)端的請(qǐng)求不再直接送給一個(gè)處理業(yè)務(wù)邏輯的JSP頁(yè)面,而是送給這個(gè)控制器,再由控制器根據(jù)具體的請(qǐng)求調(diào)用不同的事務(wù)邏輯,并將處理結(jié)果返回到合適的頁(yè)面。因此,這個(gè)servlet控制器為應(yīng)用程序提供了一個(gè)進(jìn)行前-后端處理的中樞。一方面為輸入數(shù)據(jù)的驗(yàn)證、身份認(rèn)證、日志及實(shí)現(xiàn)國(guó)際化編程提供了一個(gè)合適的切入點(diǎn);另一方面也提供了

13、將業(yè)務(wù)邏輯從JSP文件剝離的可能。業(yè)務(wù)邏輯從JSP頁(yè)面分離后,JSP文件蛻變成一個(gè)單純完成顯示任務(wù)的東西,這就是常說(shuō)的View。而獨(dú)立出來(lái)的事務(wù)邏輯變成人們常說(shuō)的Model,再加上控制器Control本身,就構(gòu)成了MVC模式。實(shí)踐證明,MVC模式為大型程序的開(kāi)發(fā)及維護(hù)提供了巨大的便利。其實(shí),MVC開(kāi)始并不是為Web應(yīng)用程序提出的模式,傳統(tǒng)的MVC要求M將其狀態(tài)變化通報(bào)給V,但由于Web瀏覽器工作在典型的拉模式而非推模式,很難做到這一點(diǎn)。因此有些人又將用于Web應(yīng)用的MVC稱(chēng)之為MVC2。正如上面所提到的MVC是一種模式,當(dāng)然可以有各種不同的具體實(shí)現(xiàn),包括您自己就可以實(shí)現(xiàn)一個(gè)體現(xiàn)MVC思想的程序

14、框架,Struts就是一種具體實(shí)現(xiàn)MVC2的程序框架。它的大致結(jié)構(gòu)如圖三所示:圖三圖三基本勾勒出了一個(gè)基于Struts的應(yīng)用程序的結(jié)構(gòu),從左到右,分別是其表示層(view)、控制層(controller)、和模型層(Model)。其表示層使用Struts標(biāo)簽庫(kù)構(gòu)建。來(lái)自客戶(hù)的所有需要通過(guò)框架的請(qǐng)求統(tǒng)一由叫ActionServlet的servlet接收(ActionServletStruts已經(jīng)為我們寫(xiě)好了,只要您應(yīng)用沒(méi)有什么特別的要求,它基本上都能滿(mǎn)足您的要求),根據(jù)接收的請(qǐng)求參數(shù)和Struts配置(struts-config.xml)中ActionMapping,將請(qǐng)求送給合適的Action

15、去處理,解決由誰(shuí)做的問(wèn)題,它們共同構(gòu)成Struts的控制器。Action則是Struts應(yīng)用中真正干活的組件,開(kāi)發(fā)人員一般都要在這里耗費(fèi)大量的時(shí)間,它解決的是做什么的問(wèn)題,它通過(guò)調(diào)用需要的業(yè)務(wù)組件(模型)來(lái)完成應(yīng)用的業(yè)務(wù),業(yè)務(wù)組件解決的是如何做的問(wèn)題,并將執(zhí)行的結(jié)果返回一個(gè)代表所需的描繪響應(yīng)的JSP(或Action)的ActionForward對(duì)象給ActionServlet以將響應(yīng)呈現(xiàn)給客戶(hù)。過(guò)程如圖四所示:圖四這里要特別說(shuō)明一下的是:就是Action這個(gè)類(lèi),上面已經(jīng)說(shuō)到了它是Struts中真正干活的地方,也是值得我們高度關(guān)注的地方??墒牵P(guān)于它到底是屬于控制層還是屬于模型層,存在兩種不同的

16、意見(jiàn),一種認(rèn)為它屬于模型層,如:JSPWeb編程指南;另一些則認(rèn)為它屬于控制層如:ProgrammingJakartaStruts、MasteringJakartaStruts和StrutsKickStart等認(rèn)為它是控制器的一部分,還有其他一些書(shū)如StrutsinAction也建議要避免將業(yè)務(wù)邏輯放在Action類(lèi)中,也就是說(shuō),圖3中Action后的括號(hào)中的內(nèi)容應(yīng)該從中移出,但實(shí)際中確有一些系統(tǒng)將比較簡(jiǎn)單的且不打算重用的業(yè)務(wù)邏輯放在Action中,所以在圖中還是這樣表示。顯然,將業(yè)務(wù)對(duì)象從Action分離出來(lái)后有利于它的重用,同時(shí)也增強(qiáng)了應(yīng)用程序的健壯性和設(shè)計(jì)的靈活性。因此,它實(shí)際上可以看作

17、是Controller與Model的適配器,如果硬要把它歸于那一部分,筆者更傾向于后一種看法,即它是Controller的一部分,換句話(huà)說(shuō),它不應(yīng)該包含過(guò)多的業(yè)務(wù)邏輯,而應(yīng)該只是簡(jiǎn)單地收集業(yè)務(wù)方法所需要的數(shù)據(jù)并傳遞給業(yè)務(wù)對(duì)象。實(shí)際上,它的主要職責(zé)是:校驗(yàn)前提條件或者聲明調(diào)用需要的業(yè)務(wù)邏輯方法檢測(cè)或處理其他錯(cuò)誤路由控制到相關(guān)視圖上面這樣簡(jiǎn)單的描述,初學(xué)者可能會(huì)感到有些難以接受,下面舉個(gè)比較具體的例子來(lái)進(jìn)一步幫助我們理解。如:假設(shè),我們做的是個(gè)電子商務(wù)程序,現(xiàn)在程序要完成的操作任務(wù)是提交定單并返回定單號(hào)給客戶(hù),這就是關(guān)于做什么的問(wèn)題,應(yīng)該由Action類(lèi)完成,但具體怎么獲得數(shù)據(jù)庫(kù)連接,插入定單數(shù)據(jù)

18、到數(shù)據(jù)庫(kù)表中,又怎么從數(shù)據(jù)庫(kù)表中取得這個(gè)定單號(hào)(一般是自增數(shù)據(jù)列的數(shù)據(jù)),這一系列復(fù)雜的問(wèn)題,這都是解決怎么做的問(wèn)題,則應(yīng)該由一個(gè)(假設(shè)名為orderBo)業(yè)務(wù)對(duì)象即Model來(lái)完成。orderBo可能用一個(gè)返回整型值的名為submitOrder的方法來(lái)做這件事,Action則是先校驗(yàn)定單數(shù)據(jù)是否正確,以免常說(shuō)的垃圾進(jìn)垃圾出;如果正確則簡(jiǎn)單地調(diào)用orderBo的submitOrder方法來(lái)得到定單號(hào);它還要處理在調(diào)用過(guò)程中可能出現(xiàn)任何錯(cuò)誤;最后根據(jù)不同的情況返回不同的結(jié)果給客戶(hù)。二、為什么要使用Struts框架既然本文的開(kāi)始就說(shuō)了,自己可以建這種框架,為什么要使用Struts呢?我想下面列舉的

19、這些理由是顯而易見(jiàn)的:首先,它是建立在MVC這種公認(rèn)的好的模式上的,Struts在M、V和C上都有涉及,但它主要是提供一個(gè)好的控制器和一套定制的標(biāo)簽庫(kù)上,也就是說(shuō)它的著力點(diǎn)在C和V上,因此,它天生就有MVC所帶來(lái)的一系列優(yōu)點(diǎn),如:結(jié)構(gòu)層次分明,高可重用性,增加了程序的健壯性和可伸縮性,便于開(kāi)發(fā)與設(shè)計(jì)分工,提供集中統(tǒng)一的權(quán)限控制、校驗(yàn)、國(guó)際化、日志等等;其次,它是個(gè)開(kāi)源項(xiàng)目得到了包括它的發(fā)明者CraigR.McClanahan在內(nèi)的一些程序大師和高手持續(xù)而細(xì)心的呵護(hù),并且經(jīng)受了實(shí)戰(zhàn)的檢驗(yàn),使其功能越來(lái)越強(qiáng)大,體系也日臻完善;最后,是它對(duì)其他技術(shù)和框架顯示出很好的融合性。如,現(xiàn)在,它已經(jīng)與tile

20、s融為一體,可以展望,它很快就會(huì)與JSF等融會(huì)在一起。當(dāng)然,和其他任何技術(shù)一樣,它也不是十全十美的,如:它對(duì)類(lèi)和一些屬性、參數(shù)的命名顯得有些隨意,給使用帶來(lái)一些不便;還有如Action類(lèi)execute方法的只能接收一個(gè)ActionForm參數(shù)等。但瑕不掩瑜,這些沒(méi)有影響它被廣泛使用為什么使用Struts2?新版本的Struts2.0是struts的action架構(gòu)和webwork的融合體.依照Struts2.0.1的發(fā)布公告,一些關(guān)鍵特性如下:設(shè)計(jì)簡(jiǎn)單:使用抽象類(lèi)而不是接口是Struts1的一個(gè)設(shè)計(jì)上的問(wèn)題,這已經(jīng)在Struts2中得到了解決.在Struts2中絕大多數(shù)類(lèi)都是基于接口的,并且它

21、的絕大多數(shù)核心接口都是獨(dú)立于HTTP的.Struts2的Action類(lèi)是獨(dú)立于框架的,可視為單純的POJO.框架的組件都設(shè)法保持松耦合單純的Action:Action都是單純的POJO.任何含有execute()方法的java類(lèi)都可以當(dāng)作Action類(lèi)來(lái)使用.甚至我們始終都不需要實(shí)現(xiàn)接口.反轉(zhuǎn)控制會(huì)在開(kāi)發(fā)Action類(lèi)的時(shí)候得到介紹過(guò),這能讓Action中立于底層框架.不再使用ActionForm:ActionForm特性不再在Structs2中出現(xiàn).簡(jiǎn)單的JavaBean即可對(duì)Action直接傳遞參數(shù).不再需要全部使用String類(lèi)型的參數(shù).簡(jiǎn)單的測(cè)試:Struts2的Action是獨(dú)立于H

22、TTP并且中立于框架的.這使得Struts2的程序可以很容易的在沒(méi)有模擬對(duì)象的情況下測(cè)試.巧妙的默認(rèn)值:大多數(shù)配置元素都設(shè)有一個(gè)根據(jù)需要設(shè)定的默認(rèn)值.甚至根據(jù)需要基于XML的默認(rèn)配置文件都可以進(jìn)行重寫(xiě).改良的結(jié)果集:不像Struts1中的ActionForward,Struts2的結(jié)果集靈活的提供了多種類(lèi)型的輸出,事實(shí)上這促進(jìn)了響應(yīng)的準(zhǔn)備工作.更好的標(biāo)簽特性:Struts2可以添加樣式表驅(qū)動(dòng)標(biāo)記,這使我們創(chuàng)建相同的頁(yè)面僅用更少的代碼.Struts2的標(biāo)簽更有效而且是面向結(jié)果的.Struts2的標(biāo)簽標(biāo)記可以通過(guò)修改基礎(chǔ)樣式表來(lái)修改.個(gè)別的標(biāo)簽標(biāo)記可以通過(guò)編輯FreeMarker的模板來(lái)修改.JS

23、P和FreeMarker都完全得到了支持.引入注釋:在Struts2程序中,除了XML和Javaproperties配置文件外,Java5的注釋也可以作為一種選擇.注釋使得XML的使用降至最低.有狀態(tài)的Checkbox:Struts2中的checkbox不需要對(duì)false值進(jìn)行特殊處理.快速開(kāi)始:很多改變無(wú)需重啟web容器即可實(shí)現(xiàn).自定義控制器:Struts1可以自定義每一個(gè)模塊的請(qǐng)求處理器,如果需要,Struts2可以自定義每一個(gè)Action的請(qǐng)求處理.易與Spring整合:Struts2的Action與Spring是友好的,只需添加Spring的bean輕巧的插件:Struts2可以通過(guò)添

24、加一個(gè)Jar文件來(lái)進(jìn)行擴(kuò)展,不再需要手動(dòng)配置!支持AJAX:AJAX主題對(duì)提升程序交互有著重要的意義.Struts2框架提供了一套標(biāo)簽來(lái)AJAX化你的程序甚至DOJO.AJAX特性包括:1.AJAX客戶(hù)端驗(yàn)證.2.支持遠(yuǎn)程表單提交.(同樣適用于submit標(biāo)簽)3.先進(jìn)的div模板提供動(dòng)態(tài)重載部份HTML4.先進(jìn)的模板提供遠(yuǎn)程加載和計(jì)算Javascript的能力.5.AJAX-only選項(xiàng)卡面板的實(shí)現(xiàn)6.豐富的發(fā)布/訂閱事件模型7.自動(dòng)交互完善標(biāo)簽HYPERLINK/group/topic/10534o深入全面闡釋Struts2的方方面面t_blank深入全面闡釋Struts2的方方面面一、S

25、truts概述Struts是一個(gè)用來(lái)開(kāi)發(fā)Model2應(yīng)用程序的框架。這個(gè)框架可以提高開(kāi)發(fā)工作的速度,因?yàn)樗峁┑南旅孢@些功能解決了Web應(yīng)用程序開(kāi)發(fā)過(guò)程中的一些常見(jiàn)問(wèn)題:對(duì)頁(yè)面導(dǎo)航活動(dòng)進(jìn)行管理;對(duì)來(lái)自用戶(hù)的輸入數(shù)據(jù)進(jìn)行合法性驗(yàn)證;統(tǒng)一的布局;可擴(kuò)展性;國(guó)際化和本地化;支持Ajax技術(shù)。因?yàn)镾truts是一個(gè)Model2框架,所以在使用Struts時(shí)還應(yīng)該遵守以下幾條不成文的規(guī)定。不要在JSP頁(yè)面里嵌入Java代碼,應(yīng)該把所有的業(yè)務(wù)邏輯包含在一些被稱(chēng)為“動(dòng)作類(lèi)”(actionclass)的Java類(lèi)里。在JSP頁(yè)面里使用ExpressionLanguage(OGNL)去訪(fǎng)問(wèn)有關(guān)的模型對(duì)象。盡量避

26、免編寫(xiě)自定義標(biāo)簽(因?yàn)樽远x標(biāo)簽的代碼比較難以編寫(xiě))。二、升級(jí)到Struts2你也許用過(guò)Struts1編程,這里提供了一個(gè)關(guān)于Struts2新功能的簡(jiǎn)要介紹。在Struts1里需要使用一個(gè)像ActionServlet類(lèi)這樣的東西作為servlet控制器;Struct2使用了一個(gè)過(guò)濾器來(lái)完成同樣的任務(wù)。在Struts2里沒(méi)有任何動(dòng)作表單。在Struts1里,每個(gè)HTML表單都對(duì)應(yīng)著一個(gè)ActionForm實(shí)例,你可以從動(dòng)作類(lèi)訪(fǎng)問(wèn)這個(gè)動(dòng)作表單,并用它來(lái)填充數(shù)據(jù)傳輸對(duì)象。在Struts2里,HTML表單將被直接映射為一個(gè)POJO,而不再需要你創(chuàng)建一個(gè)數(shù)據(jù)傳輸對(duì)象,因?yàn)闆](méi)有動(dòng)作表單,維護(hù)工作變得簡(jiǎn)單容

27、易了,你不再需要與那么多的類(lèi)打交道。問(wèn)題來(lái)了:沒(méi)有了動(dòng)作表單,怎樣才能在Struts2里通過(guò)編程對(duì)用戶(hù)輸入進(jìn)行合法性驗(yàn)證呢?答案是把驗(yàn)證邏輯編寫(xiě)在動(dòng)作類(lèi)里。Struts1通過(guò)幾個(gè)標(biāo)簽庫(kù)提供了一批定制標(biāo)簽供程序員在JSP頁(yè)面里使用,其中最重要的是HTML標(biāo)簽庫(kù)、Bean標(biāo)簽庫(kù)和Logic標(biāo)簽庫(kù)。Servlet2.4里的JSTL和EL(ExpressionLanguage,表達(dá)式語(yǔ)言)經(jīng)常被用來(lái)代替Bean和Logic標(biāo)簽庫(kù)。Struts2為程序員準(zhǔn)備了一個(gè)應(yīng)有盡有的標(biāo)簽庫(kù),你不再需要JSTL,但在某些場(chǎng)合你可能仍需要EL。在Struts1里,你還需要用到一些Struts配置文件,其中最主要的是存

28、放在各Web應(yīng)用程序里的WEB-INF子目錄里的struts-config.xml(默認(rèn)文件名)。在Struts2里,你仍需要用到多個(gè)配置文件,但必須把它們存放在WEB-INF/classes子目錄或它的某個(gè)下級(jí)子目錄里。要想使用Struts2,你的系統(tǒng)里必須有Java5和Servlet2.4(或更高版本)。之所以需要有Java5,是因?yàn)镴ava5里新增加的注解在Struts2里扮演著重要角色。我們撰寫(xiě)本書(shū)時(shí),Java6已經(jīng)發(fā)布,Java7也指日可待,你很可能已經(jīng)在使用Java5或Java6了。在Struts1里,動(dòng)作類(lèi)必須擴(kuò)展自org.apache.struts.action.Action類(lèi)

29、。在Struts2里,任何一個(gè)POJO都可以是一個(gè)動(dòng)作類(lèi)。不過(guò),我們將在本書(shū)第3章說(shuō)明,在Struts2里最好對(duì)ActionSupport類(lèi)進(jìn)行擴(kuò)展。在此基礎(chǔ)上,可用一個(gè)動(dòng)作類(lèi)來(lái)完成相關(guān)的動(dòng)作。Struts2在JSP頁(yè)面里使用OGNL來(lái)顯示各種對(duì)象模型,而不再是JSPEL和JSTL。原本是Struts1組件之一的Tiles現(xiàn)在已經(jīng)發(fā)展為一個(gè)獨(dú)立的ApacheHTTP沒(méi)有“類(lèi)型”的概念,在HTTP請(qǐng)求里發(fā)送的值都是字符串。在把表單字段映射到非String類(lèi)型的動(dòng)作屬性時(shí),Struts會(huì)自動(dòng)對(duì)這些值進(jìn)行必要的轉(zhuǎn)換。這一章將解釋Struts如何完成這類(lèi)轉(zhuǎn)換,你還將學(xué)到如何為更加復(fù)雜的情spring工

30、作機(jī)制及為什么要用?1.springmvc請(qǐng)所有的請(qǐng)求都提交給DispatcherServlet,它會(huì)委托應(yīng)用系統(tǒng)的其他模塊負(fù)責(zé)對(duì)請(qǐng)求進(jìn)行真正的處理工作。2.DispatcherServlet查詢(xún)一個(gè)或多個(gè)HandlerMapping,找到處理請(qǐng)求的Controller.3.DispatcherServlet請(qǐng)求提交到目標(biāo)Controller4.Controller進(jìn)行業(yè)務(wù)邏輯處理后,會(huì)返回一個(gè)ModelAndView5.Dispathcher查詢(xún)一個(gè)或多個(gè)ViewResolver視圖解析器,找到ModelAndView對(duì)象指定的視圖對(duì)象6.視圖對(duì)象負(fù)責(zé)渲染返回給客戶(hù)端。為什么用:AOP讓開(kāi)發(fā)

31、人員可以創(chuàng)建非行為性的關(guān)注點(diǎn),稱(chēng)為橫切關(guān)注點(diǎn),并將它們插入到應(yīng)用程序代碼中。使用AOP后,公共服務(wù)(比如日志、持久性、事務(wù)等)就可以分解成方面并應(yīng)用到域?qū)ο笊?,同時(shí)不會(huì)增加域?qū)ο蟮膶?duì)象模型的復(fù)雜性。IOC允許創(chuàng)建一個(gè)可以構(gòu)造對(duì)象的應(yīng)用環(huán)境,然后向這些對(duì)象傳遞它們的協(xié)作對(duì)象。正如單詞倒置所表明的,IOC就像反過(guò)來(lái)的JNDI。沒(méi)有使用一堆抽象工廠、服務(wù)定位器、單元素(singleton)和直接構(gòu)造(straightconstruction),每一個(gè)對(duì)象都是用其協(xié)作對(duì)象構(gòu)造的。因此是由容器管理協(xié)作對(duì)象(collaborator)。Spring即使一個(gè)AOP框架,也是一IOC容器。Spring最好的地

32、方是它有助于您替換對(duì)象。有了Spring,只要用JavaBean屬性和配置文件加入依賴(lài)性(協(xié)作對(duì)象)。然后可以很容易地在需要時(shí)替換具有類(lèi)似接口的協(xié)作對(duì)象。Spring框架是一個(gè)分層架構(gòu),由7個(gè)定義良好的模塊組成。Spring模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理bean的方式,如圖1所示。組成Spring框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。每個(gè)模塊的功能如下:核心容器:核心容器提供Spring框架的基本功能。核心容器的主要組件是BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory使用控制反轉(zhuǎn)(IOC)模式將應(yīng)用程序的配置和依賴(lài)

33、性規(guī)范與實(shí)際的應(yīng)用程序代碼分開(kāi)。Spring上下文:Spring上下文是一個(gè)配置文件,向Spring框架提供上下文信息。Spring上下文包括企業(yè)服務(wù),例如JNDI、EJB、電子郵件、國(guó)際化、校驗(yàn)和調(diào)度功能。SpringAOP:通過(guò)配置管理特性,SpringAOP模塊直接將面向方面的編程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何對(duì)象支持AOP。SpringAOP模塊為基于Spring的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過(guò)使用SpringAOP,不用依賴(lài)EJB組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。SpringDAO:JDBCDAO抽象層提供了有意義

34、的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來(lái)管理異常處理和不同數(shù)據(jù)庫(kù)供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理,并且極大地降低了需要編寫(xiě)的異常代碼數(shù)量(例如打開(kāi)和關(guān)閉連接)。SpringDAO的面向JDBC的異常遵從通用的DAO異常層次結(jié)構(gòu)。SpringORM:Spring框架插入了若干個(gè)ORM框架,從而提供了ORM的對(duì)象關(guān)系工具,其中包括JDO、Hibernate和iBatisSQLMap。所有這些都遵從Spring的通用事務(wù)和DAO異常層次結(jié)構(gòu)。SpringWeb模塊:Web上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于Web的應(yīng)用程序提供了上下文。所以,Spring框架支持與JakartaStru

35、ts的集成。Web模塊還簡(jiǎn)化了處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ?。SpringMVC框架:MVC框架是一個(gè)全功能的構(gòu)建Web應(yīng)用程序的MVC實(shí)現(xiàn)。通過(guò)策略接口,MVC框架變成為高度可配置的,MVC容納了大量視圖技術(shù),其中包括JSP、Velocity、Tiles、iText和POI。Spring框架的功能可以用在任何J2EE服務(wù)器中,大多數(shù)功能也適用于不受管理的環(huán)境。Spring的核心要點(diǎn)是:支持不綁定到特定J2EE服務(wù)的可重用業(yè)務(wù)和數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象。毫無(wú)疑問(wèn),這樣的對(duì)象可以在不同J2EE環(huán)境(Web或EJB)、獨(dú)立應(yīng)用程序、測(cè)試環(huán)境之間重用。共2頁(yè):12內(nèi)容導(dǎo)航第1頁(yè):Hibernat

36、e工作原理及用的理由(1)第2頁(yè):Hibernate工作原理及用的理由(2)IOC和AOP控制反轉(zhuǎn)模式(也稱(chēng)作依賴(lài)性介入)的基本概念是:不創(chuàng)建對(duì)象,但是描述創(chuàng)建它們的方式。在代碼中不直接與對(duì)象和服務(wù)連接,但在配置文件中描述哪一個(gè)組件需要哪一項(xiàng)服務(wù)。容器(在Spring框架中是IOC容器)負(fù)責(zé)將這些聯(lián)系在一起。在典型的IOC場(chǎng)景中,容器創(chuàng)建了所有對(duì)象,并設(shè)置必要的屬性將它們連接在一起,決定什么時(shí)間調(diào)用方法。下表列出了IOC的一個(gè)實(shí)現(xiàn)模式。Spring框架的IOC容器采用類(lèi)型2和類(lèi)型3實(shí)現(xiàn)。面向方面的編程即AOP,是一種編程技術(shù),它允許程序員對(duì)橫切關(guān)注點(diǎn)或橫切典型的職責(zé)分界線(xiàn)的行為(例如日志和事務(wù)

37、管理)進(jìn)行模塊化。AOP的核心構(gòu)造是方面,它將那些影響多個(gè)類(lèi)的行為封裝到可重用的模塊中。AOP和IOC是補(bǔ)充性的技術(shù),它們都運(yùn)用模塊化方式解決企業(yè)應(yīng)用程序開(kāi)發(fā)中的復(fù)雜問(wèn)題。在典型的面向?qū)ο箝_(kāi)發(fā)方式中,可能要將日志記錄語(yǔ)句放在所有方法和Java類(lèi)中才能實(shí)現(xiàn)日志功能。在AOP方式中,可以反過(guò)來(lái)將日志服務(wù)模塊化,并以聲明的方式將它們應(yīng)用到需要日志的組件上。當(dāng)然,優(yōu)勢(shì)就是Java類(lèi)不需要知道日志服務(wù)的存在,也不需要考慮相關(guān)的代碼。所以,用SpringAOP編寫(xiě)的應(yīng)用程序代碼是松散耦合的。AOP的功能完全集成到了Spring事務(wù)管理、日志和其他各種特性的上下文中。IOC容器Spring設(shè)計(jì)的核心是org

38、.springframework.beans包,它的設(shè)計(jì)目標(biāo)是與JavaBean組件一起使用。這個(gè)包通常不是由用戶(hù)直接使用,而是由服務(wù)器將其用作其他多數(shù)功能的底層中介。下一個(gè)最高級(jí)抽象是BeanFactory接口,它是工廠設(shè)計(jì)模式的實(shí)現(xiàn),允許通過(guò)名稱(chēng)創(chuàng)建和檢索對(duì)象。BeanFactory也可以管理對(duì)象之間的關(guān)系。BeanFactory支持兩個(gè)對(duì)象模型。單態(tài)模型提供了具有特定名稱(chēng)的對(duì)象的共享實(shí)例,可以在查詢(xún)時(shí)對(duì)其進(jìn)行檢索。Singleton是默認(rèn)的也是最常用的對(duì)象模型。對(duì)于無(wú)狀態(tài)服務(wù)對(duì)象很理想。原型模型確保每次檢索都會(huì)創(chuàng)建單獨(dú)的對(duì)象。在每個(gè)用戶(hù)都需要自己的對(duì)象時(shí),原型模型最適合。bean工廠的概

39、念是Spring作為IOC容器的基礎(chǔ)。IOC將處理事情的責(zé)任從應(yīng)用程序代碼轉(zhuǎn)移到框架。正如我將在下一個(gè)示例中演示的那樣,Spring框架使用JavaBean屬性和配置數(shù)據(jù)來(lái)指出必須設(shè)置的依賴(lài)關(guān)系。BeanFactory接口因?yàn)閛rg.springframework.beans.factory.BeanFactory是一個(gè)簡(jiǎn)單接口,所以可以針對(duì)各種底層存儲(chǔ)方法實(shí)現(xiàn)。最常用的BeanFactory定義是XmlBeanFactory,它根據(jù)XML文件中的定義裝入bean,如清單1所示。清單1.XmlBeanFactoryBeanFactoryfactory=newXMLBeanFactory(new

40、FileInputSteam(mybean.xml);在XML文件中定義的Bean是被消極加載的,這意味在需要bean之前,bean本身不會(huì)被初始化。要從BeanFactory檢索bean,只需調(diào)用getBean()方法,傳入將要檢索的bean的名稱(chēng)即可,如清單2所示。清單2.getBean()MyBeanmybean=(MyBean)factory.getBean(mybean);每個(gè)bean的定義都可以是POJO(用類(lèi)名和JavaBean初始化屬性定義)或FactoryBean。FactoryBean接口為使用Spring框架構(gòu)建的應(yīng)用程序添加了一個(gè)間接的級(jí)別。IOC示例理解控制反轉(zhuǎn)最簡(jiǎn)單

41、的方式就是看它的實(shí)際應(yīng)用。在對(duì)由三部分組成的Spring系列的第1部分進(jìn)行總結(jié)時(shí),我使用了一個(gè)示例,演示了如何通過(guò)SpringIOC容器注入應(yīng)用程序的依賴(lài)關(guān)系(而不是將它們構(gòu)建進(jìn)來(lái))。我用開(kāi)啟在線(xiàn)信用帳戶(hù)的用例作為起點(diǎn)。對(duì)于該實(shí)現(xiàn),開(kāi)啟信用帳戶(hù)要求用戶(hù)與以下服務(wù)進(jìn)行交互:信用級(jí)別評(píng)定服務(wù),查詢(xún)用戶(hù)的信用歷史信息。遠(yuǎn)程信息鏈接服務(wù),插入客戶(hù)信息,將客戶(hù)信息與信用卡和銀行信息連接起來(lái),以進(jìn)行自動(dòng)借記(如果需要的話(huà))。電子郵件服務(wù),向用戶(hù)發(fā)送有關(guān)信用卡狀態(tài)的電子郵件。三個(gè)接口對(duì)于這個(gè)示例,我假設(shè)服務(wù)已經(jīng)存在,理想的情況是用松散耦合的方式把它們集成在一起。以下清單顯示了三個(gè)服務(wù)的應(yīng)用程序接口。清單3.

42、CreditRatingInterfacePublicinterfaceCreditRatingInterfacePublicBooleangetUserCreditHistoryInformation(ICustomeriCustomer);清單3所示的信用級(jí)別評(píng)定接口提供了信用歷史信息。它需要一個(gè)包含客戶(hù)信息的Customer對(duì)象。該接口的實(shí)現(xiàn)是由CreditRating類(lèi)提供的。清單4.CreditLinkingInterfacepublicinterfaceCreditLinkingInterfacepublicStringgetUrl();publicvoidsetUrl(Strin

43、gurl);publicvoidlinkCreditBankAccount()throwsException;信用鏈接接口將信用歷史信息與銀行信息(如果需要的話(huà))連接在一起,并插入用戶(hù)的信用卡信息。信用鏈接接口是一個(gè)遠(yuǎn)程服務(wù),它的查詢(xún)是通過(guò)getUrl()方法進(jìn)行的。URL由Spring框架的bean配置機(jī)制設(shè)置,我稍后會(huì)討論它。該接口的實(shí)現(xiàn)是由CreditLinking類(lèi)提供的。清單5.EmailInterfacepublicinterfaceEmailInterfacepublicvoidsendEmail(ICustomeriCustomer);publicStringgetFromEm

44、ail();publicvoidsetFromEmail(StringfromEmail);publicStringgetPassword();publicvoidsetPassword(Stringpassword);publicStringgetSmtpHost();publicvoidsetSmtpHost(StringsmtpHost);publicStringgetUserId();publicvoidsetUserId(StringuserId);HYPERLINK/blog/249235Hibernate工作原理及為什么要用?原理:1.讀取并解析配置文件2.讀取并解析映射信息,創(chuàng)

45、建SessionFactory3.打開(kāi)Sesssion4.創(chuàng)建事務(wù)Transation5.持久化操作6.提交事務(wù)7.關(guān)閉Session8.關(guān)閉SesstionFactory為什么要用:1.對(duì)JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪(fǎng)問(wèn)層繁瑣的重復(fù)性代碼。2.Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡(jiǎn)化DAO層的編碼工作3.hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。4.hibernate的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。2Hiber

46、nate是如何延遲加載?1.Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對(duì)象b)集合(Collection)2.Hibernate3提供了屬性的延遲加載功能當(dāng)Hibernate在查詢(xún)數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒(méi)有存在與內(nèi)存中,當(dāng)程序真正對(duì)數(shù)據(jù)的操作時(shí),對(duì)象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開(kāi)銷(xiāo),從而提高了服務(wù)器的性能。3Hibernate中怎樣實(shí)現(xiàn)類(lèi)之間的關(guān)系?(如:一對(duì)多、多對(duì)多的關(guān)系)類(lèi)與類(lèi)之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,它們都市對(duì)對(duì)象進(jìn)行操作,我們程序中把所有的表與類(lèi)都映射在一起,它們通過(guò)配置文件中的many-to-one、one-to-many、many-to-

47、many、4說(shuō)下Hibernate的緩存機(jī)制1.內(nèi)部緩存存在Hibernate中又叫一級(jí)緩存,屬于應(yīng)用事物級(jí)緩存2.二級(jí)緩存:a)應(yīng)用及緩存b)分布式緩存條件:數(shù)據(jù)不會(huì)被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非關(guān)鍵數(shù)據(jù)c)第三方緩存的實(shí)現(xiàn)5Hibernate的查詢(xún)方式Sql、Criteria,objectcomptositionHql:1、屬性查詢(xún)2、參數(shù)查詢(xún)、命名參數(shù)查詢(xún)3、關(guān)聯(lián)查詢(xún)4、分頁(yè)查詢(xún)5、統(tǒng)計(jì)函數(shù)6如何優(yōu)化Hibernate?1.使用雙向一對(duì)多關(guān)聯(lián),不使用單向一對(duì)多2.靈活使用單向一對(duì)多關(guān)聯(lián)3.不用一對(duì)一,用多對(duì)一取代4.配置對(duì)象緩存,不使用集合

48、緩存5.一對(duì)多集合使用Bag,多對(duì)多集合使用Set6.繼承類(lèi)使用顯式多態(tài)7.表字段要少,表關(guān)聯(lián)不要怕多,有二級(jí)緩存撐腰7Struts工作機(jī)制?為什么要使用Struts?工作機(jī)制:Struts的工作流程:在web應(yīng)用啟動(dòng)時(shí)就會(huì)加載初始化ActionServlet,ActionServlet從struts-config.xml文件中讀取配置信息,把它們存放到各種配置對(duì)象當(dāng)ActionServlet接收到一個(gè)客戶(hù)請(qǐng)求時(shí),將執(zhí)行如下流程.-(1)檢索和用戶(hù)請(qǐng)求匹配的ActionMapping實(shí)例,如果不存在,就返回請(qǐng)求路徑無(wú)效信息;-(2)如果ActionForm實(shí)例不存在,就創(chuàng)建一個(gè)ActionFo

49、rm對(duì)象,把客戶(hù)提交的表單數(shù)據(jù)保存到ActionForm對(duì)象中;-(3)根據(jù)配置信息決定是否需要表單驗(yàn)證.如果需要驗(yàn)證,就調(diào)用ActionForm的validate()方法;-(4)如果ActionForm的validate()方法返回null或返回一個(gè)不包含ActionMessage的ActionErrors對(duì)象,就表示表單驗(yàn)證成功;-(5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)Action,如果相應(yīng)的Action實(shí)例不存在,就先創(chuàng)建這個(gè)實(shí)例,然后調(diào)用Action的execute()方法;-(6)Action的execute()方法返回一

50、個(gè)ActionForward對(duì)象,ActionServlet在把客戶(hù)請(qǐng)求轉(zhuǎn)發(fā)給ActionForward對(duì)象指向的JSP組件;-(7)ActionForward對(duì)象指向JSP組件生成動(dòng)態(tài)網(wǎng)頁(yè),返回給客戶(hù);為什么要用:JSP、Servlet、JavaBean技術(shù)的出現(xiàn)給我們構(gòu)建了強(qiáng)大的企業(yè)應(yīng)用系統(tǒng)提供可能。但用這些技術(shù)構(gòu)建的系統(tǒng)非常的繁亂,所以在此之上,我們需要一個(gè)規(guī)則、一個(gè)把這些技術(shù)組織起來(lái)的規(guī)則,這就是框架,Struts便應(yīng)運(yùn)而生。基于Struts開(kāi)發(fā)的應(yīng)用由3類(lèi)組件構(gòu)成:C控制器組件、M模型組件、V視圖組件8Struts的validate框架是如何驗(yàn)證的?在struts配置文件中配置具體的錯(cuò)誤提示,再在FormBean中的validate()方法具體調(diào)用。9說(shuō)下Struts的設(shè)計(jì)模式MVC模式:web應(yīng)用程序啟動(dòng)時(shí)就會(huì)加載并初始化ActionServler。用戶(hù)提交表單時(shí),一個(gè)配置好的ActionForm對(duì)象被創(chuàng)建,并被填入表單相應(yīng)的數(shù)據(jù),ActionServler根據(jù)Struts-config.xml文件配置好的設(shè)置決定是否需要表單驗(yàn)證,如果需要就調(diào)用ActionForm的Validate()驗(yàn)證后選擇將請(qǐng)求發(fā)送到哪個(gè)Action,如果Action不存在,ActionServlet會(huì)先創(chuàng)建這個(gè)對(duì)象,然后調(diào)用Action的execute()方法。Execute()

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論