Struts2的工作機制原理分析及實例_第1頁
Struts2的工作機制原理分析及實例_第2頁
Struts2的工作機制原理分析及實例_第3頁
Struts2的工作機制原理分析及實例_第4頁
Struts2的工作機制原理分析及實例_第5頁
已閱讀5頁,還剩122頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Struuts22的工作作機制分分析及實例一、概述述本章講述述Strrutss2的工工作原理理。讀者如果果曾經學學習過SStruuts11.x或或者有過過Strrutss1.xx的開發(fā)發(fā)經驗,那那么千萬萬不要想想當然地地以為這這一章可可以跳過過。實際際上Sttrutts1.x與SStruuts22并無我我們想象象的血緣緣關系。雖然SStruuts22的開發(fā)發(fā)小組極極力保留留Strrutss1.xx的習慣慣,但因因為Sttrutts2的的核心設設計完全全改變,從從思想到到設計到到工作流流程,都都有了很很大的不不同。Struuts22是Sttrutts社區(qū)區(qū)和WeebWoork社社區(qū)的共共同成果果

2、,我們們甚至可可以說,SStruuts22是WeebWoork的的升級版版,他采采用的正正是WeebWoork的的核心,所所以,SStruuts22并不是是一個不不成熟的的產品,相相反,構構建在WWebWWorkk基礎之之上的SStruuts22是一個個運行穩(wěn)穩(wěn)定、性性能優(yōu)異異、設計計成熟的的WEBB框架。本章主要要對Sttrutts的源源代碼進進行分析析,因為為Strrutss2與WWebWWorkk的關系系如此密密不可分分,因此此,讀者者需要下下載xwworkk的源代代碼,訪訪問 HYPERLINK /xwork/download.action htttp:/wwww.opeensyymp

3、hhonyy.coom/xxworrk/ddownnloaad.aactiion即即可自行行下載。下載的SStruuts22源代碼碼文件是是一個名名叫sttrutts-22.1.0-ssrc.zipp的壓縮縮包,里里面的目目錄和文文件非常常多,讀讀者可以以定位到到strrutss-2.1.00-srrcsstruuts-2.00.100srrcccoreesrrcmmainnjaava目目錄下查查看Sttrutts2的的源文件件,如圖圖14所所示。(圖144)二、 主要要的包和和類Struuts22框架的的正常運運行,除除了占核核心地位位的xwworkk的支持持以外,SStruuts22本身也

4、也提供了了許多類類,這些些類被分分門別類類組織到到不同的的包中。從源代代碼中發(fā)發(fā)現,基基本上每每一個SStruuts22類都訪訪問了WWebWWorkk提供的的功能,從從而也可可以看出出Strrutss2與WWebWWorkk千絲萬萬縷的聯聯系。但但無論如如何,SStruuts22的核心心功能比比如將請請求委托托給哪個個Acttionn處理都都是由xxworrk完成成的,SStruuts22只是在在WebbWorrk的基基礎上做做了適當當的簡化化、加強強和封裝裝,并少少量保留留Strrutss1.xx中的習習慣。以下是對對各包的的簡要說說明:包名說明org.apaachee.sttrutts2

5、. coompoonennts該包封裝裝視圖組組件,SStruuts22在視圖圖組件上上有了很很大加強強,不僅僅增加了了組件的的屬性個個數,更更新增了了幾個非非常有用用的組件件,如uupdoownsseleect、douubleesellectt、daatettimeepicckerr、tookenn、trree等等。另外,SStruuts22可視化化視圖組組件開始始支持主主題(tthemme),缺缺省情況況下,使使用自帶帶的缺省省主題,如如果要自自定義頁頁面效果果,需要要將組件件的thhemee屬性設設置為.apaachee.sttrutts2. coonfiig該包

6、定義義與配置置相關的的接口和和類。實實際上,工工程中的的xmll和prropeertiies文文件的讀讀取和解解析都是是由WeebWoork完完成的,SStruuts只只做了少少量的工工作。org.apaachee.sttrutts2.disspattcheerStruuts22的核心心包,最最重要的的類都放放在該包包中。org.apaachee.sttrutts2.imppl該包只定定義了33個類,他他們是SStruutsAActiionPProxxy、SStruutsAActiionPProxxyFaactoory、StrrutssObjjecttFacctorry,這這三個類類都是對對x

