![基于反射機(jī)制的框架研究與實(shí)現(xiàn)畢業(yè)論文_第1頁(yè)](http://file4.renrendoc.com/view/c592932a56b4aa6f34cae690f16b7445/c592932a56b4aa6f34cae690f16b74451.gif)
![基于反射機(jī)制的框架研究與實(shí)現(xiàn)畢業(yè)論文_第2頁(yè)](http://file4.renrendoc.com/view/c592932a56b4aa6f34cae690f16b7445/c592932a56b4aa6f34cae690f16b74452.gif)
![基于反射機(jī)制的框架研究與實(shí)現(xiàn)畢業(yè)論文_第3頁(yè)](http://file4.renrendoc.com/view/c592932a56b4aa6f34cae690f16b7445/c592932a56b4aa6f34cae690f16b74453.gif)
![基于反射機(jī)制的框架研究與實(shí)現(xiàn)畢業(yè)論文_第4頁(yè)](http://file4.renrendoc.com/view/c592932a56b4aa6f34cae690f16b7445/c592932a56b4aa6f34cae690f16b74454.gif)
![基于反射機(jī)制的框架研究與實(shí)現(xiàn)畢業(yè)論文_第5頁(yè)](http://file4.renrendoc.com/view/c592932a56b4aa6f34cae690f16b7445/c592932a56b4aa6f34cae690f16b74455.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于反射機(jī)制的框架研究與實(shí)現(xiàn)RESEARCHANDIMPLEMENTATIONOFTHEFRAMEWORKBASEDONREFLECTION專業(yè):2010信息與計(jì)算科學(xué)指導(dǎo)教師:申請(qǐng)學(xué)位級(jí)別:學(xué)士論文提交日期:2014年6月12日摘要目前,隨著互聯(lián)網(wǎng)應(yīng)用的快速發(fā)展,軟件運(yùn)行環(huán)境正從一個(gè)集中封閉計(jì)算的平臺(tái)走向開放、動(dòng)態(tài)的計(jì)算平臺(tái),并且基于服務(wù)的計(jì)算模式將逐漸取代它,因此這些變化傳統(tǒng)軟構(gòu)件技術(shù)應(yīng)對(duì)起來(lái)很困難。本文針對(duì)目前框架復(fù)用程度不高,無(wú)法適應(yīng)動(dòng)態(tài)運(yùn)行環(huán)境和多變用戶需求這些問(wèn)題,基于反射理論,研究具有靈活性和自適應(yīng)性的框架。框架具有減少代碼冗余,提高運(yùn)行速度,便于維護(hù),規(guī)編程等優(yōu)點(diǎn)。Java反射機(jī)制是在運(yùn)行狀態(tài)當(dāng)中,對(duì)于任何一個(gè)類,都可以知道這個(gè)類的所有屬性與方法;對(duì)于任何一個(gè)對(duì)象,都能夠調(diào)用它的一個(gè)方法與屬性;這種動(dòng)態(tài)獲取信息和動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為Java語(yǔ)言的反射機(jī)制。反射其實(shí)就是程序可以對(duì)自身信息進(jìn)行檢查。在程序中能夠檢查某類中的方法屬性等信息,而且能夠動(dòng)態(tài)調(diào)用。這樣就能夠?qū)懗龊莒`活的程序。例如想要把一個(gè)對(duì)象中屬性名一樣的數(shù)據(jù)復(fù)制到另外一個(gè)對(duì)象中,就可以利用反射,而且不需要指定每個(gè)屬性名字,只需要?jiǎng)討B(tài)從類中獲取信息,再判斷屬性名是否一樣就可以了。本課題旨在基于反射機(jī)制對(duì)框架進(jìn)行研究,實(shí)現(xiàn)一個(gè)輕量級(jí)的框架以此來(lái)適應(yīng)小的系統(tǒng)。輕量J2EE應(yīng)用是對(duì)經(jīng)典J2EE應(yīng)用的簡(jiǎn)化,在保留經(jīng)典J2EE應(yīng)用的架構(gòu)、良好的可擴(kuò)展性、可維護(hù)性的基礎(chǔ)上,簡(jiǎn)化了J2EE應(yīng)用的開發(fā),降低了J2EE應(yīng)用的成本。關(guān)鍵詞:反射機(jī)制;輕量級(jí);框架ABSTRACTCurrently,withtherapiddevelopmentofInternetapplications,softwareoperatingenvironmentismovingfromacentralizedclosedcomputingplatformtoanopenanddynamiccomputingplatform,service-basedcomputingmodelwillgraduallyreplaceit,therefore,thesechangestraditionalsoftwarecomponenttechnologyisverydifficulttodealwith.Inthisarticle,Fortheseissuesaboutcurrentsoftwarecomponentrepeatedutilizationisnothigh,dynamicoperatingenvironmentcannotmeetandthechangingneedsofusers,accordingtothetheoryofreflection,thisarticleresearchesasoftwarecomponenttechnologywhichishighflexibilityandadaptability.Theframeworkiswiththeadvantagesofreducingcoderedundancy,improvingthespeed,easeofmaintenance,standardizedprogrammingandsoon.JAVAreflectioncanknowallthepropertiesandmethodsofanyoneclassinrunningthem;Foranyobject,itisabletocalloneofitsmethodsandproperties;Thefunctionofaccessingtoinformationdynamicallyandcallingobjectmethoddynamicallyiscalledreflectionmechanismofjavalanguage.Actually,reflectionisaprogramcanchecktheinformationontheirown.JAVAreflectionmechanismcancheckthepropertiesofcertainmethodsininformation,andinvokedynamically.Thismakesitpossibletowriteaveryflexibleprogram.Forexample,someonewantstocopyanobjectattributewiththesamenameasthedatatoanother,hecanusereflection,withoutneedingtospecifythenameofeachattribute,onlyneedtogetinformationfromadynamicclass,andthendeterminewhetherthesamepropertynameonit.Thisarticleisbasedonresearchingthereflectionmechanismframework,achievingalightweightframeworkinordertoadapttothesmallsystem.ApplicationofLightweightJ2EEissimplifiedbyclassicJ2EE,Onthebasisofretainingtheclassicapplicationarchitecture,goodscalability,andgoodmaintainability,itSimplifiesapplicationdevelopmentandreducesapplicationcosts.Keywords:Reflection;lightweight;framework目錄第一章緒論1第一節(jié)論文的背景1第二節(jié)論文研究目標(biāo)1第二章相關(guān)概念以與概念之間的關(guān)系2第一節(jié)反射機(jī)制2第二節(jié)輕量級(jí)2第三節(jié)設(shè)計(jì)模式簡(jiǎn)介2第四節(jié)框架3第五節(jié)架構(gòu)4第六節(jié)框架與架構(gòu)關(guān)系4第七節(jié)框架與設(shè)計(jì)模式關(guān)系4第三章系統(tǒng)開發(fā)環(huán)境技術(shù)介紹6第一節(jié)MyEclipse介紹6第二節(jié)MySQL數(shù)據(jù)庫(kù)介紹6第四章框架研究8第一節(jié)Struts2框架8第二節(jié)Spring框架8第三節(jié)Hibernate框架9第四節(jié)Java優(yōu)點(diǎn)10第五章框架與數(shù)據(jù)庫(kù)連接工具12第一節(jié)JDBC介紹12第二節(jié)連接池13第三節(jié)幾種常見的連接池14第六章建立數(shù)據(jù)庫(kù)17第一節(jié)數(shù)據(jù)庫(kù)表的結(jié)構(gòu)17第二節(jié)創(chuàng)建數(shù)據(jù)庫(kù)部分代碼與結(jié)果17第七章基于反射機(jī)制框架的設(shè)計(jì)與實(shí)現(xiàn)19第一節(jié)框架的總體設(shè)計(jì)19第二節(jié)具體代碼介紹20第三節(jié)代碼測(cè)試22第八章論文總結(jié)與展望30第一節(jié)本文總結(jié)30第二節(jié)未來(lái)展望30參考文獻(xiàn)31致32第一章緒論第一節(jié)論文的背景隨著軟件不斷升級(jí)的規(guī)模和復(fù)雜性,在軟件工程中,大家更加深刻的認(rèn)識(shí)到系統(tǒng)構(gòu)造的整體設(shè)計(jì)與規(guī)格說(shuō)明的重要程度早已高出數(shù)據(jù)結(jié)構(gòu)以與特定算法的選擇,而且系統(tǒng)的成功需要優(yōu)良的體系結(jié)構(gòu)來(lái)保證。伴隨軟件技術(shù)和軟件領(lǐng)域的不斷發(fā)展,復(fù)雜性越來(lái)越大。越來(lái)越多的問(wèn)題需要開發(fā)人員的解決,當(dāng)然解決的方法、方案各不一樣。開發(fā)人員或者設(shè)計(jì)師如何在以前的工作基礎(chǔ)之上開發(fā)新的設(shè)計(jì),對(duì)以前的成功案例進(jìn)行復(fù)用。因此,軟件重用技術(shù)越來(lái)越被人們所重視了,設(shè)計(jì)模式和框架漸漸產(chǎn)生。由于開源軟件興起,框架更是層出不窮。架構(gòu)是軟件系統(tǒng)由整體到部分最高層次的劃分,大多數(shù)是由多個(gè)不一樣領(lǐng)域框架構(gòu)成。一個(gè)成功的體系架構(gòu)有助于成功的軟件促成,但軟件體系結(jié)構(gòu)需要一個(gè)復(fù)雜的和不斷改進(jìn)以建立的過(guò)程。軟件開發(fā)人員不可能為每個(gè)不同項(xiàng)目,使用不同的構(gòu)架,那樣既耗時(shí)又費(fèi)力。能夠重用以前構(gòu)架,或者開發(fā)通用構(gòu)架是每個(gè)開發(fā)者所想要的。在不同的框架中如何選擇適合應(yīng)用的框架,以與如何讓每個(gè)應(yīng)用層完美連接?如何整合框架,才能使各層之間互相作用是以都以一種松散耦合方式而不用去管底層技術(shù)細(xì)節(jié)?軟件開發(fā)人員需要解決這些問(wèn)題。第二節(jié)論文研究目標(biāo)框架核心的價(jià)值是對(duì)知識(shí)的積累。但由于知識(shí)只存在于編程人員大腦之中,因此是很難進(jìn)行累積的。在軟件開發(fā)中,代碼是確定的知識(shí),人力或者機(jī)器可讀取代碼都能夠理解代碼的目的,而且會(huì)出現(xiàn)一樣的理解,因此最好的辦法是使用代碼對(duì)知識(shí)進(jìn)行積累。框架就是這種思想產(chǎn)物??蚣馨松僭S代碼,它們描述了在某一個(gè)圍問(wèn)題中抽象概念和抽象概念之間的關(guān)聯(lián)。因此能夠利用框架對(duì)知識(shí)進(jìn)行積累??蚣芏x了擴(kuò)展方式以此規(guī)框架的使用行為。復(fù)用和在包裝的思緒讓軟件能夠保持總體構(gòu)造穩(wěn)定性與擴(kuò)展性。針對(duì)當(dāng)前有多種流行的Java框架,這些框架中有優(yōu)秀的設(shè)計(jì)思想,有優(yōu)秀的設(shè)計(jì)模式,也有數(shù)不清的成功的商業(yè)應(yīng)用案例,同時(shí),它們所使用的Jar文件也有成百個(gè)模型,所以對(duì)于小的系統(tǒng)不太適合,本課題旨在基于反射機(jī)制對(duì)框架進(jìn)行研究,實(shí)現(xiàn)一個(gè)輕量級(jí)的框架以此來(lái)適應(yīng)小的系統(tǒng)。輕量級(jí)J2EE是在對(duì)經(jīng)典J2EE的應(yīng)用的簡(jiǎn)化,同時(shí)在保存了經(jīng)典的應(yīng)用體系結(jié)構(gòu),優(yōu)秀的可擴(kuò)展性,可維護(hù)性基礎(chǔ)之上,簡(jiǎn)化了應(yīng)用的開發(fā),削減應(yīng)用成本。第二章相關(guān)概念以與概念之間的關(guān)系第一節(jié)反射機(jī)制Java反射機(jī)制在運(yùn)行時(shí),對(duì)任何一個(gè)類都可以了解此類的全部屬性與方法;對(duì)任意一個(gè)對(duì)象,都能夠調(diào)出應(yīng)用它的一種方法與屬性;這類動(dòng)態(tài)獲得信息和以動(dòng)態(tài)方式去調(diào)用目標(biāo)的功能叫做Java語(yǔ)言反射機(jī)制[1]。Java語(yǔ)言產(chǎn)生的原因是為了適應(yīng)網(wǎng)絡(luò)應(yīng)用。語(yǔ)言的反射機(jī)制的開發(fā)和實(shí)施,其目的是能夠傳遞網(wǎng)絡(luò)中的對(duì)象,并可以根據(jù)傳遞的對(duì)象的信息來(lái)重建對(duì)象本身,因此重建是動(dòng)態(tài)的。在遠(yuǎn)程過(guò)程與遠(yuǎn)程方式調(diào)用功能達(dá)成中,反射機(jī)制起到了很大的功用。也的確是在這些基礎(chǔ)之上孕育了Java的各類新技術(shù)。在Java語(yǔ)言中,一個(gè)類具有不同的屬性和方法,通過(guò)相關(guān)類來(lái)實(shí)現(xiàn)對(duì)其信息的提取與重構(gòu)。第二節(jié)輕量級(jí)所謂“輕量級(jí)”,并非“設(shè)計(jì)簡(jiǎn)陋、功用少、實(shí)現(xiàn)粗陋”的意思。它的設(shè)計(jì)理念哲學(xué)意義是“很多的操作不需要分布式以與不需要那些重量級(jí)的技能,比方說(shuō)JNDI,將應(yīng)用中沒(méi)必要的技術(shù)隔離或者改造是有必要[2]。完全能針對(duì)目前最常見、簡(jiǎn)易的使用中的場(chǎng)景來(lái)設(shè)計(jì),有特殊的需要時(shí),再想辦法解決問(wèn)題就行”?!拜p量級(jí)”包含兩個(gè)概念:1、對(duì)編程模型和更具響應(yīng)能力的容器簡(jiǎn)化,對(duì)傳統(tǒng)J2EEAPI有關(guān)不必要的復(fù)雜性與限制進(jìn)行清除。2、對(duì)于需求常常測(cè)試調(diào)試的開發(fā),縮小應(yīng)用程序部署時(shí)間是很有必要的。第三節(jié)設(shè)計(jì)模式簡(jiǎn)介一、模式的歷史設(shè)計(jì)模式最早源于建筑學(xué)。在20世紀(jì)70年代,建筑學(xué)家CHRISTOPHERALEXANDER完成了許多專著,在這些專著中有些記錄了建筑學(xué)以與土木工程學(xué)的模式。之后,軟件開發(fā)的一些模式先驅(qū)們?cè)贑HRISTOPHERALEXANDER的專著中得到了靈感,從此軟件開發(fā)就有模式這一觀念了[3][4]。經(jīng)過(guò)ErichGamma、JohnVlissides、RalphJphnson、RichardHelm四位作者的文章[5],軟件開發(fā)中的模式觀念得到了普與。GOF在他們的作品中共記錄了常用的設(shè)計(jì)模式,這些模式后來(lái)被人們稱為GOF模式。當(dāng)然,他們的作品中描述的模式并非他們自己發(fā)明的。而是他們?cè)诎l(fā)現(xiàn)許多類似的設(shè)計(jì)方案,這些設(shè)計(jì)方案在很多項(xiàng)目重復(fù)的出現(xiàn),他們總結(jié)出這些模式,并記錄在書中。當(dāng)GOF的作品出版之后,大量類似的軟件模式書籍相繼出現(xiàn),這些著作涉與到各個(gè)領(lǐng)域和用途。二、模式的定義其實(shí)模式很難有固定的定義,Alexander描述的是:“模式描述了在人們四周不停的反復(fù)發(fā)生的問(wèn)題和這個(gè)問(wèn)題解決方案的主旨。如此,人們就可以屢次的運(yùn)用該方案而不必去做同樣的勞動(dòng)了”。雖然Alexander說(shuō)的是建筑的模式,但這個(gè)定義在軟件設(shè)計(jì)中也能很好運(yùn)用。一個(gè)模式一般有四個(gè)基本要素[5]。“模式名稱”是一個(gè)助記名,對(duì)于模式想要解決的問(wèn)題、效果以與解決方案能夠利用一兩個(gè)詞匯進(jìn)行描述。“問(wèn)題”描述了模式適用場(chǎng)景并對(duì)設(shè)計(jì)問(wèn)題以與問(wèn)題存在的因果進(jìn)行解釋?!敖鉀Q方案”表達(dá)了設(shè)計(jì)組成部分以與他們之間的合作方法和各自的任務(wù)?!靶Ч北磉_(dá)了了模式應(yīng)用效果和使用模式權(quán)衡問(wèn)題。三、模式的作用每個(gè)設(shè)計(jì)模式體系的評(píng)估、注解和定名了面向?qū)ο笙到y(tǒng)中一個(gè)首要并且反復(fù)出現(xiàn)得設(shè)計(jì)[6],用這樣的模式會(huì)使我們獲益良多。第一,模式可以讓我們重用成功設(shè)計(jì)與體系結(jié)構(gòu)。通過(guò)模式提供的方案都在不同時(shí)間、不同項(xiàng)目中被反復(fù)的用于解決相似的問(wèn)題而總結(jié)的使用經(jīng)驗(yàn),模式形成了強(qiáng)大的重用機(jī)制,可以讓軟件開發(fā)人員避免重復(fù)編寫代碼。第二,模式提供大量共用詞匯。使用這些詞匯軟件開發(fā)人員可以在更高層上進(jìn)行設(shè)計(jì)以與交流。第三,模式制約了解決方案空間。模式增加了問(wèn)題解決方案空間的約束,也可以說(shuō)是創(chuàng)造出了一個(gè)邊界,設(shè)計(jì)以與實(shí)施必須在邊界里面完成,否則就會(huì)對(duì)模式與設(shè)計(jì)損壞,導(dǎo)致意想不到的“反模式”。第四節(jié)框架框架是提取工程軟件開發(fā)當(dāng)中特定圍軟件具備相似屬性的部份,框架是由一組聯(lián)系緊密的classes(類)構(gòu)成的,通過(guò)強(qiáng)調(diào)類相互的配合從而完成某種能夠復(fù)用的設(shè)計(jì)概念。這些類相互之間以特定的方式合作。大多數(shù)框架的一般作用:因?yàn)槭菍?duì)特定領(lǐng)域軟件具備相似屬性部分的提取,所以在這一領(lǐng)域開發(fā)新的程序過(guò)程中能夠不需要重新編寫代碼,只需要基于現(xiàn)有的框架進(jìn)行進(jìn)一步開發(fā)和整合就可以了;這樣就能夠提升軟件質(zhì)量,大大的降低本錢,而且節(jié)省很多時(shí)間,使開發(fā)軟件越來(lái)越方便,效果越來(lái)越好,最后產(chǎn)生一種好的循環(huán)效果??蚣懿皇强梢灾苯永玫默F(xiàn)成應(yīng)用系統(tǒng),因?yàn)榭蚣軆H僅是一個(gè)半成品,需要軟件開發(fā)人員對(duì)它進(jìn)行第二次發(fā)開從而達(dá)成具有具體功能的應(yīng)用系統(tǒng)??蚣懿⒉皇恰捌脚_(tái)”,由于平臺(tái)這個(gè)概念較模糊,它可以是一種通訊中間件,一種應(yīng)用服務(wù)器,一種數(shù)據(jù)庫(kù)軟件,一種操作系統(tǒng),所以在應(yīng)用平臺(tái)當(dāng)中中,平臺(tái)主要責(zé)任就是供應(yīng)特定服務(wù)系統(tǒng)軟件。第五節(jié)架構(gòu)軟件系統(tǒng)架構(gòu)一般具有兩個(gè)要素:(1)架構(gòu)是由總體到部份最高層次的劃分的一個(gè)軟件體系。一個(gè)體統(tǒng)一般是由元件組成,而這類元件怎么形成以與他們之間怎么產(chǎn)生作用,是關(guān)于系統(tǒng)自身構(gòu)造的重要信息。更加詳細(xì)的說(shuō),要包括任務(wù)流、架構(gòu)元件、聯(lián)結(jié)器。構(gòu)架也就是系統(tǒng)核心的“磚瓦”,聯(lián)結(jié)器才是對(duì)元件間通信機(jī)制、通信預(yù)想結(jié)果、通信途徑很好的描述,任務(wù)流是對(duì)怎么運(yùn)用這類元件來(lái)實(shí)現(xiàn)某項(xiàng)需要進(jìn)行描述。(2)建立一個(gè)系統(tǒng)做出最高水平,在以后很難改變,商業(yè)與技術(shù)所決定。在構(gòu)建系統(tǒng)之前要提前做出重要決定,如果系統(tǒng)已經(jīng)開始了一個(gè)詳細(xì)的設(shè)計(jì)或者構(gòu)造,這些決定一般就無(wú)法更改了。因此,必須認(rèn)真研究后再做出決定,這決定了設(shè)計(jì)成功與否。第六節(jié)框架與架構(gòu)關(guān)系框架不是架構(gòu),架構(gòu)決定了系統(tǒng)層次的區(qū)分、總體結(jié)構(gòu),不一樣部份間的合作等設(shè)計(jì)思考。而框架比構(gòu)架更加具體,更加側(cè)重于技術(shù)。在確定框架之后,軟件體系結(jié)構(gòu)也隨著確定了,對(duì)于同一個(gè)軟件體系結(jié)構(gòu)可以通過(guò)各種框架來(lái)實(shí)現(xiàn)。第七節(jié)框架與設(shè)計(jì)模式關(guān)系在軟件設(shè)計(jì)當(dāng)中框架與設(shè)計(jì)模式是不一樣的鉆研圍。設(shè)計(jì)模式是對(duì)設(shè)計(jì)問(wèn)題找出解決的方法,一個(gè)模式能夠被各種框架以與被各類語(yǔ)言所實(shí)現(xiàn);框架不僅是一種應(yīng)用體系結(jié)構(gòu),而且是設(shè)計(jì)模式與代碼的混合體。他們之間雖然有差別,然而都協(xié)同讓設(shè)計(jì)者的代碼能夠復(fù)用,因此框架在思路里有著同樣的特點(diǎn),所以設(shè)計(jì)模式的想法能在框架設(shè)計(jì)中運(yùn)用??蚣芘c設(shè)計(jì)模式有著明顯區(qū)分,原因主要體現(xiàn)在他們給出的容和致力的應(yīng)用領(lǐng)域。(1)從容看,設(shè)計(jì)模式是一個(gè)簡(jiǎn)單的設(shè)計(jì),這個(gè)設(shè)計(jì)可以有很多不同的語(yǔ)言,用不用的方式去實(shí)現(xiàn);而框架是一種混合體由設(shè)計(jì)和代碼組成,軟件開發(fā)人員可以不擴(kuò)展框架,從而形成完全不同的應(yīng)用。(2)從應(yīng)用來(lái)看,框架給出了全部應(yīng)用體系結(jié)構(gòu);設(shè)計(jì)模式是給了一種簡(jiǎn)單的方案以解決設(shè)計(jì)問(wèn)題,而且這個(gè)方案能在各種不一樣的應(yīng)用程序或框架當(dāng)中進(jìn)行使用。(3)以第一條為基礎(chǔ),可以看出設(shè)計(jì)模式相比框架更加容易移植;只要設(shè)計(jì)成形的框架,即使不構(gòu)成一個(gè)完整的應(yīng)用程序,但以此為基礎(chǔ)進(jìn)行的應(yīng)用的開發(fā)會(huì)被框架的實(shí)現(xiàn)環(huán)境所制約;在這方面設(shè)計(jì)模式是和語(yǔ)言無(wú)關(guān),因此能在更加廣泛異構(gòu)的環(huán)境中進(jìn)行應(yīng)用??蚣苁且粋€(gè)軟件,設(shè)計(jì)模式則是軟件的知識(shí)體,設(shè)計(jì)模式會(huì)對(duì)框架設(shè)計(jì)的水平進(jìn)行提高。第三章系統(tǒng)開發(fā)環(huán)境技術(shù)介紹第一節(jié)MyEclipse介紹MyEclipse是一個(gè)功能強(qiáng)大支持也非常的普遍,用于開發(fā)JAVA、J2EE十分杰出的Eclipse的插件集合,對(duì)支持各類開源品特別的擅長(zhǎng)。作為一個(gè)專門為Eclipse所設(shè)計(jì)和開發(fā)的插件集合,MyEclipse研發(fā)的初衷只是為了簡(jiǎn)化Eclipse的操作,為開發(fā)人員提供一個(gè)良好的操作界面和相對(duì)簡(jiǎn)單的操作方式。然而由于其開源性,在之后的各個(gè)版本中MyEclipse不斷的得到了功能上的加強(qiáng)。到如今,MyEclipse10的功能可謂是相當(dāng)巨大,它不但為Eclipse供應(yīng)了大量的Java工具的集合,極大的處理了不同開源工具的不一樣問(wèn)題,同樣也在自身集成了Tomcat,使得任務(wù)的發(fā)布不再需要事先綁定Tomcat,極大的簡(jiǎn)化了開發(fā)人員所需要安裝的開發(fā)程序的數(shù)量。使得Java/JSP應(yīng)用開發(fā)的效率得到了很大的提升。在結(jié)構(gòu)上,MyEclipse的特征能夠被分為七類:WEB開發(fā)工具、JavaEE項(xiàng)目部署服務(wù)、E開發(fā)工具、數(shù)據(jù)庫(kù)服務(wù)、應(yīng)用程序服務(wù)器的連接器、JavaEE模型、MyEclipse整合幫助。關(guān)于以上各類功能上的類別,在Eclipse中能夠查找到相應(yīng)作用的部件,而且通過(guò)一系列插件去完成它們。MyEclipse構(gòu)造上的模塊化,可以是我們對(duì)任何一個(gè)模塊進(jìn)行獨(dú)自擴(kuò)大與升級(jí)而且不影響其他模塊。也就是說(shuō)MyEclipse是Eclipse的插件,同時(shí)是一個(gè)功用十分巨大的JavaEE集成開發(fā)環(huán)境,它的主要作用是對(duì)代碼進(jìn)行編寫、測(cè)試配置和除錯(cuò)。MyEclipse作為Java、J2EE的開發(fā)插件集合中一個(gè)十分優(yōu)秀的插件集合,它有著十分強(qiáng)大的功能和廣泛的應(yīng)用支持面。它本身自帶了非常完善的編碼、調(diào)試、測(cè)試功能,在MyEclipse的最新版本MyEclipse10中,甚至集成了發(fā)布功能,能夠不再依賴于Tomcat來(lái)進(jìn)行程序發(fā)布。并且MyEclipse能夠完美的支持Struts、JSP、JavaScript、Spring、SQL等程序。可以說(shuō),在Eclipse開發(fā)工具中,幾乎包括了目前所有主流開源產(chǎn)品的MyEclipse毫無(wú)疑問(wèn)的成為了最閃耀的一點(diǎn)星光。第二節(jié)MySQL數(shù)據(jù)庫(kù)介紹作為當(dāng)今計(jì)算機(jī)科學(xué)技術(shù)的一大分支,數(shù)據(jù)庫(kù)成為了數(shù)據(jù)管理的最新技術(shù),同時(shí)也為各式各樣的信息管理系統(tǒng)提供了一個(gè)數(shù)據(jù)儲(chǔ)存和交換修改的方式[7]。在如今的主流的網(wǎng)頁(yè)開發(fā)和系統(tǒng)設(shè)計(jì)中,數(shù)據(jù)庫(kù)的設(shè)計(jì)與實(shí)現(xiàn)已經(jīng)成為了一個(gè)不可缺少的部分,它擔(dān)當(dāng)起了數(shù)據(jù)存儲(chǔ)與維護(hù)的重任,是系統(tǒng)開發(fā)的靈魂部分。對(duì)于本系統(tǒng)而言,數(shù)據(jù)庫(kù)用于存放學(xué)生的基礎(chǔ)信息,是系統(tǒng)實(shí)現(xiàn)的基礎(chǔ)部分。因此,數(shù)據(jù)庫(kù)技術(shù)作為信息系統(tǒng)核心和基礎(chǔ)得到愈來(lái)愈多的應(yīng)用,從小型單項(xiàng)事務(wù)處理到大型信息系統(tǒng)(On-LineAnalysisProcessing,OLAP),從OLTP(OnlineTransactionProcessing,聯(lián)機(jī)事務(wù)處理)到OLAP(On-LineAnalysisProcessing,聯(lián)機(jī)分析處理);從一般企業(yè)管理到計(jì)算機(jī)輔助設(shè)計(jì)與制造(CAD/CAM)、計(jì)算機(jī)集成制造系統(tǒng)(CIMS)、電子政務(wù)(e-Government)、電子商務(wù)(e-Commerce)、地理信息系統(tǒng)(GIS)等[8],越來(lái)越多新的應(yīng)用領(lǐng)域采用數(shù)據(jù)庫(kù)技術(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)的儲(chǔ)存和處理工作。作為一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),MySQL因?yàn)槠溟_源性受到了廣大程序員的青睞,其現(xiàn)屬于Oracle公司。在Web應(yīng)用開發(fā)方面MySQL是最好的關(guān)系類型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)應(yīng)用軟件之一,被廣泛應(yīng)用于各種各樣的Web程序開發(fā)當(dāng)中。MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫(kù)管理系統(tǒng),它將數(shù)據(jù)保存在不同的表中,而不是將各種各樣的數(shù)據(jù)堆放在一起,通過(guò)表與表之間的關(guān)系來(lái)將數(shù)據(jù)連接在一起,這樣就增加勒數(shù)據(jù)的處理速度,并且提高了靈活性[9]。MySQL在語(yǔ)言的選擇上依舊采用了主流的SQL數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)化語(yǔ)言,這也使得其容易上手,并且編寫相對(duì)規(guī)。MySQL最大的優(yōu)勢(shì)在于開放源碼,使得其成為了一般中小型的開發(fā)首選。SQL語(yǔ)句介紹:作為是一種功能非常強(qiáng)大的數(shù)據(jù)庫(kù)語(yǔ)言,SQL被譯為結(jié)構(gòu)查詢語(yǔ)言,其英文全稱為StructuredQueryLanguage。通常會(huì)被應(yīng)用在一些大型數(shù)據(jù)庫(kù)的建立之中。SQL語(yǔ)句一般用于完成數(shù)據(jù)的日常操作任務(wù),例如在數(shù)據(jù)庫(kù)中對(duì)數(shù)據(jù)進(jìn)行插入、更新、刪除,或者對(duì)數(shù)據(jù)庫(kù)進(jìn)行檢索操作[10]。常見的使用SQL的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)有:MySQL、Oracle、SQLsever2000、Sybase、DB2、MicrosoftSQLServer、Access等。在不同的數(shù)據(jù)庫(kù)中,絕大多數(shù)的SQL結(jié)構(gòu)化查詢語(yǔ)言都是可以通用的,只有個(gè)別情況下會(huì)有一定差異。但是例如:“Select”、“Insert”、“Update”、“Delete”、“Drop”、“Create”等標(biāo)準(zhǔn)SQL命令,即使在不同數(shù)據(jù)庫(kù)中也是沒(méi)有差異的。SQL概括起來(lái)大概可以分為以下幾個(gè)部分:(1)DCL(DataControlLanguage數(shù)據(jù)控制語(yǔ)言)通常被用于對(duì)用戶的權(quán)限進(jìn)行賦予和取消;(2)DDL(DataDefinitionLanguage數(shù)據(jù)定義語(yǔ)言)通常被用于數(shù)據(jù)結(jié)構(gòu)的定義,如創(chuàng)建、修改、刪除等命令;(3)DML(DataManipulationLanguage數(shù)據(jù)操作語(yǔ)言)通常被用于檢索或者修改數(shù)據(jù)庫(kù)中的已有數(shù)據(jù);第四章框架研究第一節(jié)Struts2框架Struts2早先是ApacheJakarta項(xiàng)目構(gòu)成成分,項(xiàng)目的先鋒者想要改善與提升Servlet、JSP、標(biāo)簽庫(kù)和面向?qū)ο蠹夹g(shù)水平,所以對(duì)此項(xiàng)目進(jìn)行相信的研究。Struts2是建立在web的技術(shù)之上的一個(gè)MVC框架并不是完全獨(dú)立出來(lái)的技術(shù),脫離這些技術(shù),Struts2框架也就不能運(yùn)用了[11]。Struts2是Struts的升級(jí)品,Struts2框架是以struts1和WebWork的技術(shù)為基礎(chǔ)進(jìn)行了歸并。其嶄新的Struts2體系結(jié)構(gòu)和Struts1體系結(jié)構(gòu)大不一樣。Struts2是以WebWork為核心,選用WebWork設(shè)計(jì)想法,而且選用攔截器的機(jī)制來(lái)解決客戶要求,如此的設(shè)計(jì)也讓業(yè)務(wù)邏輯控制器能夠和ServletAPI徹底擺脫開,因此Struts2能夠當(dāng)成是WebWork更新之后的產(chǎn)物。雖然Struts1和Struts2有著十分大的改動(dòng),然而相對(duì)WebWork和Struts2改變倒是微不足道[12]。Struts2工作原理:首先客戶端會(huì)發(fā)出一個(gè)要求,此要求可以通過(guò)多個(gè)過(guò)濾器最終到FilterDispatcher過(guò)濾器。然后FilterDispatcher會(huì)經(jīng)過(guò)ActionMapper來(lái)判斷此Request需求調(diào)用哪一個(gè)Action,如果需求調(diào)用的Action被尋找到,之前的請(qǐng)求處理就會(huì)被過(guò)濾器交給ActionProxy。然后ActionProxy會(huì)建立ActionInvocation實(shí)例,ActionInvocation此時(shí)會(huì)調(diào)用正確的Action,當(dāng)然調(diào)用Action的過(guò)程當(dāng)中會(huì)涉與到有關(guān)攔截器的調(diào)用。當(dāng)Action執(zhí)行完成,ActionInvocation會(huì)按照struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。第二節(jié)Spring框架Spring是一個(gè)開源框架,軟件開發(fā)商為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性問(wèn)題。利用基本的JavaBean來(lái)實(shí)現(xiàn)之前只可由E實(shí)現(xiàn)的工作,并且提供了許多企業(yè)應(yīng)用的功能。但是,Spring用處不單限至于服務(wù)器端開發(fā),從簡(jiǎn)約性、可測(cè)試性和松耦合的角度,每一個(gè)Java應(yīng)用都能夠從Spring當(dāng)中得到好處。Spring不是專注于J2EE某一層的解決方法,而是尋找J2EE應(yīng)用各層的解決方法。Spring為企業(yè)應(yīng)用開發(fā)的“一站式”選取,Spring貫串持久層、業(yè)務(wù)層和表現(xiàn)層。但是,Spring不想代替現(xiàn)有的框架,而是以高度開放性與和他們完美聯(lián)合。Spring框架是個(gè)分層構(gòu)造,由七個(gè)定義優(yōu)秀模塊構(gòu)成。如圖4-1所示。AOP元數(shù)據(jù)與動(dòng)態(tài)代理實(shí)現(xiàn)MVCAOP元數(shù)據(jù)與動(dòng)態(tài)代理實(shí)現(xiàn)MVC框架Web上下文Web應(yīng)用環(huán)境和工具類ORM支持Hibernate,JDO,iBatis,ToplinkSpring上下文Spring上下文校驗(yàn),JNDI,Mail,任務(wù)等SpringDAO事務(wù),DAO,JDBC核心容器核心容器Bean容器與支持工具圖4-1Spring框架的7個(gè)模版構(gòu)成Spring框架的每一個(gè)模塊都可以單獨(dú)使用,或與其他的一個(gè)或者多個(gè)模塊共同使用,每一個(gè)模塊功能如下。(1)核心容器:核心容器為Spring框架提供了最基本的功能。重要構(gòu)件是BeanFactory,是以工廠形式來(lái)實(shí)現(xiàn)的,利用IoC模式將應(yīng)用程序的配置與依賴性規(guī)和實(shí)際應(yīng)用程序代碼隔開。(2)Spring上下文:Spring上下文是一個(gè)配置文件,向Spring框架提供上下文信息。這些上下文包含企業(yè)服務(wù)。(3)AOP:通過(guò)配置管理功用模塊,直接面向方面編程的功能集成到框架。因此,能夠很輕易地利用Spring框架管理的任一個(gè)對(duì)象支持AOP。(4)SpringDAO:JDBCDAO抽象層供應(yīng)了有實(shí)際意義的反常層次構(gòu)造,我們可以使用該構(gòu)造來(lái)管理異常辦理和不正確的消息被不一樣數(shù)據(jù)庫(kù)供應(yīng)商拋棄。異樣層次構(gòu)造簡(jiǎn)單化了錯(cuò)誤處理,而且大大的降低了需求編寫異常代碼數(shù)目(例如開啟和關(guān)閉連接)。(5)ORM:Spring框架為多個(gè)ORM框架,他提供了一個(gè)ORM對(duì)象關(guān)系的工具。(6)Web上下文:上下文模塊提供了基于應(yīng)用程序的上下文同時(shí)建在應(yīng)用程序上下文模塊的基礎(chǔ)之上。因此Spring框架能夠和JakartaStruts集成。該模塊還簡(jiǎn)單化處理一般請(qǐng)求而且將要求參數(shù)綁定到域目標(biāo)的工作。(7)MVC框架:MVC框架是構(gòu)建Web應(yīng)用程序功能齊全的MVC實(shí)現(xiàn)。經(jīng)過(guò)計(jì)謀端口,框架包容了大批視圖技術(shù)而變?yōu)楦呒?jí)可配置的。一般功能適用于不受制管理環(huán)境的影響,因此Spring框架功能能夠在任何J2EE服務(wù)器中使用。Spring主旨是:支持沒(méi)有綁定到指定J2EE服務(wù)并且可反復(fù)利用的業(yè)務(wù)和數(shù)據(jù)訪問(wèn)對(duì)象。第三節(jié)Hibernate框架Hibernate框架是一個(gè)數(shù)據(jù)訪問(wèn)框架(也叫持久層框架,可將實(shí)體對(duì)象成持久對(duì)象)通過(guò)Hibernate框架可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查,為業(yè)務(wù)層構(gòu)建一個(gè)持久層。可以使用它替代以前的JDBC訪問(wèn)數(shù)據(jù)[13]。Hibernate在對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)的時(shí)候可以對(duì)數(shù)據(jù)庫(kù)操作代碼進(jìn)行簡(jiǎn)化,并且Hibernate能夠自動(dòng)生成SQL,也可以把ResultSet所記錄的以與實(shí)體類自動(dòng)映射。Hibernate的API每一個(gè)數(shù)據(jù)庫(kù)都可以執(zhí)行,這是由于Hibernate的API當(dāng)中并沒(méi)有設(shè)計(jì)SQL的語(yǔ)句,數(shù)據(jù)庫(kù)會(huì)根據(jù)Hibernate配置文件自動(dòng)的生成相對(duì)應(yīng)的SQL語(yǔ)句。Hibernate的任務(wù)就是負(fù)責(zé)是對(duì)JAVA對(duì)象與數(shù)據(jù)庫(kù)表中數(shù)據(jù)之間的映射。Hibernate是現(xiàn)在一個(gè)比較流行的ORM(對(duì)象-關(guān)系映射)工具,當(dāng)然目前也有許多其他的ORM工具,比如:MyBtis、JPA。Hibernate屬于全自動(dòng)類型,因此比MyBtis功能強(qiáng)一些(MyBatis只屬于半自動(dòng))。但是全自動(dòng)類型會(huì)有很多不確定而且無(wú)法控制的因素。第四節(jié)Java優(yōu)點(diǎn)Java是解釋執(zhí)行的高級(jí)編程語(yǔ)言,他的特點(diǎn)是平臺(tái)無(wú)關(guān)性、簡(jiǎn)單性、面向?qū)ο蟆⒔研?、多線程、自動(dòng)存管理。平臺(tái)無(wú)關(guān)性是指Java語(yǔ)言平臺(tái)無(wú)關(guān),而Java的虛擬機(jī)卻不是,需要下載對(duì)應(yīng)平臺(tái)JVM虛擬機(jī)的。自動(dòng)存管理的意思是對(duì)臨時(shí)存儲(chǔ)的數(shù)據(jù)自動(dòng)進(jìn)行回收,釋放存。如:引用類型的變量沒(méi)有指向時(shí),被回收;程序執(zhí)行完成后,局部變量被回收。接下來(lái)主要介紹一下Java的優(yōu)點(diǎn)。Java技術(shù)有下列優(yōu)點(diǎn):(1)簡(jiǎn)單:Java語(yǔ)言是面向?qū)ο笳Z(yǔ)言,他只需要少些最基本的概念就能夠很容易的寫出各種情況下的應(yīng)用并且他只需要供應(yīng)基本方式去完成之前已經(jīng)確定的任務(wù)。Java省去了運(yùn)算號(hào)的重新載入以與多重繼承不清楚觀念,而且經(jīng)過(guò)主動(dòng)收取垃圾而極大的簡(jiǎn)單化了軟件工作人員的管理存的工作。此外,Java特別適合在小型機(jī)子上運(yùn)轉(zhuǎn),他的基本注釋器和累的支撐大約只有40kb,如果再加上標(biāo)準(zhǔn)庫(kù)以與線程支撐也就是大約有215kb。(2)面向?qū)ο螅篔ava的設(shè)計(jì)主要是對(duì)象和他的端口,他供應(yīng)了簡(jiǎn)易的機(jī)制與動(dòng)態(tài)的端口模型。由于在對(duì)象當(dāng)中封裝了其變量和相對(duì)的方法,因此完成模塊化與信息的隱蔽;對(duì)于類就有所不同了,類供應(yīng)了一類對(duì)象原來(lái)的模型而且經(jīng)過(guò)繼承機(jī)制,父類提供的方法可以被子類使用,這就完成了代碼的復(fù)用。(3)分布性:Java是一種面向網(wǎng)絡(luò)的語(yǔ)言。經(jīng)過(guò)它供給的類庫(kù)能夠辦理TCP/IP協(xié)議,用戶能夠在網(wǎng)上很方便地訪問(wèn)其他對(duì)象,但需要經(jīng)過(guò)URL地址。(4)魯棒性:Java在編程的過(guò)程中要對(duì)可能出現(xiàn)的問(wèn)題進(jìn)行檢測(cè),認(rèn)真改掉發(fā)生不對(duì)的地方。它提供自動(dòng)垃圾收集來(lái)進(jìn)行存管理,防止程序員在管理存時(shí)容易產(chǎn)生的錯(cuò)誤。(5)安全性:既然要用于到網(wǎng)絡(luò),那么Java必須有可靠的安全性,必需阻止病毒侵入。Java一切部的訪問(wèn)都要經(jīng)過(guò)對(duì)象的實(shí)例化去完成,因此對(duì)于指針是不支持的,這樣就可以組織軟件開發(fā)人員使用一些病毒木馬等手法去訪問(wèn)獨(dú)有的成員,這樣也能夠避免了在指針操作中的容易犯下的錯(cuò)誤。(6)體系結(jié)構(gòu)中立:Java就能夠在任何處理器上運(yùn)行,只需要安裝Java運(yùn)轉(zhuǎn)系統(tǒng)。Java生成的字節(jié)在解釋器得到他之后就會(huì)對(duì)他進(jìn)行轉(zhuǎn)換,這樣就可以讓他在不同的平臺(tái)上運(yùn)轉(zhuǎn)。(7)可移植性:由于Java和平臺(tái)沒(méi)有關(guān)系的特征這樣就可以使Java程序在網(wǎng)絡(luò)上不同的機(jī)子間進(jìn)行移植。與此同時(shí)Java數(shù)據(jù)庫(kù)也能夠與不同的平臺(tái)接口實(shí)現(xiàn)。Java本身也可以移植,因?yàn)镴ava運(yùn)行是系統(tǒng)是由C語(yǔ)言完成的。(8)解釋執(zhí)行:解釋器直接對(duì)字節(jié)碼注解,字節(jié)碼自身攜帶了大量信息這樣就使連接非常的容易。(9)高性能:Java字節(jié)設(shè)計(jì)很簡(jiǎn)單是自己轉(zhuǎn)變成對(duì)應(yīng)特定CPU機(jī)碼,以此得到更高的性能。(10)動(dòng)態(tài)性:Java的設(shè)計(jì)使得它適合于開發(fā)環(huán)境。在庫(kù)中能夠隨意的添加新方法與變量也不會(huì)對(duì)用戶程序?qū)嵭挟a(chǎn)生任何的影響。第五章框架與數(shù)據(jù)庫(kù)連接工具JDBC介紹為了實(shí)現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫(kù)的訪問(wèn),SUN公司推出了JDBC(JavaDatabaseConnectivity,Java數(shù)據(jù)庫(kù)連接),它由一些Java語(yǔ)言編寫的類和界面組成,并且定義了Java語(yǔ)言與各種數(shù)據(jù)庫(kù)之間的編程接口。JDBC為數(shù)據(jù)庫(kù)的應(yīng)用程序前臺(tái)開發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序接口設(shè)計(jì)方法,開發(fā)人員可以通過(guò)使用純粹的Java語(yǔ)言就完成對(duì)數(shù)據(jù)庫(kù)應(yīng)用程序的編寫。只需要通過(guò)JDBCAPI編寫一個(gè)程序就可以輕松的訪問(wèn)Oracle、Informix或者Sybase等各種各樣的不盡一樣的數(shù)據(jù)庫(kù)。在JDK的包“java.sql.*”中定義了一系列的類、接口、異常等,以與與這些類和接口相關(guān)的屬性和方法,而JSP的開發(fā)人員只需要按照固定的規(guī)則來(lái)調(diào)用封包中的API即可,這樣就可以輕易的實(shí)現(xiàn)對(duì)DBMS的訪問(wèn)和操作了。JDBC同樣被分為了3個(gè)主要部分,分別是:連接(Connection);語(yǔ)句(Statement);結(jié)果集(ResultSet);它的工作方式如下圖所示:Servlet或JSP連接池DBMSServlet或JSP連接池DBMS線程1申請(qǐng)連接建立連接線程1申請(qǐng)連接建立連接用戶1request釋放連接用戶1request釋放連接管理鏈接連接池連接池連接池管理鏈接連接池連接池連接池線程2request線程2申請(qǐng)連接線程2request線程2申請(qǐng)連接用戶2釋放連接釋放連接用戶2釋放連接釋放連接圖5-1JDBC工作方式圖連接池連接池連接池連接池連接池連接池連接池連接池第二節(jié)連接池連接池的技術(shù)基本處于這樣:一般對(duì)很多的應(yīng)用程序在處理一般的事務(wù)通常只需要幾毫秒就能完成,這時(shí)僅僅需要訪問(wèn)JDBC的一個(gè)連接線程。當(dāng)沒(méi)有事務(wù)需要處理的時(shí)候連接就會(huì)空閑下來(lái),如果連接池空閑下來(lái)連接就能讓別的線程使用。實(shí)際上當(dāng)線程需要一個(gè)連接的時(shí)候,這時(shí)候就會(huì)從連接池中尋找一個(gè)連接。這個(gè)線程對(duì)于這個(gè)連接使用完成之后就會(huì)把他送回到連接池當(dāng)中,回到連接池的連接就可以被其他的線程使用了。連接池可以極大的改善用戶的Java應(yīng)用程序的性能,同時(shí)減少全部資源的使用。連接池主要的優(yōu)點(diǎn)有:(1)縮減創(chuàng)建的連接時(shí)間:和別的數(shù)據(jù)庫(kù)相比較,雖然JDBC的功能相對(duì)于迅速,可是他要重新創(chuàng)立新的連接方式,這樣就會(huì)加接時(shí)間和開銷。對(duì)于連接可以循環(huán)使用的方法,就可以大大的避免浪費(fèi)時(shí)間和開銷的弊處。(2)編程模式得到簡(jiǎn)化:在使用連接池的時(shí)候,每個(gè)獨(dú)立線程在操作的時(shí)候猶如創(chuàng)立了一個(gè)自身JDBC連接,用戶可以直接使用編程技術(shù)。(3)資源的利用會(huì)受控制:當(dāng)使用者不需要連接池的時(shí)候,而在線程需要一個(gè)連接,那么程序只能為此創(chuàng)建一個(gè)新的連接,使用用戶應(yīng)用資源的時(shí)候就會(huì)產(chǎn)生十分高的浪費(fèi)甚至導(dǎo)致由于過(guò)載而產(chǎn)生異常。我們們可以了解到,JDBC連接不管是在客戶端還是在服務(wù)器都會(huì)產(chǎn)生花費(fèi)。而且每一個(gè)連接都會(huì)對(duì)其程序和服務(wù)器的資源產(chǎn)生一些影響與限制。這些連接無(wú)論是否在做有用功都會(huì)使用資源。而連接池不會(huì)有這些問(wèn)題,他會(huì)將性能的使用最大化,而且他還會(huì)控制資源的利用使之在一定的圍之,假如超過(guò)了這個(gè)圍應(yīng)用程序就不僅是變慢了而是直接崩潰。數(shù)據(jù)庫(kù)連接池的主要操作如下:(1)創(chuàng)建數(shù)據(jù)庫(kù)連接池的對(duì)象。(2)根據(jù)先前指定的參數(shù)創(chuàng)立初始數(shù)目的數(shù)據(jù)庫(kù)連接(即閑置連接數(shù))。(3)如過(guò)有數(shù)據(jù)庫(kù)的訪問(wèn)請(qǐng)求,此時(shí)會(huì)從連接池中找到連接,如果連接池中沒(méi)有閑置連接并且連接并沒(méi)有到達(dá)最大的數(shù)量(也就是所說(shuō)的最大活躍連接數(shù)),此時(shí)就要?jiǎng)?chuàng)立一個(gè)全新的連接了。(4)存取數(shù)據(jù)庫(kù)。(5)關(guān)閉數(shù)據(jù)庫(kù),對(duì)各數(shù)據(jù)庫(kù)的連接釋放(關(guān)閉數(shù)據(jù)庫(kù)連接,這不是真正關(guān)閉,而是放入空閑隊(duì)列。如過(guò)實(shí)際空閑連接數(shù)大于初始空閑連接數(shù)的時(shí),連接就會(huì)被釋放)。(6)在服務(wù)器維護(hù)或者停止的時(shí)段,要釋放數(shù)據(jù)庫(kù)連接池中的對(duì)象以與所有連接。第三節(jié)幾種常見的連接池一、ODBCODBC其實(shí)就是開放式數(shù)據(jù)庫(kù),是由微軟公司提出來(lái)的一種使用SQL應(yīng)用程序接口。用戶能夠增加數(shù)據(jù)庫(kù)驅(qū)動(dòng),將自己的程序連接到自己建立的數(shù)據(jù)庫(kù)系統(tǒng)當(dāng)中,ODBC的優(yōu)勢(shì)其實(shí)就是以統(tǒng)一方式處理全部數(shù)據(jù)庫(kù),而他自己程序與數(shù)據(jù)庫(kù)沒(méi)有關(guān)系。在結(jié)構(gòu)上區(qū)分ODBC分為兩種,單束式和多束式。單束式:?jiǎn)问津?qū)動(dòng)程序類似中介驅(qū)動(dòng)程序數(shù)據(jù)提供統(tǒng)一的一個(gè)數(shù)據(jù)訪問(wèn)方法,并且單束式驅(qū)動(dòng)程序在應(yīng)用程序與數(shù)據(jù)庫(kù)之中[15]。有用戶對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)操作的時(shí)候,應(yīng)用程序會(huì)給ODBC管理器傳遞一個(gè)ODBC的函數(shù)讓其調(diào)用。之后會(huì)讓ODBCAPI進(jìn)行正確的判別是由誰(shuí)來(lái)辦理,由自己直接辦理且返回結(jié)果還是交給驅(qū)動(dòng)程序處理后返回結(jié)果。我們可以看出,單束式驅(qū)動(dòng)程序自身就是數(shù)據(jù)庫(kù)引擎,單束式驅(qū)動(dòng)程序可以直接對(duì)數(shù)據(jù)庫(kù)完成操作,雖然此數(shù)據(jù)庫(kù)可以在網(wǎng)絡(luò)的任意的一個(gè)地方。多束式:多束式驅(qū)動(dòng)程序自身不實(shí)行任何的數(shù)據(jù)操作而是用作網(wǎng)絡(luò)通信協(xié)議的一個(gè)界面的遠(yuǎn)程操作。多束式驅(qū)動(dòng)程序主要負(fù)責(zé)的是在程序與數(shù)據(jù)庫(kù)引擎之間傳達(dá)指令與數(shù)據(jù)。如果應(yīng)用程序?qū)?shù)據(jù)庫(kù)處理提出要求,那么該請(qǐng)求就會(huì)發(fā)給ODBC管理器,當(dāng)ODBC管理器根據(jù)請(qǐng)求當(dāng)場(chǎng)實(shí)現(xiàn),如果不行就會(huì)轉(zhuǎn)給多束式驅(qū)動(dòng)程序,此時(shí)多束式驅(qū)動(dòng)程序會(huì)把請(qǐng)求編譯成數(shù)據(jù)庫(kù)通信借口能夠明白的方式并且把且該請(qǐng)求交給借口去解決。之后接口會(huì)把這個(gè)請(qǐng)求通過(guò)網(wǎng)絡(luò)傳給服務(wù)器數(shù)據(jù)引擎,當(dāng)服務(wù)器解決好這個(gè)請(qǐng)求之后會(huì)把結(jié)果傳給數(shù)據(jù)庫(kù)通信接口,這時(shí)通信接口回把最后的結(jié)果發(fā)給多束式驅(qū)動(dòng)程序,由多束式驅(qū)動(dòng)程序發(fā)給應(yīng)用程序。二、C3P0連接池C3P0是一個(gè)開源的JDBC連接池,當(dāng)前使用它的開源項(xiàng)目有Hibernate,Spring。C3P0與DBCP的區(qū)別:C3P0與DBCP的最大的區(qū)別就是有無(wú)自動(dòng)回收空閑連接的功能,DBCP沒(méi)有此項(xiàng)功能是而C3P0是有的。C3P0與一般的POOL是相似的,要對(duì)數(shù)據(jù)庫(kù)連接池進(jìn)行管理都是要靠阻塞機(jī)制的,如果連接池當(dāng)中沒(méi)有能用的connection則就會(huì)被阻塞,通常是經(jīng)過(guò)wait(),等到連接池中有可用的connection,這時(shí)候就會(huì)經(jīng)過(guò)notify()喚醒[10]。使用C3P0有三種方式:(1)直接初始化與配置ComboPooledDataSourceBean;(2)使用DataSourcesFactory;(3)經(jīng)過(guò)PoolBackedDataSource并設(shè)立ConectionPoolDataSource來(lái)創(chuàng)建。最常用的是第一種。不管用什么方式得到DataSource,C3P0都會(huì)供應(yīng)一個(gè)叫做perties的文件以此去配置此數(shù)據(jù)源。三、TustCP連接池TustCP是對(duì)已有的連接池進(jìn)行研究學(xué)習(xí)的基礎(chǔ)之上,自己所編寫的一個(gè)簡(jiǎn)單的連接池。具體代碼如下:.tust.ConnectionPool;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.util.LinkedList;//定義公開類TustCPpublicclassTustCP{//定義MySQL數(shù)據(jù)庫(kù)urlprivatestaticStringurl="jdbc:mysql://:3306/lml";//數(shù)據(jù)庫(kù)IDprivatestaticStringusername="root";//數(shù)據(jù)庫(kù)密碼privatestaticStringpassword="10112106";//建立一個(gè)新的雙向循環(huán)鏈表privatestaticLinkedListTustDataSource=newLinkedList(); privatestaticintmaxconnection=20; static{ try{//加載MySQL數(shù)據(jù)庫(kù)的驅(qū)動(dòng)類Class.forName(".mysql.jdbc.Driver"); }catch(ClassNotFoundExceptione1){ //TODOAuto-generatedcatchblock e1.printStackTrace(); } for(inti=0;i<maxconnection;i++){ try{//建立與遠(yuǎn)程數(shù)據(jù)庫(kù)的連接Connectionconn=DriverManager.getConnection(url,username,password); TustDataSource.addLast(conn);//如果驅(qū)動(dòng)類加載失敗,將捕獲異常 }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }//把鏈表中的第一個(gè)節(jié)點(diǎn)移動(dòng)到鏈表結(jié)尾publicstaticConnectiongetConnection(){ return (Connection)TustDataSource.removeFirst(); } publicstaticvoidputConnection(Connectionconn){ TustDataSource.addLast(conn); }}第六章建立數(shù)據(jù)庫(kù)本文是對(duì)基于反射機(jī)制框架進(jìn)行研究,所以數(shù)據(jù)庫(kù)在本文中只起到一個(gè)檢驗(yàn)框架正確性的作用。因此在本文只需要建立一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)。第一節(jié)數(shù)據(jù)庫(kù)表的結(jié)構(gòu)數(shù)據(jù)庫(kù)表的結(jié)構(gòu)如下圖:一個(gè)“學(xué)生”表student表6-1學(xué)生信息表字段類型長(zhǎng)度備注Snochar9學(xué)號(hào)Snamechar20Ssexchar2性別Sagesmallint年齡Sdeptchar20所在系第二節(jié)創(chuàng)建數(shù)據(jù)庫(kù)部分代碼與結(jié)果一、創(chuàng)建數(shù)據(jù)庫(kù)代碼部分:createdatabaselml;showdatabases;結(jié)果如圖:圖6-1已創(chuàng)建lml數(shù)據(jù)庫(kù)代碼部分:uselml;Createtablestudent(Snochar(9)primarykey,/*Sno是主碼*/Snamechar(20)unique,/*Sname取唯一值*/Ssexchar(2),Sagesmallint,Sdeptchar(20));結(jié)果如圖:圖6-2創(chuàng)建表數(shù)據(jù)輸入之后“學(xué)生”表student創(chuàng)建成功如圖:圖6-3學(xué)生表student第七章基于反射機(jī)制框架的設(shè)計(jì)與實(shí)現(xiàn)Spring中AOP就是基于反射機(jī)制來(lái)實(shí)現(xiàn)的,在這里我們舉個(gè)例子來(lái)說(shuō)明一下AOP其中的一個(gè)功能。假如有一個(gè)日志的請(qǐng)求,利用AOP我們就可以不用修改程序中任何的代碼,就能夠?qū)⑦@個(gè)請(qǐng)求加到原來(lái)的程序當(dāng)中,當(dāng)然如果你想把這個(gè)日志刪除掉也同樣不用修改任何的程序。這個(gè)AOP功能是對(duì)反射機(jī)制的完美應(yīng)用。在本文中我根據(jù)反射機(jī)制,參考AOP框架實(shí)現(xiàn)一個(gè)輕量級(jí)的框架。第一節(jié)框架的總體設(shè)計(jì)圖7-1反射機(jī)制框架包結(jié)構(gòu)反射機(jī)制框架使用MyEclipse10開發(fā)完成,如圖7-1所示,反射機(jī)制框架一共分為2個(gè)包。在.tust.Call這個(gè)包中,Advice.java與Tustcpcallinterface.java是程序中兩個(gè)接口,而MyAdvice.java與Tustcpcall.java分別是對(duì)Advice.java與Tustcpcallinterface.java這兩個(gè)接口的實(shí)現(xiàn)方法。第二節(jié)具體代碼介紹一般來(lái)說(shuō)Adcive這個(gè)接口有四個(gè)方法,在異常里面執(zhí)行的方法、在方法之前執(zhí)行的方法、在方法之后執(zhí)行的方法以與在方法前后執(zhí)行的方法。這里我只給出在方法之前和在方法之后執(zhí)行的兩種方法。代碼下:.tust.Call;importjava.lang.reflect.Method;publicinterfaceAdvice{ voidbeforeMethod(Methodmethod); voidafterMethod(Methodmethod);}MyAdvice.java對(duì)Advice.java接口的實(shí)現(xiàn)代碼如下:.tust.Call;importjava.lang.reflect.Method;publicclassMyAdviceimplementsAdvice{ longbeginTime=0; publicvoidafterMethod(Methodmethod){ //TODOAuto-generatedmethodstubSystem.out.println("TUSTCP連接完成!"); longendTime=System.currentTimeMillis(); System.out.println(method.getName()+"runningtimeof"+(endTime-beginTime)); } publicvoidbeforeMethod(Methodmethod){ //TODOAuto-generatedmethodstub System.out.println("TUSTCP連接開始!"); beginTime=System.currentTimeMillis(); }}這個(gè)代碼的功能是計(jì)算TustCP連接池在連接數(shù)據(jù)庫(kù)時(shí)所需要的時(shí)間。Tustcpcall.java是對(duì)Tustcpcallinterface.java這個(gè)接口的實(shí)現(xiàn)。代碼的功能就是返回到TustCP類代碼如下:.tust.Call;importjava.sql.Connection;.tust.ConnectionPool.TustCP;publicclassTustcpcallclassimplementsTustcpcallinterface{ publicConnectiongetConnection(){ returnTustCP.getConnection(); }}現(xiàn)在我們寫一個(gè)方法用到上面的兩個(gè)功能。在這個(gè)方法中與運(yùn)用上面兩種方法就是通過(guò)共同的借口來(lái)實(shí)現(xiàn)的。代碼如下:privateTustcpcallinterfacecurrentgetConnection(){ finalTustcpcallclasstarget=newTustcpcallclass(); finalAdviceadvice=newMyAdvice();Objectproxy3=Proxy.newProxyInstance(//新創(chuàng)建一個(gè)實(shí)例;target.getClass().getClassLoader(),//類加裁器/*newClass[]{Collection.class},*/target.getClass().getInterfaces(),//要實(shí)現(xiàn)的接口;newInvocationHandler(){publicObjectinvoke(Objectproxy,Methodmethod,Object[]args) throwsThrowable{ /*longbeginTime=System.currentTimeMillis(); ObjectretVal=method.invoke(target,args); longendTime=System.currentTimeMillis(); System.out.println(method.getName()+"runningtimeof"+(endTime-beginTime)); returnretVal;*/ advice.beforeMethod(method);//執(zhí)行它的beforeMethod方法;ObjectretVal=method.invoke(target,args);//調(diào)用方法;advice.afterMethod(method);//執(zhí)行它的afterMethod方法;returnretVal; }上述的這個(gè)方法就是利用了反射的機(jī)制的原理,這個(gè)方法可以封裝起來(lái),里面的容任何時(shí)候都不用修改,如果實(shí)現(xiàn)的方法有所改變或者想使用一個(gè)新的連接池(在本文中指TustCP連接池)的時(shí)候只需要修改MyAdvice.java與Tustcpcall.java里面的程序即可。這就是反射機(jī)制的優(yōu)勢(shì),可以在方法之外修改所要實(shí)現(xiàn)的方法,而一般的方法沒(méi)有這個(gè)功能。第三節(jié)代碼測(cè)試現(xiàn)在我們測(cè)試上述代碼的是否可行,在本文中對(duì)自己所寫的反射機(jī)制框架進(jìn)行了擴(kuò)展,設(shè)計(jì)出完成的java文件ConnectionGetandClose.Java。這個(gè)設(shè)計(jì)的功能是用來(lái)選擇哪種連接方式對(duì)客戶端和數(shù)據(jù)庫(kù)進(jìn)行連接。程序中給出了3中連接方式,JDBC、C3P0、和TustCP。如果選擇TustCP就可以對(duì)我們所設(shè)計(jì)的方法進(jìn)行檢驗(yàn)。代碼如下:.tust.ConnectionPool;importjava.beans.PropertyVetoException;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;importjava.sql.Connection;importjava.sql.DriverManager;importjavax.servlet..ServletRequest;importjavax.servlet..Session;importorg.apache.struts2.ServletActionContext;.tust.Call.Advice;.tust.Call.MyAdvice;.tust.Call.Tustcpcallclass;.tust.Call.Tustcpcallinterface;import.mchange.v2.c3p0boPooledDataSource;publicclassConnectionGetandClose{ privatestaticServletRequestrequest; privatestaticSessionsession; privateStringselectedconnection; privatestaticComboPooledDataSourceC3P0datasource=newComboPooledDataSource(); static{ request=ServletActionContext.getRequest(); session=request.getSession(); C3P0datasource.setJdbcUrl("jdbc:mysql://:3306/lml"); C3P0datasource.setUser("root"); C3P0datasource.setPassword("10112106"); try{ C3P0datasource.setDriverClass(".mysql.jdbc.Driver"); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } publicConnectiongetConnection()throwsException{ Class.forName(".mysql.jdbc.Driver"); selectedconnection=(String)session.getAttribute("selectedconnection"); if("JDBC".equals(selectedconnection)){ Class.forName(".mysql.jdbc.Driver"); returnDriverManager.getConnection("jdbc:mysql://:3306/lml","root","10112106");} elseif("C3P0".equals(selectedconnection)){ returnC3P0datasource.getConnection(); } elseif("TUSTCP".equals(selectedconnection)){ //returnTustCP.getConnection(); returncurrentgetConnection().getConnection(); } else thrownewException("無(wú)此連接"); } privateTustcpcallinterfacecurrentgetConnection(){ finalTustcpcallclasstarget=newTustcpcallclass(); finalAdviceadvice=newMyAdvice(); Objectproxy3=Proxy.newProxyInstance(//新創(chuàng)建一個(gè)實(shí)例; target.getClass().getClassLoader(),//類加裁器 /*newClass[]{Collection.class},*/ target.getClass().getInterfaces(),//要實(shí)現(xiàn)的接口; newInvocationHandler(){ publicObjectinvoke(Objectproxy,Methodmethod,Object[]args) throwsThrowable{ /*longbeginTime=System.currentTimeMillis(); ObjectretVal=method.invoke(target,args); longendTime=System.currentTimeMillis(); System.out.println(method.getName()+"runningtimeof"+(endTime-beginTime)); returnretVal;*/ advice.beforeMethod(method);//執(zhí)行它的beforeMethod方法; ObjectretVal=method.invoke(target,args);//調(diào)用方法; advice.afterMethod(method);//執(zhí)行它的afterMethod方法; returnretVal; } } ); return(Tustcpcallinterface)proxy3; } publicvoidcloseConnection(Connectionconn)throwsException{ selectedconnection=(String)session.getAttribute("selectedconnection"); if("JDBC".equals(selectedconnection)) conn.close(); elseif("C3P0".equals(selectedconnection)){ conn.close(); } elseif("TUSTCP".equals(selectedconnection)){ TustCP.putConnection(conn); } else thrownewException("無(wú)此連接"); }}ConnectionName.java文件是對(duì)連接數(shù)據(jù)庫(kù)成功之后數(shù)據(jù)庫(kù)容的顯示。Selectedconnection即表示選擇的方式。具體代碼如下:.tust.ConnectionPool;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;importjavax.servlet..ServletRequest;importjavax.servlet..Session;importorg.apache.struts2.ServletActionContext;publicclassConnectionName{ privateStringselectedconnection; privatestaticServletRequestrequest; privatestaticSessionsession; privatestaticConnectionGetandCloseconnectionutil=newConnectionGetandClose(); publicStringgetSelectedconnection(){ returnselectedconnection; } publicvoidsetSelectedconnection(Stringselectedconnection){ this.selectedconnection=selectedconnection; } publicStringfind_name()throwsException{ System.out.println(selectedconnection); request=ServletActionContext.getRequest(); session=request.getSession(); session.setAttribute("selectedconnection",selectedconnection); Connectionconn=connectionutil.getConnection(); Statementst=conn.createStatement(); ResultSetrs=st.executeQuery("select*fromstudent"); System.out.println("開始輸出數(shù)據(jù)"); while(rs.next()){ System.out.println(rs.getObject(1)+"\t"+rs.getObject(2)+"\t"+rs.getObject(3)+"\t"); } System.out.println("數(shù)據(jù)輸出完成"); rs.close(); st.close(); connectionutil.closeConnection(conn); return"success"; }}Web.xml文件是對(duì)下面jsp文件轉(zhuǎn)換成struts2,具體代碼如下:<?xmlversion="1.0"encoding="UTF-8"?><web-app> <filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>struts.xml文件為當(dāng)網(wǎng)頁(yè)登錄之后所需要顯示的頁(yè)面容,本程序就是執(zhí)行Index.jsp文件。具體代碼如下:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC "-//ApacheSoftwareFoundation//DTDStruts
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 八年級(jí)歷史人教版下冊(cè)聽課評(píng)課記錄:第5課 三大改造
- 林地長(zhǎng)期承包合同范本
- 鄉(xiāng)鎮(zhèn)精裝修商鋪出租合同范本
- 儲(chǔ)存場(chǎng)地租賃合同范本
- 廣告公司材料采購(gòu)合同范本
- 二零二五年度無(wú)子女離婚協(xié)議書及子女教育資助合同
- 二零二五年度酒店會(huì)議室場(chǎng)地租賃及配套交通合同
- 二零二五年度酒吧租賃合同合同簽訂后的租賃物維護(hù)責(zé)任
- 2025年度商鋪轉(zhuǎn)讓三方合同附品牌使用權(quán)及營(yíng)銷支持
- 夏令營(yíng)代理商合作協(xié)議書范本
- 三星SHP-DP728指紋鎖說(shuō)明書
- 預(yù)應(yīng)力錨索張拉及封錨
- 烤煙生產(chǎn)沿革
- GB 1886.227-2016食品安全國(guó)家標(biāo)準(zhǔn)食品添加劑嗎啉脂肪酸鹽果蠟
- 毛澤東思想課件-第七章 毛澤東思想的活的靈魂
- 公共關(guān)系效果的評(píng)估課件
- 建筑施工安全員理論考核試題與答案
- 高速公路用地勘測(cè)定界及放線定樁技術(shù)標(biāo)書
- 華萊士標(biāo)準(zhǔn)化體系
- 快捷smt全自動(dòng)物料倉(cāng)儲(chǔ)方案
- keysight眼圖和抖動(dòng)噪聲基礎(chǔ)知識(shí)與測(cè)量方法
評(píng)論
0/150
提交評(píng)論