




已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
外文原文CHAPTER2ARCHITECTUREINTHEORYTHEREISNODIFFERENCEBETWEENTHEORYANDPRACTICEBUT,INPRACTICE,THEREISJANLAVANDESNEPSCHEUTARCHITECTUREITSTHATLEVELABOVEDESIGNWHEREWEGETOURFIRSTGLIMPSEOFWHATTHESYSTEMWILLULTIMATELYRESEMBLE,HOWITWILLBEBUILT,THEVISIONOFTHEAPPLICATIONANDSYSTEMASAWHOLEBYKEEPINGTHEADVICECONTAINEDINTHEITEMSTHATFOLLOWINMINDWHENLAYINGOUTTHEBASICFLOWANDDESIGNOFYOURENTERPRISEAPPLICATIONSANDSYSTEMS,YOULLMAKEPROGRESSTOWARDANOBLEGOALESTABLISHINGANARCHITECTURETHATENABLESAHIGHPERFORMANCE,HIGHSCALABILITYENTERPRISESYSTEMITEM1PREFERCOMPONENTSASTHEKEYELEMENTOFDEVELOPMENT,DEPLOYMENT,ANDREUSEONEOFTHEDIFFICULTIESMANYJAVADEVELOPERSFACEWHENATTEMPTINGTHEIRFIRSTJ2EEBASEDPROJECTISTHATJ2EEAPPLICATIONSAREBUILTDIFFERENTLYTHANTRADITIONALJAVAAPPLICATIONSRATHERTHANBUILDINGAPPLICATIONS,J2EEMANDATESTHECONSTRUCTIONOFCOMPONENTSTHATPLUGINTOANALREADYEXISTINGAPPLICATION,THATBEINGTHEJ2EECONTAINERITSELFTHISMAYNOTSEEMLIKEALARGEDIFFERENCEATFIRST,BUTITSIMPLICATIONSAREHUGE,INTWODIFFERENTDIRECTIONSFIRSTOFALL,THISMEANSTHATDEVELOPERSARENTREALLYINTERESTEDINCONSTRUCTINGOBJECTSPERSEBUTINCREATINGSTRONGLYENCAPSULATEDCOMPONENTSTHATINTHECASEOFJ2EEAREMADEUPOFTIGHTLYCOUPLEDCONSTITUENTOBJECTSSECOND,ITMEANSTHATTHEREAREASETOFSTRINGENTRULESTHATMUSTBEOBEYEDOVERWHICHWE,ASTHECOMPONENTBUILDER,HAVELITTLETONOINFLUENCEDEVELOPERSSTUDYINGTHEOBJECTORIENTEDPARADIGMHAVE,SINCETHEVERYEARLYDAYS,BEENREPEATEDLYTAUGHTTOPROMOTEENCAPSULATIONANDDATAHIDINGWEVEALLMEMORIZEDNUGGETSOFWISDOMHANDEDDOWNFROMONHIGH,SUCHAS“NEVERUSEPUBLICFIELDSINSTEADALWAYSCREATEACCESSORANDMUTATORMETHODSGETTERSANDSETTERS,INJAVABEANSLINGO,“FOREXAMPLE,OR“HIDEYOURIMPLEMENTATIONFROMCLIENTVIEW,“ANDSOONASARESULT,FOREVERYCLASSEVERWRITTEN,WEFAITHFULLYCREATEGET/SETMETHODPAIRSFOREVERYPRIVATEDATAFIELD,CREATEADEFAULTCONSTRUCTOR,ANDSOONUNFORTUNATELY,THISISHARDLYWHATTHEORIGINALPROPONENTSOFOBJECTORIENTATIONHADINMINDMERELYFORCINGCLIENTSTOGOTHROUGHAGETMETHODTOGETAREFERENCETOSOMEINTERNALLYHELDDATASTRUCTUREDOESNTCREATEENCAPSULATIONTHISHASLONGBEENDOCUMENTEDINSUCHBOOKSASEFFECTIVECMEYERS95AND,MORERECENTLY,EFFECTIVEJAVABLOCH,ITEM24MOREIMPORTANTLY,ITUNFORTUNATELYLEADSDEVELOPERSTOTHINKATASCALETOOSMALLFOREFFECTIVEREUSE,THATOFOBJECTSANDCLASSES,RATHERTHANTHINKINGATALARGERSCALE,SUCHASWHATWASORIGINALLYINTENDEDBYTHEJAVABEANSSPECIFICATIONNOTCONVINCEDCONSIDERATRADITIONALCOLLECTIONCLASS,SAY,ANARRAYLISTWECANUSETHEARRAYLISTASANINDEPENDENTOBJECT,BUTWHENITCOMESTIMETOWALKOVERTHECONTENTSOFTHECOLLECTIONITSELF,ANOTHEROBJECT,ANITERATORIMPLEMENTINGOBJECT,BECOMESDESIRABLE,IFNOTOUTRIGHTNECESSARYTHINKINGABOUTREUSEATTHECLASS/OBJECTLEVELMEANSWESERIOUSLYCONSIDERREUSINGTHEITERATORIMPLEMENTINGCLASSINDEPENDENTLYOFTHEARRAYLISTITSBOUNDTO,WHICHMAKESNOSENSEINSTEAD,BECAUSETHETWOAREINTENDEDTOBEUSEDASAPAIR,ITMEANSTHATWERELOOKINGATREUSEATAHIGHERLEVEL,WHATWEREFERTOASACOMPONENTINPRACTICALTERMS,THISUSUALLYMEANSASTANDALONEJARFILETHATCONTAINS,INTHISCASE,THEPAIROFCLASSESFORARRAYLISTANDITSINTERNALITERATORSUBTYPEINTHECOLLECTIONSCASE,ITWOULDALSOINCLUDERELEVANTINTERFACESLIKEITERATOR,COLLECTION,ANDLISTBECAUSETHEYALLHELPDEFINETHECONTRACTCLIENTSCANPLACEFAITHINTHISGETSUSINTOADISCUSSIONOFCOUPLINGTHEDEFINITIONOFTIGHTCOUPLINGSTATESTHATAGIVEN“THING“ISTIGHTLYCOUPLEDTOANOTHER“THING“IFONEHASTOCHANGEINRESPONSETOCHANGESINTHEOTHERINOTHERWORDS,CONSIDERARRAYLISTIFICHANGETHEDEFINITIONOFTHECOLLECTIONINTERFACE,WILLARRAYLISTNEEDTOCHANGEABSOLUTELY,SINCEITIMPLEMENTSCOLLECTIONTHROUGHLISTIFICHANGEARRAYLISTSINTERNALIMPLEMENTATION,WILLITSINTERNALITERATORIMPLEMENTATIONNEEDTOCHANGEABSOLUTELYHOWEVER,WILLCLIENTSNEEDTOCHANGENOTSOLONGASTHEYTREATTHEITERATORASAGENERALPURPOSEITERATORANDDONTDOWNCASTARRAYLISTISTIGHTLYCOUPLEDTOITSINTERNALITERATOR,ANDVICEVERSA,BUTCLIENTSCANREMAINLOOSELYCOUPLEDBYSTICKINGTOTHEINTERFACESLOOSECOUPLINGISEXPLAINEDINGREATERDETAILINITEM2,BUTINEEDTOFORWARDREFERENCEITHEREDONTSEETHERELEVANCERUNONOVERTOTHESERVLETBASEDWEBAPPLICATIONSIFWEOBEYTHETRADITIONALMODELVIEWCONTROLLERABSTRACTION,1THENWEREBUILDINGAMINIMUMOFTWOCLASSESTHATAREMOREORLESSTIGHTLYCOUPLEDTOONEANOTHERTHECONTROLLERSERVLETTHATDOESTHEINPUTPROCESSINGONANINCOMINGHTTPREQUEST,ANDTHEVIEWJSPTHATITFORWARDSTOTHECONTROLLERNEEDSTOKNOWWHATDATAELEMENTSTHEVIEWDEPENDSON,THEVIEWNEEDSTOKNOWWHATPROCESSINGHASALREADYBEENDONEBYTHECONTROLLERSOASNOTTODUPLICATETHATWORK,ANDTHETWOHAVETOAGREEONTHENAMESUNDERWHICHTHEDATAELEMENTSTHEVIEWDEPENDSONWILLBEBOUNDTHENAMEVALUEATTRIBUTESOFHTTPSESSIONPROVIDELATEBINDINGBUTNOTLOOSECOUPLINGAGAIN,SEEITEM2FORMOREINADDITION,BOTHCONTROLLERANDVIEWARETHEMSELVESTIGHTLYCOUPLEDAGAINSTTHEMODELCLASSES,SINCETHEYWILLNEEDTOKNOWWHATDATAELEMENTSAREPRESENTASPARTOFTHEMODELSUSEDASKYOURSELFTHESEQUESTIONSISITREALLYFEASIBLETOCONSIDERREUSINGTHECONTROLLERWITHOUTTHECORRESPONDINGVIEWAND/ORMODELCLASSESCOULDTHEVIEWEXECUTESUCCESSFULLYWITHOUTGOINGTHROUGHTHECONTROLLERSERVLETFIRST1THISISACTUALLYAMISNOMERTHEAPPROPRIATEPATTERNINQUESTIONISREALLYTHEPRESENTATIONABSTRACTIONCONTROLLERPOSA1,145,SINCETHEMODELVIEWCONTROLLERDEALSWITHMULTIPLEVIEWSANDTHEIRUPDATESIMULTANEOUSLY,SUCHASISCOMMONLYFOUNDINAGUIAPPLICATIONLIKEEXCELORWORDBECAUSETHEANSWERTOTHISQUESTIONISALMOSTUNIVERSALLY“NO,“ITMEANSTHATYOURCLASSESWITHINAGIVENCOMPONENT,INTHISCASEYOURPRESENTATIONLAYERCOMPONENT,AREIMPLICITLYTIGHTLYCOUPLEDTOONEANOTHERTHATINTURNYIELDSAREALIZATIONWHERETIGHTCOUPLINGALREADYEXISTS,WECANENJOYACERTAINAMOUNTOFRELAXATIONOFTHETRADITIONAL“ENCAPSULATEEVERYTHING“RULETHATWEOBEYSOMINDLESSLYIMNOTSUGGESTINGTHATYOUIMMEDIATELYRUNOUTANDREMOVEALLYOURGET/SETMETHODSINFAVOROFDIRECTFIELDACCESS,BUTIRECOMMENDTHATYOUTHINKLONGANDHARDABOUTWHATYOUREREALLYPROTECTINGAGAINSTFOREXAMPLE,IFYOURMODELOBJECTSARENTUSEDOUTSIDEOFTHEPRESENTATIONLAYERNOTETHETERMINOLOGYSEEITEM3ITSELF,DOESITREALLYMAKESENSETOPUTGET/SETMETHODSINFRONTOFEACHFIELD,PARTICULARLYWHERETHEMODELOBJECTSAREJUSTTHINWRAPPERSOVERACOLLECTIONOFDATA,ASWITHDATATRANSFEROBJECTSFOWLER,401REMEMBERTHATENCAPSULATIONWASDESIGNEDTOPROTECTCLIENTSAGAINSTIMPLEMENTATIONCHANGES,NOTTHECOMPONENTAGAINSTCHANGESWITHINITSELFFEWDEVELOPERSEVERSAWBENEFITSINTRYINGTOENCAPSULATEACLASSAGAINSTITSELFTHINKOFTHECOMPONENTASALARGER,MORECOARSEGRAINEDCLASS,ANDYOURENOTTOOFAROFFTHEMARKGIVENTHATWEHAVECLASSESTHATTIGHTLYCOOPERATEWITHONEANOTHERTOACHIEVESOMEUSEFULWORK,ANDTHATTHOSECLASSESNEEDTOBEDEPLOYEDTOGETHERATOMICALLYORELSENOTATALL,WERELOOKINGFORSOMETHING“LARGERTHANOBJECTS“ASTHEPRINCIPALUNITOFDEPLOYMENTINOTHERWORDS,WERELOOKINGFORCOMPONENTSTHESERVLETSPECIFICATIONHASMOVEDAWAYFROMTHEIDEAOFSTANDALONESERVLETSBEINGDEPLOYEDINDIVIDUALLYINTOTHESERVLETCONTAINERANDINSTEADEMBRACESTHEIDEAOFAWEBAPPLICATION,ACOLLECTIONOFRESOURCESLIKESERVLETS,JSPS,MODELCLASSES,UTILITYLIBRARIES,ANDSTATICRESOURCESLIKEHTML,IMAGES,AUDIOFILES,ANDSOONTHATCOLLECTIVELYWORKTOGETHERTOPROVIDEDESIREDFUNCTIONALITYTHEWEBAPPLICATIONISDEPLOYEDCOLLECTIVELYUNDERASINGLEWARFILE,SOTHATTHEREISNOPOSSIBLEWAYFORAONLYPARTOFTHEAPPLICATIONTOBEDEPLOYED,ORBTHEAPPLICATIONTOBEVERSIONMISMATCHEDBETWEENITSCOLLECTIVEPARTSINESSENCE,THEWARFILESERVESTHESAMEPURPOSETHATTHEJAVAJARFILEDIDINMAKINGJAVAAPPLICATIONDEPLOYMENTSEASIERIFYOUDIDJAVAINTHE10DAYS,YOULLREMEMBERTHE“UNZIPTHECLASSESONTOYOURCLASSPATH“STYLEOFDEPLOYMENTANDAGREETHATTRYINGTODEPLOYJAVAAPPLICATIONSINTHOSEDAYSWASLESSTHANELEGANTINSTEAD,THEATOMICDEPLOYMENTPROVIDEDBYTHEWARFILEMEANSTHATONLYTHOSERESOURCESTHATARESUPPOSEDTOBEPARTOFTHEWEBAPPLICATIONACTUALLYSHOWUPINTHEDEPLOYEDAPPLICATIONTHATIS,UNLESSYOUDELIBERATELYSCREWTHATUPBYDOINGPARTIALFILEBASEDDEPLOYMENTSBYCOPYINGINDIVIDUALFILESOVERINTOTHEDEPLOYEDAPPLICATIONDIRECTORYTHERESACOUPLEOFREASONSWHYTHISISABADIDEA,NOTTHELEASTOFWHICHISTHEPOSSIBILITYOFINTRODUCINGVERSIONMISMATCHESWHILEITMAYSEEMTEMPTINGTO“ONLYCOPYTHESTUFFTHATCHANGED“INTOTHEDEPLOYMENTDIRECTORY,ITSTOOEASYFORHUMANSTOLOSETRACKOFEXACTLYWHATHASCHANGEDAND,MOREIMPORTANTLY,TOFORGETTHATTHESERVLETCONTAINERDOESNTNECESSARILYTAKETHESAMEVIEWOFWHATHASCHANGEDASWEDOENTERTHECLASSLOADERREMEMBERHIMHESESTABLISHEDBYTHESERVLETCONTAINERTOLOADYOURWEBAPPLICATIONFROMDISKINTOTHEJVMTHESERVLETCONTAINERISREQUIREDTOSTARTANEWCLASSLOADEREACHTIMETHEWEBAPPLICATION“CHANGES,“WHICHUSUALLYMEANS“CHANGESONDISKINTHEDEPLOYMENTDIRECTORY“BUTIFYOUREADTHESERVLETSPECIFICATIONCAREFULLY,YOULLNOTICETHATWHENANEWCLASSLOADERISSTARTED,ITSESTABLISHEDOVERTHEENTIREWEBAPPLICATION,NOTANINDIVIDUALSERVLETITDOESTHISSOTHATEACHOFTHOSECLASSESTHATFORMTHEWEBAPPLICATIONAREALLLOADEDBYTHESAMECLASSLOADER,SINCETHECONTAINERSEESTHESEASASINGLECOMPONENTSOITSENTIRELYCONCEIVABLETHATEACHFILECOPIEDINTOTHEDEPLOYMENTDIRECTORYWILLYIELDANEWCLASSLOADERINSTANCE,CREATINGAWHOLETONOFEXTRAWORKFORTHECONTAINERANDYIELDINGNOTANGIBLEBENEFITBYTHEWAY,MAKESUREYOUUNDERSTANDWHATTANGIBLEEFFECTSTHISCLASSLOADINGPOLICYWILLYIELDTOYOUDIRECTLYBYREADINGITEM70THEPOINTOFALLTHISISTHATTHESERVLETANDOTHERJ2EESPECIFICATIONSEXPECTYOUTOBUILDWEBAPPLICATIONSTHATCOMBINETOFORMCOMPONENTS,NOTINDIVIDUALCLASSESTHEJSPSPECIFICATIONGOESONESTEPFURTHERITPROMOTESTHECONSTRUCTIONANDUSEOFSMALLERCOMPONENTSWITHINANDACROSSWEBAPPLICATIONSBYFOSTERINGTHECONCEPTOFREUSABLETAGLIBRARIESTHESPECIFICATIONSCOULDCARELESSWHATOBJECTSYOUCREATEANDUSE,SOLONGASTHOSEOBJECTSTHATAREHANDEDBACKTOTHECONTAINERITSELFOBEYCERTAINCONTRACTS,ASCONVEYEDVIAINTERFACES,ANDCERTAINOUTOFBANDRESTRICTIONSDESCRIBEDINTHESPECIFICATIONITSELFITSMORETHANJUSTIMPLEMENTINGEXISTINGINTERFACES,HOWEVERPARTOFBEINGACOMPONENTMEANSTHATBECAUSEYOUDIDNTWRITEMAIN,YOUDONTNECESSARILYKNOWTHEENVIRONMENTINWHICHYOURCODEISBEINGEXECUTEDONECLASSICMISTAKETHATBITESSERVLETDEVELOPERSTHEWORLDOVERASTHEYMOVEFROMONESERVLETCONTAINERTOTHENEXTISTHESIMPLEASSUMPTIONREGARDING“THECURRENTDIRECTORY“FORSOMESERVLETCONTAINERS,ITSTHEDIRECTORYINWHICHTHECONTAINERSEXECUTABLEFILESARELOCATEDTOMCAT/BIN,FOREXAMPLEFOROTHERCONTAINERS,HOWEVER,THEYSETA“WORK“DIRECTORYINWHICHBITSANDPIECESOFTHEWEBAPPLICATIONAREASSEMBLEDANDCALLEDTHENETRESULTISTHATIFYOUTRYTOLOADATEXTFILEFROMYOURWEBAPPLICATIONSDEPLOYMENTDIRECTORYBYCREATINGAFILEINPUTSTREAMWITHANARGUMENTOF/WEBAPPS/MYAPP/DATAXML,WHATWORKSONONESYSTEMWILLHORRIBLYBREAKONANOTHERFORTHISREASON,THESERVLETSPECIFICATIONSUGGESTSUSINGEITHERTHESERVLETCONTEXTGETRESOURCEORSERVLETCONTEXTGETRESOURCEASSTREAMMETHODS,BOTHOFWHICHAREALSOAVAILABLEONTHECLASSLOADERFORTHEWEBAPPLICATIONINFACT,THISCONCEPTOF“CONTEXT“TAKESONANIMPORTANTMEANINGINCOMPONENTBASEDENVIRONMENTSTHECONTEXT,SUCHASTHESERVLETCONTEXTINSERVLETAPPLICATIONS,ORTHEENTERPRISEBEANCONTEXTSESSIONCONTEXT,ENTITYCONTEXT,ORMESSAGEDRIVENCONTEXTINEJB,ISTHECOMPONENTSOFFICIAL“WINDOWTOTHEOUTSIDEWORLD,“ANDANYANDALLACCESSTOTHATOUTSIDEWORLDSHOULDTAKEPLACETHROUGHTHECONTEXTTHISGIVESTHECONTAINERTHEOPPORTUNITYTOINTERCEPTANDREDIRECTAPPLICATIONREQUESTSTOTHEAPPROPRIATEPLACE,IFTHECONTAINERISDOINGSOMETHINGTRICKYUNDERTHEHOODHIDDENFROMTHECODESVIEWFOREXAMPLE,WHENYOUWANTTODOAFORWARDFROMASERVLETTOAJSP,YOUAREREQUIREDTOGOTHROUGHTHESERVLETCONTEXTTOGETAREQUESTDISPATCHERTODOTHEACTUALFORWARDBECAUSEACLUSTERINGCONTAINERMAYHAVEDECIDEDTOPUTTHEJSPPAGEONADIFFERENTMACHINETHANTHEONEEXECUTINGTHESERVLETASARESULT,IFYOUWERETODIRECTLYTRYTOACCESSTHESERVLETINSTANCEINSIDETHEJVM,SUCHASWEUSEDTOVIATHEGETSERVLETCALL,THEREQUESTWOULDFAILMISERABLYINSOMERESPECTS,THISISALSOWHYTHEJAVANAMINGANDDIRECTORYINTERFACEJNDIWASINVENTEDTOPROVIDEACOMMONAPIFORLOOKINGUPRESOURCESRATHERTHANHAVINGTOUSEPERSPECIFICATIONAPISSUCHASTHATPROVIDEDBYTHERMINAMINGCLASSITSNOACCIDENTTHATTHEJNDISTARTINGPOINTISCALLEDANINITIALCONTEXTASMAYNOWBEAPPARENTTOYOU,WRITINGCOMPONENTSISDIFFERENTFROMWHATYOUMAYHAVEEXPECTEDFROMAPPLICATIONDEVELOPMENTINFACT,WHENWRITINGCOMPONENTSYOURENOTDOINGAPPLICATIONDEVELOPMENTATALLYOUREWRITINGLIBRARIESTHATAREBEINGCALLEDBYANEXISTINGAPPLICATIONPARTOFBEINGACOMPONENTINSTEADOFANAPPLICATIONISTHATYOURCODEMUSTTAKEONTHESAMEKINDSOFCHARACTERISTICSTHATMAKEWRITINGLIBRARIESAGAIN,ASOPPOSEDTOAPPLICATIONSSOMUCHFUNFOREXAMPLE,INORDERTOBESTPROMOTEINDIVIDUALCOMPONENTFLEXIBILITY,ITSUSUALLYBETTERTODEFINETYPESEXPOSEDTOTHELIBRARYCLIENTINTERMSOFINTERFACES,RATHERTHANACTUALCONCRETEOBJECTSBLOCH,ITEM16,PARTICULARLYSINCETHATENABLESYOURCOMPONENTSTOPROVIDEANINTERESTING“HOOKPOINT“SEEITEM6FORFUTUREUSEOFCOURSE,INLARGEMEASURETHISISALREADYTRUEFORBUILDINGCOMPONENTSDIRECTLYACCESSEDBYTHEJ2EECONTAINER,SUCHASSERVLETSREMEMBERJAVAXSERVLETSERVLETANDEJBSJAVAXEJBSESSIONBEAN,JAVAXEJBENTITYBEAN,ANDJAVAXEJBMESSAGEDRIVENBEANBUTTHISCANALSOBETRUEFORYOUROWNDOMAINCLASSES,SUCHASYOURHTTPSESSIONBOUNDMODELOBJECTS,FORTHESAMEREASONSTOWARDTHISEND,YOULLALSOWANTTOPAYCAREFULATTENTIONTOHOWCLIENTSCONSTRUCTYOURDOMAINOBJECTSBLOCH,ITEM1,WHETHERYOUPERMITOTHERSTOINHERITFROMYOURDOMAINOBJECTSBLOCH,ITEM15,ANDWHATKINDSOFTYPESYOUHANDBACKFROMYOURCOMPONENTSBLOCH,ITEM34ONEIMPORTANTREALIZATIONFROMTHISISTHEFACTTHATJ2EECOMPONENTS,WITHVERYLITTLEEXCEPTION,AREENTIRELYPASSIVEENTITIESINOTHERWORDS,J2EECOMPONENTSMUSTBORROWALOGICALTHREADOFCONTROLFROMTHECONTAINERINORDERTOCARRYOUTANYMEANINGFULWORKTHISNOTIONOFTHELOGICALTHREADOFCONTROL,USUALLYEXPRESSEDASANACTUALTHREADITSELFINOTHERWORDS,THECONTAINERCALLSINTOYOURCODEUSINGATHREADTHATITCREATED,USUALLYINRESPONSETOANENDUSERREQUESTSOMEWHEREBACKUPTHECHAIN,ISOFTENCALLEDANACTIVITYORCAUSALITY,ANDITMEANSTHATYOUSHOULDNTWRITECOMPONENTSTHATEXPECTTODOANYTHINGTOOOBSESSIVEWITHTHATBORROWEDTHREADDONTGOOFFANDCALCULATEPITOTHEHUNDREDTHDIGIT,FOREXAMPLEBECAUSETHECONTAINEREXPECTSTOGETTHATLOGICALTHREADOFCONTROLBACKATSOMEPOINTIFITDOESNT,ITCOULDVERYWELLCONSIDERTHATYOURCOMPONENTHASHUNGANDDECIDETOUNLOADYOURCOMPONENTINSTANCEENTIRELYTHISCREATESABITOFAQUANDARYWITHINTHEJ2EESPECIFICATIONBECAUSEFREQUENTLYTASKSCANTBEACCOMPLISHEDINANYREASONABLEFASHIONEXCEPTBYHAVINGATHREADUNDERPERSONALCONTROLCLASSICEXAMPLESARETHEDESIRETOPOLLSOMEEXTERNALRESOURCEEVERYNSECONDS,TOPERFORMSOMEKINDOFMAINTENANCEORNIGHTLYOPERATIONATMIDNIGHTEVERYNIGHT,ANDSOONTHISFUNCTIONALITYISCOMINGASPARTOFTHEEJB21SPECIFICATIONINTHEFORMOFTHETIMERSERVICE,BUTFORTHOSEWORKINGWITHCONTAINERSTHATPREDATETHATSPECIFICATION,NOSTANDARDJ2EESOLUTIONEXISTS,EXCEPTTOWRITEASTANDALONEAPPLICATIONTHATCALLSINTOTHECONTAINERVIAHTTPREQUEST,EJBSESSIONBEANCALL,ORJMSMESSAGEQUEUEDELIVERY,THEREBYGIVINGTHECONTAINERTHATLOGICALTHREADOFCONTROLULTIMATELY,AGAIN,THEKEYCHARACTERIZATIONOFTHEJ2EEAPPLICATIONISITSCOMPONENTCENTRICNATURE,ANDASAJ2EEDEVELOPER,YOUHAVETOPLAYINTOTHATMODELYOURSELFFAILURETODOSOMEANSSWIMMINGUPSTREAMAGAINSTTHEDECISIONSESTABLISHEDBYTHEJ2EECONTAINER,ANDINMANYCASESTHISRESULTSINALARGEAMOUNTOFCODETHATCONTRADICTSTHEPOLICIESESTABLISHEDBYTHECONTAINERWHILEYOUMAYBEABLETOGETAWAYWITHITINTODAYSVERSIONOFTHECONTAINER,DONTBESURPRISEDIFTOMORROWSVERSIONSUDDENLYBREAKSYOURCODEINSTEAD,GOWITHTHECURRENTBYEMBRACINGTHECOMPONENTCONCEPT,ANDWHEREYOUNEEDTOESCAPETHECONTAINERFORSOMEREASON,DOSOBYWRITINGASTANDALONEDAEMONPROCESSORAPPLICATION中文翻譯第二章架構(gòu)理論與實(shí)踐之間,從理論的角度來(lái)看沒(méi)有差異;然而,從實(shí)踐的角度來(lái)看,差異確實(shí)存在。JANLAVANDESNEPSCHEUT架構(gòu)這是一個(gè)位于設(shè)計(jì)之上的層次,在此我們能夠瞥見(jiàn)系統(tǒng)的最終輪廓、它將如何被構(gòu)建,以及整個(gè)應(yīng)用和系統(tǒng)的總體視圖。當(dāng)你為企業(yè)級(jí)應(yīng)用和系統(tǒng)規(guī)劃基本流程和設(shè)計(jì)的時(shí)候,牢記以下項(xiàng)中包含的建議,你就能向優(yōu)雅的目標(biāo)邁進(jìn)建立一個(gè)能夠?qū)Ω咝阅?、高可擴(kuò)展性的企業(yè)級(jí)系統(tǒng)提供支撐的架構(gòu)。第1項(xiàng)優(yōu)先采用構(gòu)件作為開發(fā)、部署和重用的核心元素許多JAVA開發(fā)者在首次嘗試構(gòu)建基于J2EE的項(xiàng)目時(shí),面臨的諸多困難之一,就是J2EE應(yīng)用的構(gòu)建方式不同于傳統(tǒng)的JAVA應(yīng)用J2EE不是構(gòu)建應(yīng)用,而是委托現(xiàn)有的應(yīng)用來(lái)生成要插入的構(gòu)件的結(jié)構(gòu),這個(gè)現(xiàn)有的應(yīng)用即J2EE容器自身。乍一看似乎區(qū)別不大,但從兩個(gè)不同的方面來(lái)看,其實(shí)隱含了巨大區(qū)別。首先,這表明開發(fā)者不再對(duì)構(gòu)建對(duì)象本身感興趣,而是專注于創(chuàng)建嚴(yán)密封裝的構(gòu)件,在J2EE環(huán)境中,構(gòu)件由構(gòu)成其的互相緊耦合的對(duì)象組成。第二,這表明我們必須遵守一系列嚴(yán)苛的規(guī)則,即使是作為構(gòu)件的開發(fā)者,我們也不能違反這一點(diǎn)。學(xué)習(xí)面向?qū)ο蠹夹g(shù)的開發(fā)者,從很早的時(shí)候起,就不斷地被告誡,要提倡封裝和數(shù)據(jù)隱藏。我們都還記得大師們教導(dǎo)的金玉良言。例如,“絕不使用公有域(PUBLICFIELD);而是編寫讀取器(ACCESSOR)和修改器(MUTATOR)方法(用JAVABEAN術(shù)語(yǔ)表示,就是GETTER和SETTER方法)”,或是“對(duì)客戶的視圖隱藏你的實(shí)現(xiàn)”。因此,對(duì)曾經(jīng)寫過(guò)的每個(gè)類,我們都忠實(shí)地為每個(gè)私有字段加上GET/SET方法對(duì),以及編寫缺省構(gòu)造器等等。遺憾的是,這樣就幾乎偏離了面向?qū)ο筇岢邆冊(cè)瓉?lái)的想法。僅僅強(qiáng)迫客戶使用GET方法,以得到對(duì)某個(gè)內(nèi)部持有的數(shù)據(jù)結(jié)構(gòu)的引用,并不能稱為封裝。這個(gè)問(wèn)題很久之前就已經(jīng)在EFFECTIVECMEYERS95一書里指出了,更近一點(diǎn)的,EFFECTIVEJAVABLOCH,第24項(xiàng)也同樣指出了這個(gè)問(wèn)題。更嚴(yán)重的是,這會(huì)誤導(dǎo)開發(fā)者在過(guò)于小的規(guī)模下(類和對(duì)象)考慮有效重用問(wèn)題,而不是像JAVABEAN規(guī)范最初的意圖那樣,在較大的規(guī)模下去考慮重用。還不相信讓我們考慮一個(gè)常見(jiàn)的集合類,比如ARRAYLIST。我們可以把ARRAYLIST作為單獨(dú)對(duì)象使用。不過(guò)要是想遍歷集合的內(nèi)容,如果不是明顯地必需的話,至少也是希望能夠用另一個(gè)對(duì)象,也就是ITERATOR實(shí)現(xiàn)類的對(duì)象。在類/對(duì)象的層次考慮重用,意味著我們要著重于考慮對(duì)“獨(dú)立于ARRAYLIST綁定的ITERATOR實(shí)現(xiàn)類”進(jìn)行重用,這顯然沒(méi)有意義。由于這兩個(gè)類本來(lái)就應(yīng)該成對(duì)使用,所以這意味著我們應(yīng)該在更高層次去考慮重用,這也就是我們稱為構(gòu)件(COMPONENT)的層次。在實(shí)際環(huán)境下,它通常是一個(gè)單獨(dú)的JAR文件,在本例中它里面包含了兩個(gè)類ARRAYLIST及其內(nèi)部的ITERATOR子類型。在使用COLLECTION接口的情況下,還要包括像ITERATOR、COLLECTION和LIST這樣的相關(guān)接口,因?yàn)樗鼈冏鳛橐粋€(gè)整體共同定義了客戶能夠信任的契約。這把我們帶入了對(duì)耦合的討論。緊耦合的定義是,如果一個(gè)給定的“事物”必須做出變化,以適應(yīng)另一“事物”的變化,我們就稱前者緊耦合于后者。換句話說(shuō),考慮ARRAYLIST,如果我改變了COLLECTION接口的定義,ARRAYLIST需要改變嗎當(dāng)然要,因?yàn)锳RRAYLIST通過(guò)LIST也實(shí)現(xiàn)了COLLECTION接口。如果我改變ARRAYLIST的內(nèi)部實(shí)現(xiàn),那么其內(nèi)部的ITERATOR實(shí)現(xiàn)需要改變嗎當(dāng)然要。不過(guò),客戶端代碼需要改變嗎不久之前客戶端代碼還把ITERATOR當(dāng)作通用類型的ITERATOR(并且沒(méi)有向下轉(zhuǎn)型)。盡管ARRAYLIST與其內(nèi)部的ITERATOR緊密耦合(反之亦然),不過(guò)只要客戶端代碼嚴(yán)格遵循接口編程,就能與ARRAYLIST保持松耦合關(guān)系。(松耦合將在第2項(xiàng)中進(jìn)行詳細(xì)討論,不過(guò)這里我要提前引用一下。)還沒(méi)看到聯(lián)系嗎我們考慮一個(gè)基于SERVLET的WEB應(yīng)用程序。如果我們遵循傳統(tǒng)的模型視圖控制器模式(MVC)1,那么至少要編寫兩個(gè)類,它們或多或少是緊耦合關(guān)系控制器SERVLET用來(lái)對(duì)進(jìn)入的HTTP請(qǐng)求進(jìn)行處理,然后把請(qǐng)求轉(zhuǎn)發(fā)到視圖JSP??刂破餍枰酪晥D。1這里其實(shí)有點(diǎn)用詞不當(dāng)符合題意的恰當(dāng)模式是表示抽象控制器模式的這些過(guò)程,除此之外還可以參考(PRESENTATIONABSTRACTIONCONTROLLER)POSA1,145,因?yàn)镸VC用來(lái)處理多個(gè)視圖,并且視圖能同步更新,這種方式在EXCEL或WORD這樣的GUI應(yīng)用中很常見(jiàn)。所依賴的數(shù)據(jù)元素,視圖需要知道控制器已經(jīng)做了哪些處理,以免重復(fù)工作。二者必須對(duì)視圖所依賴的數(shù)據(jù)元素被綁定的名稱達(dá)成一致。(HTTPSESSION的“名稱值”屬性提供了延遲綁定,而不是松耦合;詳細(xì)討論請(qǐng)參閱第2項(xiàng))此外,控制器和視圖都緊耦合于模型類,因?yàn)樗鼈冃枰澜M成模型所使用的數(shù)據(jù)元素。問(wèn)問(wèn)你自己?jiǎn)螁沃赜每刂破鞫还芟鄳?yīng)的視圖類/模型類,真的可行嗎視圖能夠在不先進(jìn)入控制器SERVLET的情況下被成功執(zhí)行嗎對(duì)這個(gè)問(wèn)題的回答一般總是“不行”。這表明,對(duì)于給定構(gòu)件里的類,本例中就是你的表示層構(gòu)件,相互之間暗含著緊耦合。這就產(chǎn)生了這樣一種現(xiàn)實(shí)狀況對(duì)于緊耦合已經(jīng)存在的地方,我們可以對(duì)傳統(tǒng)的“全面封裝”規(guī)則稍微放松一些,盡管我們?cè)?jīng)如此盲目地遵守這個(gè)規(guī)則。當(dāng)然我并不是在建議,為了方便對(duì)字段進(jìn)行訪問(wèn)立刻刪除所有GET/SET方法,我的建議是,你應(yīng)該對(duì)真正要保護(hù)的東西深思熟慮。例如,如果你的模型對(duì)象并不在表示層(注意這個(gè)術(shù)語(yǔ);請(qǐng)參閱第3項(xiàng))之外使用,尤其是當(dāng)這些模型對(duì)象只是對(duì)數(shù)據(jù)的簡(jiǎn)單包裝時(shí),比如“數(shù)據(jù)傳輸對(duì)象”(DATATRANSFEROBJECT)FOWLER,401,還要為每個(gè)字段加上GET/SET方法,真的有意義嗎請(qǐng)記住,封裝是用來(lái)在具體實(shí)現(xiàn)發(fā)生變化的時(shí)候,為了保護(hù)客戶端代碼而設(shè)計(jì)的,其目的并不是在構(gòu)件自身發(fā)生改變時(shí),來(lái)保護(hù)構(gòu)件。(開發(fā)者幾乎不能從對(duì)單個(gè)的類進(jìn)行封裝中得到益處,因此只要把構(gòu)件想象成更大、粒度更粗的類,你就離目標(biāo)不遠(yuǎn)了。)假定我們有幾個(gè)類,它們相互之間緊密協(xié)作,以完成一些有用的工作。這些類要么被一起部署,要么就都不被部署。我們?cè)趯ふ夷撤N“大于對(duì)象”的東西,作為部署的核心單元。換句話說(shuō),我們要尋求的正是構(gòu)件。SERVLET規(guī)范已經(jīng)拋棄了把單個(gè)SERVLET部署到SERVLET容器中的作法,而是采用WEB應(yīng)用的思想。WEB應(yīng)用是一系列資源,諸如SERVLET、JSP、模型類、工具類、以及靜態(tài)資源(HTML、圖像、聲音文件等),它們共同地相互協(xié)作以提供所需功能。WEB應(yīng)用采用單一的WAR文件部署,所以不可能出現(xiàn)(A)只部署了部分應(yīng)用;或(B)應(yīng)用的各個(gè)部件之間的版本不匹配。實(shí)際上,WAR文件和JAVA的JAR文件目的相同,都是為了使應(yīng)用的部署更加容易;如果你曾經(jīng)使用過(guò)JAVA10,那么你一定還記得“把CLASS文件解壓縮到CLASSPATH指定的路徑下”這種部署風(fēng)格,同時(shí)你也會(huì)認(rèn)同,那時(shí)候的JAVA應(yīng)用的部署方式不那么優(yōu)雅。WAR文件提供的原子性部署意味著,只有那些被認(rèn)為是WEB應(yīng)用的組成部分的資源才會(huì)真正出現(xiàn)在部署之后的應(yīng)用里。也就是說(shuō),只有你故意強(qiáng)行拷貝單獨(dú)的文件到部署后的應(yīng)用目錄中,才會(huì)出現(xiàn)局部的基于“替換文件”的部署。這么做并不好,原因很多。一個(gè)重要原因是可能會(huì)引入版本不匹配的問(wèn)題?!爸豢截惏l(fā)生變化的文件到部署目錄”看起來(lái)很有誘惑力,但是人們太容易忘記什么發(fā)生了改變,更重要的是,SERVLET容器并不能以我們的觀點(diǎn)去看待應(yīng)用發(fā)生了什么樣的變化??紤]一下CLASSLOADER。還記得嗎它由SERVLET容器創(chuàng)建,用來(lái)把你的WEB應(yīng)用從硬盤加載到JAVA虛擬機(jī)。每當(dāng)WEB應(yīng)用發(fā)生“改變”,通常是“硬盤部署目錄的內(nèi)容發(fā)生變化”的時(shí)候,SERVLET容器需要?jiǎng)?chuàng)建一個(gè)新的CLASSLOADER。但你要是仔細(xì)閱讀SERVLET規(guī)范就會(huì)發(fā)現(xiàn),當(dāng)新的CLASSLOADER被啟動(dòng)時(shí),它加載的是整個(gè)WEB應(yīng)用,而不是某個(gè)單獨(dú)的SERVLET。因?yàn)槿萜靼颜麄€(gè)WEB應(yīng)用當(dāng)作單個(gè)構(gòu)件,所以組成WEB應(yīng)用的所有CLASS都要由同一個(gè)CLASSLOADER加載。因此我們完全可以想象每當(dāng)有一個(gè)文件被拷貝到部署目錄時(shí),就會(huì)產(chǎn)生一個(gè)新的CLASSLOADER實(shí)例,從而要執(zhí)行加載整個(gè)WEB程序的所有額外工作,這并不會(huì)帶來(lái)任何實(shí)際效益。順便提一下,要確保理解類加載策略所產(chǎn)生的切實(shí)效果,請(qǐng)閱讀第70項(xiàng)。這些問(wèn)題的關(guān)鍵是,SERVLET(或J2EE中的其它)規(guī)范希望你使用構(gòu)件來(lái)構(gòu)造WEB應(yīng)用,而不是使用單獨(dú)的類。JSP規(guī)范則更進(jìn)一步通過(guò)鼓勵(lì)“可重用標(biāo)記庫(kù)”的概念,促進(jìn)了較小規(guī)模構(gòu)件在WEB應(yīng)用內(nèi)部以及跨越WEB應(yīng)用中的開發(fā)和使用。規(guī)范并不關(guān)心你
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公租房保潔合同范例
- 管理心理學(xué)在員工關(guān)系建立中的影響試題及答案
- 出售轉(zhuǎn)讓鏟車合同范例
- 2025年建筑工程考試指南試題及答案
- 關(guān)于增補(bǔ)合同范例
- 行政管理的國(guó)際合作試題及答案
- 企業(yè)品牌顧問(wèn)合同范例
- 出售沙子合同范例
- 現(xiàn)代管理學(xué)人才培養(yǎng)試題及答案
- 行政管理的危機(jī)應(yīng)對(duì)能力及試題及答案
- 云原生應(yīng)用架構(gòu)
- 基于人工智能的智能垃圾分類系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- 2023年公需科目:《“十四五”數(shù)字經(jīng)濟(jì)發(fā)展規(guī)劃》解讀等考試題
- 2023修正版《電力設(shè)施保護(hù)條例》
- 護(hù)理專業(yè)建設(shè)方案
- 升壓站設(shè)備基礎(chǔ)施工方案
- 12SS508《混凝土模塊式室外給水管道附屬構(gòu)筑物》
- 23J916-1:住宅排氣道(一)
- 高中物理知識(shí)點(diǎn)清單(非常詳細(xì))
- 2022小學(xué)勞動(dòng)課程標(biāo)準(zhǔn)電子版
評(píng)論
0/150
提交評(píng)論