7、woork的的擴展。terccepttor定義內置置的截攔攔器。org.apaachee.sttrutts2.utiil實用包。org.apaachee.sttrutts2.vallidaatorrs只定義了了一個類類:DWWRV.apaachee.sttrutts2.vieews提供frreemmarkker、jspp、veeloccityy等不同同類型的的頁面呈呈現。下表是對對一些重重要類的的說明:類名說明org.apaachee.sttrutts2.disspattcheer. Disspattcheer 該類有有兩個作作用: 1、初初始化 2、調調用指定定

8、的Acctioon的eexeccutee()方方法。org.apaachee.sttrutts2.disspattcheer. FillterrDisspattcheer 這是一一個過濾濾器。文文檔中已已明確說說明,如如果沒有有經驗,配配置時請請將urrl-ppattternn的值設設成/*。 該類有有四個作作用: 1、執(zhí)執(zhí)行Acctioon 2、清清理AcctioonCoonteext,避避免內存存泄漏 3、處處理靜態(tài)態(tài)內容(SServvingg sttatiic cconttentt) 4、為為請求啟啟動xwworkks的的截攔器器鏈。com.opeensyymphhonyy.xwwork

9、k2. ActtionnProoxy Acttionn的代理理接口。com.opeensyymphhonyy.xwworkk2. ctiionPProxxyFaactoory 生產AActiionPProxxy的工工廠。com.opeensyymphhonyy.xwworkk2.AActiionIInvoocattionn 負責調調用Acctioon和截截攔器。ovidderss. XXmlCConffiguurattionnProovidder 負責SStruuts22的配置置文件的的解析。三、 Sttrutts2的的工作機機制3.1Strrutss2體系系結構圖圖 Strrut22的體系系

10、結構如如圖155所示: (圖115) 3.2Strrutss2的工工作機制制 從圖115可以以看出,一一個請求求在Sttrutts2框框架中的的處理大大概分為為以下幾幾個步驟驟:1、客戶戶端初始始化一個個指向SServvlett容器(例例如Toomcaat)的的請求;2、這個個請求經經過一系系列的過過濾器(FFiltter)(這這些過濾濾器中有有一個叫叫做AcctioonCoonteextCCleaanUpp的可選選過濾器器,這個個過濾器器對于SStruuts22和其他他框架的的集成很很有幫助助,例如如:SiiteMMeshh Pllugiin);3、接著著FillterrDisspattch

11、eer被調調用,FFiltterDDisppatccherr詢問AActiionMMappper來來決定這這個請求求是否需需要調用用某個AActiion;4、如果果ActtionnMappperr決定需需要調用用某個AActiion,FFiltterDDisppatccherr把請求求的處理理交給AActiionPProxxy;5、AcctioonPrroxyy通過CConffiguurattionn Maanagger詢詢問框架架的配置置文件,找找到需要要調用的的Acttionn類;6、AcctioonPrroxyy創(chuàng)建一一個AcctioonInnvoccatiion的的實例。7、Accti

12、oonInnvoccatiion實實例使用用命名模模式來調調用,在在調用AActiion的的過程前前后,涉涉及到相相關攔截截器(IInteerceepteer)的的調用。8、一旦旦Acttionn執(zhí)行完完畢,AActiionIInvoocattionn負責根根據sttrutts.xxml中中的配置置找到對對應的返返回結果果。返回回結果通通常是(但但不總是是,也可可能是另另外的一一個Acctioon鏈)一一個需要要被表示示的JSSP或者者FreeeMaarkeer的模模版。在在表示的的過程中中可以使使用Sttrutts2 框架中中繼承的的標簽。在這個個過程中中需要涉涉及到AActiionMMap

13、pper。注:以上上步驟參參考至網網上,具具體網址址已忘記記。在此此表示感感謝!3.3Strrutss2源代代碼分析析 和Sttrutts1.x不同同,Sttrutts2的的啟動是是通過FFiltterDDisppatccherr過濾器器實現的的。下面面是該過過濾器在在webb.xmml文件件中的配配置:代碼清單單6:wweb.xmll(截取?。?sttrutts2 orrg.aapacche.strrutss2.ddisppatccherr.FiilteerDiispaatchher sttrutts2 /* Strrutss2建議議,在對對Strrutss2的配配置尚不不熟悉的的情況下下,

14、將uurl-pattterrn配置置為/*,這樣樣該過濾濾器將截截攔所有有請求。 實際上上,FiilteerDiispaatchher除除了實現現Fillterr接口以以外,還還實現了了StrrutssStaaticcs接口口,繼承承代碼如如下:代碼清單單7:FFiltterDDisppatccherr結構publliccclasss FFiltterDDisppatccherr immpleemennts StrrutssStaaticcs, Fillterr StruutsSStatticss并沒有有定義業(yè)業(yè)務方法法,只定定義了若若干個常常量。SStruuts22對常用用的接口口進行了了重

15、新封封裝,比比如HtttpSServvlettReqquesst、HHttppSerrvleetReespoonsee、HtttpSServvlettConntexxt等。以下下是SttruttsSttatiics的的定義:代碼清單單8:SStruutsSStatticss.jaavapublliciinteerfaace StrrutssStaaticcs /* * Connstaant forr thhe HHTTPP reequeest objjectt. */ pubbliccstaaticcfinnal Strringg HTTTP_REQQUESST = ccom.opeensyy

16、mphhonyy.xwworkk2.ddisppatccherr.HtttpSServvlettReqquesst; /* * Connstaant forr thhe HHTTPP reespoonsee obbjecct. */ pubbliccstaaticcfinnal Strringg HTTTP_RESSPONNSE = comm.oppenssympphonny.xxworrk2.disspattcheer.HHttppSerrvleetReespoonsee; /* * Connstaant forr ann HTTTP reqquesst ddisppatccherr. */

17、 pubbliccstaaticcfinnal Strringg SEERVLLET_DISSPATTCHEER = ccom.opeensyymphhonyy.xwworkk2.ddisppatccherr.SeervlletDDisppatccherr; /* * Connstaant forr thhe sservvlett coonteext obbjecct. */ pubbliccstaaticcfinnal Strringg SEERVLLET_CONNTEXXT = ccom.opeensyymphhonyy.xwworkk2.ddisppatccherr.SeervlletC

18、Conttextt; /* * Connstaant forr thhe JJSP pagge cconttextt. */publlicsstatticffinaal SStriing PAGGE_CCONTTEXTT = coom.oopennsymmphoony.xwoork22.diispaatchher.PaggeCoonteext; /* Coonsttantt foor tthe PorrtleetCoonteext objjectt */ pubbliccstaaticcfinnal Strringg STTRUTTS_PPORTTLETT_COONTEEXT = strrut

19、ss.poortllet.conntexxt; 容器啟啟動后,FFiltterDDisppatccherr被實例例化,調調用innit(FillterrConnfigg fiilteerCoonfiig)方方法。該該方法創(chuàng)創(chuàng)建Diispaatchher類類的對象象,并且且將FiilteerDiispaatchher配配置的初初始化參參數傳到到對象中中(詳情情請參考考代碼清清單100),并并負責AActiion的的執(zhí)行。然后得得到參數數pacckagges,值值得注意意的是,還還有另外外三個固固定的包包和該參參數進行行拼接,分分別是oorg.apaachee.sttrutts2.staaticc

20、、teempllatee、和terccepttor.debbugggingg,中間間用空格格隔開,經經過解析析將包名名變成路路徑后存存儲到一一個名叫叫patthPrrefiixess的數組組中,這這些目錄錄中的文文件會被被自動搜搜尋。代碼清單單9:FFiltterDDisppatccherr.innit()方法法 pubbliccvoiid iinitt(FiilteerCoonfiig ffiltterCConffig) thhrowws SServvlettExccepttionn thhis.fillterrConnfigg = fillterrConnfigg; diispaatchh

21、er = ccreaateDDisppatccherr(fiilteerCoonfiig); diispaatchher.iniit(); Sttrinng pparaam = fiilteerCoonfiig.ggetIInittParrameeterr(ppackkagees); Sttrinng ppackkagees = oorg.apaachee.sttrutts2.staaticc teempllatee orrg.aapacche.strrutss2.iinteerceeptoor.ddebuuggiing; iff (pparaam != nnulll) ppackkagees

22、 = paaramm + + pacckagges; thhis.patthPrrefiixess = parrse(pacckagges);代碼清單單10:FillterrDisspattcheer.ccreaateDDisppatccherr()方方法 prootecctedd Diispaatchher creeateeDisspattcheer(FFiltterCConffig fillterrConnfigg) Maap pparaams = nnew HasshMaap(); foor (Enuumerratiion e = fiilteerCoonfiig.ggetIInittP

23、arrameeterrNammes(); e.hhasMMoreeEleemennts(); ) SStriing namme = (SStriing) e.nexxtEllemeent(); SStriing vallue = ffiltterCConffig.gettIniitPaarammeteer(nnamee); pparaams.putt(naame, vaaluee); reeturrnneew DDisppatccherr(fiilteerCoonfiig.ggetSServvlettConntexxt(), pparaams); 當用戶戶向Sttrutts2發(fā)發(fā)送請求求時,F

24、FiltterDDisppatccherr的dooFillterr()方方法自動動調用,這這個方法法非常關關鍵。首首先,SStruuts22對請求求對象進進行重新新包裝,此此次包裝裝根據請請求內容容的類型型不同,返返回不同同的對象象,如果果為muultiiparrt/fformm-daata類類型,則則返回MMulttiPaartRRequuesttWraappeer類型型的對象象,該對對象服務務于文件件上傳,否否則返回回StrrutssReqquesstWrrappper類類型的對對象,MMulttiPaartRRequuesttWraappeer是SStruutsRRequuesttWra

25、appeer的子子類,而而這兩個個類都是是HtttpSeervlletRRequuestt接口的的實現。包裝請請求對象象如代碼碼清單111所示示:代碼清單單11:FillterrDisspattcheer.ppreppareeDisspattcheerAnndWrrapRRequuestt()方方法prottecttedHtttpSeervlletRRequuestt prrepaareDDisppatccherrAnddWraapReequeest( HtttpSServvlettReqquesst rrequuestt, HtttpSServvlettRessponnse ressponn

26、se) thhrowws SServvlettExccepttionn Diispaatchher du = DDisppatccherr.geetInnstaancee(); iff (ddu = nnulll) DDisppatccherr.seetInnstaancee(diispaatchher); ddisppatccherr.prrepaare(reqquesst, ressponnse); elsse ddisppatccherr = du; trry rrequuestt = disspattcheer.wwrappReqquesst(rrequuestt, ggetSServ

27、vlettConntexxt(); cattch (IOOExccepttionn e) SStriing messsagge = CCoulld nnot wraap sservvlett reequeest witth MMulttipaartRRequuesttWraappeer!; LLOG.errror(messsagge, e); tthroowneew SServvlettExccepttionn(meessaage, e); reeturrn rrequuestt; reqquesst對象象重新包包裝后,通通過AcctioonMaappeer的ggetMMapppingg()方

28、方法得到到請求的的Acttionn,Acctioon的配配置信息息存儲在在ActtionnMapppinng對象象中,該該語句如如下:mmapppingg = acttionnMappperr.geetMaappiing(reqquesst, disspattcheer.ggetCConffiguurattionnMannageer();。下面是是ActtionnMapppinng接口口的實現現類DeefauultAActiionMMappper的的gettMapppinng()方法的的源代碼碼:代碼清單單12:DeffaulltAcctioonMaappeer.ggetMMapppingg(

29、)方方法 pubblicc AcctioonMaappiing gettMapppinng(HHttppSerrvleetReequeest reqquesst, CConffiguurattionnMannageer cconffigMManaagerr) AcctioonMaappiing mapppinng = neew AActiionMMapppingg(); Sttrinng uuri = ggetUUri(reqquesst);/得得到請求求路徑的的URII,如:tesstAttcioon.aactiion或或tesstAcctioon!mmethhod urri = drrop

30、EExteensiion(urii);/刪除除擴展名名,默認認擴展名名為acctioon,在在代碼中中的定義義是Liist exttenssionns = neew AArraayLiist() aadd(acctioon); iff (uuri = nulll) rretuurnnnulll; paarseeNammeAnndNaamesspacce(uuri, maappiing, coonfiigMaanagger);/從urri變量量中解析析出Acctioon的nnamee和naamesspacce haandlleSppeciialPParaametterss(reequeest,

31、maappiing);/將請求求參數中中的重復復項去掉掉 /如如果Acctioon的nnamee沒有解解析出來來,直接接返回 iff (mmapppingg.geetNaame() = nnulll) rretuurnnnulll; /下下面處理理形如ttesttActtionn!meethood格式式的請求求路徑 iff (aalloowDyynammicMMethhodCCallls) / hhanddle naame!metthodd cconvventtionn. SStriing namme = maappiing.gettNamme(); iint excclammatiion =

32、 nnamee.laastIIndeexOff(!);/!是Acctioon名稱稱和方法法名的分分隔符 iif (excclammatiion != -1) mapppinng.ssetNNamee(naame.subbstrringg(0, exxclaamattionn);/提提取左邊邊為naame mapppinng.ssetMMethhod(namme.ssubsstriing(excclammatiion + 11);/提提取右邊邊的meethood reeturrn mmapppingg; 該代碼碼的活動動圖如下下: (圖116)從代碼中中看出,ggetMMapppingg()方方

33、法返回回ActtionnMapppinng類型型的對象象,該對對象包含含三個參參數:AActiion的的namme、nnameespaace和和要調用用的方法法metthodd。 如果ggetMMapppingg()方方法返回回ActtionnMapppinng對象象為nuull,則則FillterrDisspattcheer認為為用戶請請求不是是Acttionn,自然然另當別別論,FFiltterDDisppatccherr會做一一件非常常有意思思的事:如果請請求以/strrutss開頭,會會自動查查找在wweb.xmll文件中中配置的的pacckagges初初始化參參數,就就像下面面這樣(

34、注意粗粗斜體部部分):代碼清單單13:webb.xmml(部部分) sttrutts2 orrg.aapacche.strrutss2.ddisppatccherr.FiilteerDiispaatchher paackaagess ccom.lizzanhhongg.acctioon FillterrDisspattcheer會將將comm.liizannhonng.aactiion包包下的文文件當作作靜態(tài)資資源處理理,即直直接在頁頁面上顯顯示文件件內容,不不過會忽忽略擴展展名為cclasss的文文件。比比如在ccom.lizzanhhongg.acctioon包下下有一個個aaaa.txx

35、t的文文本文件件,其內內容為“中中華人民民共和國國”,訪訪問 HYPERLINK http:/localhost:8081/Struts2Demo/struts/aaa.txt htttp:/llocaalhoost:80881/SStruuts22Demmo/sstruuts/aaaa.txxt時會會有如圖圖17的的輸出:(圖177)查找靜態(tài)態(tài)資源的的源代碼碼如清單單14:代碼清單單14:FillterrDisspattcheer.ffinddStaaticcRessourrce()方法法 prooteccteddvoiid ffinddStaaticcRessourrce(Strringg

36、 naame, HtttpSServvlettReqquesst rrequuestt, HHttppSerrvleetReespoonsee reespoonsee) tthroows IOEExceeptiion iff (!namme.eendssWitth(.cllasss) /忽略略claass文文件 /遍歷ppackkagees參數數 ffor (Sttrinng ppathhPreefixx : patthPrrefiixess) InpputSStreeam is = ffinddInpputSStreeam(namme, patthPrrefiix);/讀讀取請求求文件流流

37、if (is != nulll) (省略略部分代代碼) / seet tthe conntennt-ttypee heeadeer Sttrinng cconttenttTyppe = geetCoonteentTTypee(naame);/讀取內內容類型型 iff (cconttenttTyppe != nnulll) rrespponsse.ssetCConttenttTyppe(cconttenttTyppe);/重重新設置置內容類類型 (省省略部分分代碼) trry /將讀讀取到的的文件流流以每次次復制440966個字節(jié)節(jié)的方式式循環(huán)輸輸出 ccopyy(iss, rrespponss

38、e.ggetOOutpputSStreeam(); finnallly iis.cclosse(); reeturrn; 如果用用戶請求求的資源源不是以以/sttrutts開頭頭可可能是.jspp文件,也也可能是是.httml文文件,則則通過過過濾器鏈鏈繼續(xù)往往下傳送送,直到到到達請請求的資資源為止止。 如果ggetMMapppingg()方方法返回回有效的的ActtionnMapppinng對象象,則被被認為正正在請求求某個AActiion,將將調用DDisppatccherr.seerviiceAActiion(reqquesst, ressponnse, seervlletCContte

39、xtt, mmapppingg)方法法,該方方法是處處理Acctioon的關關鍵所在在。上述述過程的的源代碼碼如清單單15所所示。代碼清單單15:FillterrDisspattcheer.dooFillterr()方方法 pubbliccvoiid ddoFiilteer(SServvlettReqquesst rreq, SeervlletRRespponsse rres, FiilteerChhainn chhainn) tthroows IOEExceeptiion, SeervlletEExceeptiion HtttpSServvlettReqquesst rrequuestt =

40、 (HtttpSServvlettReqquesst) reqq; HtttpSServvlettRessponnse ressponnse = (HtttpSeervlletRRespponsse) ress; SeervlletCConttextt seervlletCConttextt = gettSerrvleetCoonteext(); Sttrinng ttimeerKeey = FFiltterDDisppatccherr_dooFillterr: ; trry UUtillTimmerSStacck.ppushh(tiimerrKeyy); rrequuestt = preep

41、arreDiispaatchherAAndWWrappReqquesst(rrequuestt, rrespponsse);/重重新包裝裝reqquesst AActiionMMapppingg maappiing; ttry mapppinng = acctioonMaappeer.ggetMMapppingg(reequeest, diispaatchher.gettConnfigguraatioonMaanagger();/得得到存儲儲Acttionn信息的的ActtionnMapppinng對象象 caatchh (EExceeptiion ex) (省省略部分分代碼) retturn

42、n; iif (mapppinng = nnulll) /如如果maappiing為為nulll,則則認為不不是請求求Acttionn資源 Sttrinng rresoourccePaath = RRequuesttUtiils.gettSerrvleetPaath(reqquesst); if (.equualss(reesouurceePatth) & nulll != rrequuestt.geetPaathIInfoo() reesouurceePatth = reequeest.gettPatthInnfo(); /如果請請求的資資源以/strrutss開頭,則則當作靜靜態(tài)資源源處理

43、 if (serrveSStattic & ressourrcePPathh.sttarttsWiith(/sstruuts) Sttrinng nnamee = ressourrcePPathh.suubsttrinng(/sttrutts.lenngthh(); fiindSStatticRResoourcce(nnamee, rrequuestt, rrespponsse); eelsee /否則,過過濾器鏈鏈繼續(xù)往往下傳遞遞 chhainn.dooFillterr(reequeest, reespoonsee); / Thee frrameeworrk ddid itss joob h

44、heree retturnn; /如果請請求的資資源是AActiion,則則調用sservviceeActtionn方法。 ddisppatccherr.seerviiceAActiion(reqquesst, ressponnse, seervlletCConttextt, mmapppingg); finnallly ttry ActtionnConntexxtClleannUp.cleeanUUp(rreq); fiinallly UtiilTiimerrStaack.popp(tiimerrKeyy); 這段代代碼的活活動圖如如圖188所示:(圖188) 在Diispaatchher.

45、serrvicceAcctioon()方法中中,先加加載Sttrutts2的的配置文文件,如如果沒有有人為配配置,則則默認加加載sttrutts-ddefaaultt.xmml、sstruuts-pluuginn.xmml和sstruuts.xmll,并且且將配置置信息保保存在形形如coom.oopennsymmphoony.xwoork22.coonfiig.eentiitiees.XXxxxxConnfigg的類中中。 類coom.oopennsymmphoony.xwoork22.coonfiig.pprovvideers.XmllConnfigguraatioonPrroviiderr

46、負責配配置文件件的讀取取和解析析, aaddAActiion()方法法負責讀讀取標簽,并并將數據據保存在在ActtionnConnfigg中;aaddRResuultTTypees()方法負負責將標簽轉轉化為RResuultTTypeeConnfigg對象;loaadInnterrcepptorrs()方法負負責將標簽轉轉化為IInteerceeptoorCoonfii對象;loaadInnterrcepptorrStaack()方法法負責將將標標簽轉化化為InnterrcepptorrStaackCConffig對對象;lloaddIntterccepttorSStaccks()方法法負責將

47、將標簽簽轉化成成IntterccepttorSStacckCoonfiig對象象。而上上面的方方法最終終會被aaddPPackkagee()方方法調用用,將所所讀取到到的數據據匯集到到PacckaggeCoonfiig對象象中,細細節(jié)請參參考代碼碼清單116。代碼清單單16:XmllConnfigguraatioonPrroviiderr.adddPaackaage()方法法 prootecctedd PaackaageCConffig adddPacckagge(EElemmentt paackaageEElemmentt) tthroows ConnfigguraatioonExxcepp

48、tioon PaackaageCConffig newwPacckagge = buuilddPacckaggeCoonteext(pacckaggeEllemeent); iff (nnewPPackkagee.issNeeedsRRefrreshh() rretuurn newwPacckagge; iff (LLOG.isDDebuugEnnablled() LLOG.debbug(Looadeed + newwPacckagge); / addd rresuult typpes (annd ddefaaultt reesullt) to thiis ppackkagee adddRee

49、sulltTyypess(neewPaackaage, paackaageEElemmentt); / looad thee innterrcepptorrs aand intterccepttor staackss foor tthiss paackaage looadIInteerceeptoors(newwPacckagge, pacckaggeEllemeent); / looad thee deefauult intterccepttor reffereencee foor tthiss paackaage looadDDefaaulttIntterccepttorRRef(neww

50、Pacckagge, pacckaggeEllemeent); / looad thee deefauult claass reff foor tthiss paackaage looadDDefaaulttClaassRRef(newwPacckagge, pacckaggeEllemeent); / looad thee gllobaal rresuult lisst ffor thiis ppackkagee looadGGlobbalRResuultss(neewPaackaage, paackaageEElemmentt); / looad thee gllobaal eexceep

51、tiion hanndleer llistt foor tthiss paackaage looadGGlobbalEExceeptiionMMapppinggs(nnewPPackkagee, ppackkageeEleemennt); / geet aactiionss NoodeLListt acctioonLiist = ppackkageeEleemennt.ggetEElemmenttsByyTaggNamme(acttionn); foor (intt i = 00; ii acttionnLisst.ggetLLenggth(); i+) EElemmentt acctioon

52、Ellemeent = (Eleemennt) acttionnLisst.iitemm(i); aaddAActiion(acttionnEleemennt, newwPacckagge); / looad thee deefauult acttionn reeferrencce ffor thiis ppackkagee looadDDefaaulttActtionnReff(neewPaackaage, paackaageEElemmentt); coonfiigurratiion.adddPacckaggeCoonfiig(nnewPPackkagee.geetNaame(), new

53、wPacckagge); reeturrn nnewPPackkagee; 活動圖圖如圖119所示示:(圖199) 配置信信息加載載完成后后,創(chuàng)建建一個AActiion的的代理對對象ActtionnProoxy引引用,實實際上對對Acttionn的調用用正是通通過AcctioonPrroxyy實現的的,而AActiionPProxxy又由由ActtionnProoxyFFacttoryy創(chuàng)建,AActiionPProxxyFaactoory是是創(chuàng)建AActiionPProxxy的工工廠。注:AcctioonPrroxyy和AcctioonPrroxyyFacctorry都是是接口,他他們的默默

54、認實現現類分別別是DeefauultAActiionPProxxy和DDefaaulttActtionnProoxyFFacttoryy,位于于comm.oppenssympphonny.xxworrk2包包下。 在這里里,我們們絕對有有必要介介紹一下下comm.oppenssympphonny.xxworrk2.DeffaulltAcctioonInnvoccatiion類類,該類類是對AActiionIInvoocattionn接口的的默認實實現,負負責Acctioon和截截攔器的的執(zhí)行。 在DeefauultAActiionIInvoocattionn類中,定定義了iinvooke()方

55、法法,該方方法實現現了截攔攔器的遞遞歸調用用和執(zhí)行行Acttionn的exxecuute()方法法。其中中,遞歸歸調用截截攔器的的代碼如如清單117所示示:代碼清單單17:調用截截攔器,DDefaaulttActtionnInvvocaatioon.iinvooke()方法法的部分分代碼 if (intterccepttorss.haasNeext() /從截攔攔器集合合中取出出當前的的截攔器器 ffinaal IInteerceeptoorMaappiing intterccepttor = (IntterccepttorMMapppingg) iinteerceeptoors.nexxt(

56、); UUtillTimmerSStacck.pproffilee(iinteerceeptoor: +iinteerceeptoor.ggetNNamee(), neww UttilTTimeerSttackk.PrrofiilinngBllockk() pubblicc Sttrinng ddoPrrofiilinng() thhrowws EExceeptiion /執(zhí)執(zhí)行截攔攔器(IInteerceeptoor)接接口中定定義的iinteerceept方方法 reesulltCoode = iinteerceeptoor.ggetIInteerceeptoor().innterrcep

57、pt(DDefaaulttActtionnInvvocaatioon.tthiss); reeturrnnuull; ); 從代碼碼中似乎乎看不到到截攔器器的遞歸歸調用,其其實是否否遞歸完完全取決決于程序序員對程程序的控控制,先先來看一一下Innterrcepptorr接口的的定義:代碼清單單18:Intterccepttor.javvapublliciinteerfaace Intterccepttor exttendds SSeriialiizabble voiid ddesttroyy(); voiid iinitt(); Strringg innterrceppt(AActiionII

58、nvoocattionn innvoccatiion) thhrowws EExceeptiion; 所有的的截攔器器必須實實現innterrceppt方法法,而該該方法的的參數恰恰恰又是是ActtionnInvvocaatioon,所所以,如如果在iinteerceept方方法中調調用innvoccatiion.invvokee(),代代碼清單單17會會再次執(zhí)執(zhí)行,從從Acttionn的Innterrceppor列列表中找找到下一一個截攔攔器,依依此遞歸歸。下面面是一個個自定義義截攔器器示例:代碼清單單19:CusstommInttercceptter.javvapublliccclasss

59、 CCusttomIInteerceepteer eexteendss AbbstrracttIntterccepttor Ovverrridee pubblicc Sttrinng iinteerceept(ActtionnInvvocaatioon aactiionIInvoocattionn) tthroows Exccepttionn acttionnInvvocaatioon.iinvooke(); retturnn 李李贊紅; 截攔器器的調用用活動圖圖如圖220所示示:(圖200) 如果截截攔器全全部執(zhí)行行完畢,則則調用iinvookeAActiionOOnlyy()方方法執(zhí)行行A

60、cttionn,innvokkeAcctioonOnnly()方法法基本沒沒做什么么工作,只只調用了了invvokeeActtionn()方方法。 為了執(zhí)執(zhí)行Acctioon,必必須先創(chuàng)創(chuàng)建該對對象,該該工作在在DeffaulltAcctioonInnvoccatiion的的構造方方法中調調用innit()方法法早早完完成。調調用過程程是:DDefaaulttActtionnInvvocaatioon()-iinitt()-crreatteAcctioon()。創(chuàng)建建Acttionn的代碼碼如下:代碼清單單20:DeffaulltAcctioonInnvoccatiion.creeateeAc

溫馨提示

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

評論

0/150

提交評論