版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
AgendaStruts簡介與定位Web-tier概觀Framework&DesignPatterns概論基本觀念與常用OO技巧簡介StrutsFrameworkArchitecturalOverviewTheMVCArchitecturalPatternStruts設(shè)計理念Struts實(shí)作議題WhatisStruts?基於MVCArchitecturalPattern所開發(fā)的
WebApplicationFramework
CraigMcClanahan在2000年提出,2001年6月releasestruts1.0。HostedinApacheJakartaproject將開發(fā)web程式之bestpractice以ApplicationFramework的方式封裝,供開發(fā)人員重用。為何有資格稱為bestpractice?MustReadwhen
ArchitectingJ2EEApplicationsPofEAACoreJ2EEPatterns2/eStruts與J2EECorePatternsStruts實(shí)作了下列J2EECorePatternsApplicationController(PEAA)FrontController(PEAA)ViewHelper(PEAA:TemplateView)ServicetoWorkerDispatcherViewStrutsFramework的定位Webtier/Persistence/workflowYourCodeWebLogic/WebSphere?jRocketVM/JDK?Linux/Windows?Strutsisoneofyour
architecturaldecisionsHowStrutsfitsintoRUP?ArchitectureshouldbefinishedJ2EE前端的任務(wù)UI(顯示畫面)PresentationLogic(顯示邏輯)CollectsInputsPageFlowControl決定接下來要顯示那個Page當(dāng)不使用EJB時…MayMaintainState(HttpSession)MayImplementBusinessLogicJ2EE前端=WebTierJ2EE前端的相關(guān)規(guī)格/技術(shù)JSP/Servlets最新版為2.0/2.4,目前廣泛使用1.2/2.3JSPCustomTagLibraryJSTL(JSPStandardTagLibrary)目前為1.0(2003.6)JavaServer?Faces目前為1.0finaldraft(2003.12.19)UIcomponents/UIEventHandling問題與討論試以簡圖表示JSP與Servlet如何運(yùn)作?什麼是Container?什麼是ServletContainer?至少說出三個JSP與ASP不同之處?一個完全使用Servlet的應(yīng)用程式可能有什麼缺點(diǎn)?什麼是scriptlet?一個完全使用scriptlet的JSP應(yīng)用程式可能有什麼缺點(diǎn)?JSP1.2規(guī)格書中訂有那四個scope,其意義為何?使用時機(jī)為何?請舉例說明一個合乎Servlet2.3規(guī)格書的WebApplication應(yīng)該長什麼樣子。Forward和Redirect有何不同?FrameworkandDesignPatternsStrutsFrameworkisbuiltuponseveralwell-knownprovenpatterns簡介如果建築師都用軟體工程師的方法來建造房子,那麼第一隻飛來的啄木鳥便足以將整個文明都給摧毀。-AppliedJavaPatternsbyStephenSteltingandOlavaMaassenDesignPatternsChristopherAlexander(U.C.Berkeley)–1977出版了一本建築學(xué)用的樣式目錄(Pattern-Catalog)。1987OOPSLA中KentBeck等人發(fā)表了smalltalk的DesignPatterns。1995年Gof出版了Designpatterns:ElementsofReusableObject-OrientedSoftware。1996年Frank等人出版了POSA(PatternOrientedSoftwareArchitecture)。這二本書問世後,DesignPatterns開始受到廣泛的重視與成長。TwoprimarybooksPOSAGofPatternSystem由[POSA96]首先提出對Patterns的分類將Pattern從「鉅觀」到「微觀」加以分類ArchitecturalPatterns(例如:MVC、Layer)DesignPatterns(例如:Gof的23個patterns)Idioms(例如大量接合字串問題或CodeStyle)框架(Framework)Aframeworkisareusable,semi-completeapplication(半成品)thatcanbespecializedtoproducecustomapplications.Applicationframeworksareforreifying(具體化)provensoftwaredesignsandimplementations.Framework通常針對特定領(lǐng)域來設(shè)計。讓成功的設(shè)計經(jīng)驗(yàn)可以重複使用!框架與應(yīng)用程式的關(guān)係框架可以看成是整個應(yīng)用程式的骨架,程式開發(fā)人員將框架客製化以寫出真正的應(yīng)用程式??蚣?抽象的、不能使用)應(yīng)用程式(具體的、可以使用的)客製化Framework與Patterns的比較DesignPatterns是從很多Framework中歸納得來。一個Framework可能會包括很多DesignPatterns。DesignPatterns只能在觀念層級被重用。PatternsaremoreabstractthanframeworksFramework通常會由一群DesignPatterns組成。使用Framework的好處?讓成功的經(jīng)驗(yàn)得以重複使用。將領(lǐng)域?qū)<?DomainExpert)的知識封裝於Framework中。鼓勵重用。增進(jìn)開發(fā)效率。將軟體開發(fā)經(jīng)驗(yàn)轉(zhuǎn)換成具體資產(chǎn)。ApplyingFrameworkFrameworkDeveloptime2002.11~2003.06(7個月/1人)ApplicationsDeveloptime改寫時間2003.7~2003.8(2個月/2人)使用Framework的經(jīng)驗(yàn)DevelopersshouldhavestrongOObackgrounds.在Programmer沒有足夠OOBackground的情況下套用Framework可能造成反效果.Learningcurveshouldbetakenintoaccount.Onceframeworkison-line,itwillbeveryhardtomodified.FrameworkandDesignPatterns幾個常用到的基本技巧實(shí)作和流程控制角色互換(InversionofControl)傳統(tǒng)的公用函式庫(Library)函式由函式庫定義。我們寫主程式,在主程式中呼叫函式。你控制流程,Library提供實(shí)作??蚣?Framework)主程式由框架定義。我們實(shí)作函式,被框架定義的主程式所呼叫。Framework控制流程,它會呼叫你所提供的實(shí)作!又稱:HollyWood法則
Don’tcallme,Iwillcallyou!InversionofControlLibrary使用者的實(shí)作Framework使用者的實(shí)作LibraryReuseStringcountStr=“256”;Stringcount=Integer.parseInt(countStr);你控制流程,Library提供實(shí)作!StructuredStyle!FrameworkReusepublicclassMyServlet
extendsHttpServlet{publicvoiddoGet(…){
//提供實(shí)作
}}Framework控制流程,你提供實(shí)作!CallBackStyle!建構(gòu)框架基本原則
-EssentialFrameworkconstructionprinciplesUnificationSeparationTemplateMethod/HookMethodFramework的作者通常將主要邏輯寫在TemplateMethod中。TemplateMethod會呼叫若干HookMethod,HookMethod通常就是「變異點(diǎn)(HotSpot)」。覆寫HookMethod,就可改變TemplateMethod的行為。(例如Servlet的doGet()/doPost())參考下頁的例子。範(fàn)例:LoginHandlerUnificationTemplatemethodHookmethodtemplate、hook在同一個ClassServlet與
TemplateMethod[Gof95]一個Browser向HttpServlet發(fā)出post時,會觸發(fā)doPost()方法。一個Browser向Servlet發(fā)出get時,會觸發(fā)doGet()方法。判別是get或post,由HttpServlet決定,至於doPost(),doGet()由子類別決定。TemplateMethod是Framework中最常見到的DesignPattern!ServletInterfaceInterface規(guī)定了一組契約(method),所有實(shí)作它的類別都要實(shí)作所有方法。Client呼叫的是Interface中的方法,所以元件的抽換對Client來說是感覺不到的(不用改code)。實(shí)作界面就可保証符合規(guī)格java.io.FilenameFilterps.其實(shí)這是一個strategypatternSeparationTemplatemethodHookmethodTemplateClass與HookClass有委任關(guān)係ObserverPattern範(fàn)例:時常需要切換多臺資料庫templatemethodhookmethod在templatemethod中呼叫hookmethod討論:彈性的登入機(jī)制Whichistemplatemethod?whichishookmethod?StrutsArchitecturalOverview伺服端應(yīng)用程式設(shè)計的演進(jìn)ServletJSPscriptletJSP+Bean(Model1,PageController)MVC(Model2)Model1在JSP中決定下一頁是那裏,所以稱為PageController,通常PageController會有多個。(PEAA)ASP.NET的標(biāo)準(zhǔn)做法Model1:PageControllerlogin.jsp資料庫index.htmindex.jsp在JSP中決定下一頁是那裏,所以稱為PageControllerJavaBeanRequestorSessionScopeModel1有什麼問題?Servlet/
JSPServlet/
JSPServlet/
JSPWebServerServlet/
JSPOnecontrollerperpage,hardtomaintain!MVC:SeparationofConcernCVMModel2-MVCindex.jspBOindex.htmControllerServletJavaBeanreaddatasetdataRequestorSessionScopeForward/RedirectControllerSplitindex.jspLoginActionBORequestorSessionScopeindex.htmJavaBeanControllerControllerSplitinStrutsController=ActionServlet+ActionClassesMVCindex.jspLoginActionBORequestorSessionScopeindex.htmJavaBeanModelViewControllerControllerStruts的MVC模型index.jspActionClassBusinessLogicRequestorSessionScopeindex.htmActionFormModelViewControllerActionServletStrengthsofMVCPatternProvidesaclearseparationbetween:BusinessLogic(M)OutputPresentation(V)RequestProcessing(C)Providessinglepointof
workflowcontrolIncreasescodemanageabilityIncreasescodeextensibilityMVCImplementationsHansMVCStrutsFrameworkMVC實(shí)作基本觀念(1)index.doActionStringControllerStringControllerString用來指定Controller類別來處理ActionString用來指定要交給那個Action類別處理http://localhost:8080/jpetstore/index.doMVC實(shí)作基本觀念(2)ActionTable在Controller中以HashMap方式實(shí)作Controller經(jīng)由查表可得知該使用那個那個Action類別來處理該ActionString。ActionStringAction類別indexIndexActionviewCategoryViewCategoryActionHansMVC簡單的MVC實(shí)作查表Strutsmodificationsstruts-config.xmlActionServlet+RequestProcessorAbstractAction使用ActionForm
來協(xié)助處理HTML表單每一個HTMLForm背後都有一個ActionForm來support。idpassword<<ActionForm>>LoginActionFormidpasswordgetId()/setId()getPassword()setPassword()reset()validate()ActionForm的處理askName.jspProcessNameActionActionServlet/processName.doUserNameFormActionSerlvet會依據(jù)config檔將使用者填入的資料填入ActionForm中ActionForm的會以參數(shù)的形式傳給Action類別,供開發(fā)者在取得ActionForm的資料<<ActionForm>><<Action>>struuts-config.xml主要區(qū)段依先後次序?yàn)?DataSource設(shè)定(JDBC)ActionForm設(shè)定
重要!Global相關(guān)設(shè)定ActionMapping設(shè)定
重要!Controller設(shè)定其它設(shè)定(i18n,plug-in,resource…)struts-config.xmlActionForm設(shè)定ActionMapping設(shè)定struts-config.xml的處理Author:Jean-MichelGarnier,http://rollerjm.free.fr/pro/Struts11.htmlDevelopingWebApplicationswithStrutsFrameworkStruts主要元件StrutsJSP自訂標(biāo)籤庫ActionFormActionclassesActionServletstruts-config.xmlStruts-ViewJSP的寫作:二種選擇JSTL<c:outvalue=“${sessionScope.userBean.name}”/>Struts-bean<bean:writename=“userBean”property=“name”/>JSTL與StrutsTag,何者優(yōu)先?ShouldyouuseJSTLtagsinsteadofStrutstagswheneveryoucan?Sure,ifyourcontainersupportsServlets2.3andJSP1.2,andthat’swhatyouwanttodo.(儘可能使用JSTL取代Struts標(biāo)籤)IfJSTLalreadyexisted,mostoftheStrutstagswouldneverhavebeenwritten.-TedHusted,JakartaStrutstechnicallead.JSTL優(yōu)先!JSTL與Strutstag取捨準(zhǔn)則(摘自StrutsinActionbyTedHusted)使用JSTL取代<bean:…>與<logic:…>繼續(xù)使用<html:……>目前Struts正在開發(fā)Struts-EL,未來在<html:…>中將可使用ExpressionLanguage.使用Struts控制項(xiàng)
取代傳統(tǒng)Html控制項(xiàng)目的:使用Struts的html控制項(xiàng)才能利用ActionForm的好處。有時會和JSTL一起合併使用。傳統(tǒng)的HtmlForm<html><body><formaction=“sayHello.do”><inputtype=“text”name=“userName”/><inputtype=“submit”/></form></body></html>使用Struts控制項(xiàng)
取代html控制項(xiàng)修改web.xml副檔名改成.jsp修改tag修改web.xml<taglib><taglib-uri>/WEB-INF/struts-html.tld</taglib-uri><taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location></taglib>使用Struts控制項(xiàng)
取代傳統(tǒng)html控制項(xiàng)隨便取個名字,識別用.TLD真正的位置使用Struts控制項(xiàng)
取代傳統(tǒng)html控制項(xiàng)<%@tagliburi="/WEB-INF/struts-html.tld"prefix="html"%><html:html><html:formaction=“sayHello.do”>
<html:textproperty=“userName”/><html:submit/></html:form></html:html>要先宣告前面加上html的prefix相同!HTML的Form如何與ActionForm對映?基本上每一個<html:form>……</html:form>背後都會有一個ActionForm。表單的每一個輸入欄位原則上對映到JavaBean的一個property。範(fàn)例<html:html><html:formaction=“sayHello.do”>
<html:textname=“userNameForm”
property=“userName”/><html:textname=“userNameForm”
property=“password”/><html:submit/></html:form></html:html>ActionForm名稱所對映到的屬性UserNameFormPackagedemo;PublicclassUserNameForm
extendsActionForm{//屬性和htmlform的要一一對應(yīng),名字也要相同
privateStringuserName;privateStringpassword;//每一個屬性都要有g(shù)etter及setterpublicvoidsetUserName(StringuserName){…}publicStringgetUserName(){…..}publicvoidsetPassword(){…..}publicStringgetPassword(){….}}如果欄位很多,寫起來很麻煩?在那裏登記ActionForm?ActionForm設(shè)定登記ActionForm<form-beanname=“userNameForm”type=“demo.UserNameForm”/>其它屬性className–指定FormBeanConfig類別。dynamic–是否使用DynaForm?ActionForm類別名稱ActionForm的名字,將在ActionMapping區(qū)段中使用使用DynaBean<form-beanname=“userNameForm”
type=“org.apache.struts.action.DynaActionForm”
dynamic=“true”><form-propertyname=“userName”type=“java.lang.String”/><form-propertyname=“password”type=“java.lang.String”/></form-bean>使用單一Map物件儲存所有JavaBean的屬性登記屬性名稱publicclassProcessNameActionextendsAction{publicActionForwardexecute(ActionMappingmapping,
ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){
UserNameFormmyForm=(UserNameForm)form;…..(dosomething)…return(mapping.findForward(“sayHello"));}}讀取ActionForm的資料以參數(shù)形式傳入取得ActionForm的參考ActionClass(revisited)Struts的MVC模型index.jspActionClassBusinessLogicRequestorSessionScopeindex.htmActionFormModelViewControllerActionServletAction做些什麼?從ActionForm中取得資料從request/response中取得資料委任商業(yè)邏輯(含資料庫存取)將控制權(quán)forward到合適的View中ProcessNameActionpublicclassProcessNameAction
extendsAction{publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){UserNameFormmyForm=(UserNameForm)form;…..(dosomething)…return(mapping.findForward(sayHello"));}}ActionServlet使用struts-config.xml控制ActionServlet行為!Struts-config.xmlStruts的核心,用來描述各元件的關(guān)係。市面上有很多GUI工具可支援自動產(chǎn)生。struuts-config.xml主要區(qū)段依先後次序?yàn)?DataSource設(shè)定(JDBC)ActionForm設(shè)定
重要!Global相關(guān)設(shè)定ActionMapping設(shè)定
重要!Controller設(shè)定其它設(shè)定(i18n,plug-in,…)我們只講ActionForm及ActionMapping,其它c(diǎn)onfig的細(xì)節(jié)請自行參考struts線上文件。ActionForm區(qū)段目的:在此宣告你寫的ActionForm及其代名(你要怎麼稱呼他?),以便在ActionMapping中做相對設(shè)定。以<form-beans>…</form-beans>為界。<form-beans>中包含數(shù)個<form-bean>。ActionForm區(qū)段<form-beans><form-beanname="userNameForm"type="simple.form.SimpleForm“/><form-beanname=“anotherForm"type="simple.form.AnotherForm“/></form-beans>ActionMapping區(qū)段將使用這個名字來指稱你的FormBeansActionMappings區(qū)段目的:將jsp背後的ActionForm、發(fā)出的url
、Actionclass及其處理完後要forward的對象,四者間的關(guān)係連結(jié)起來。ActionMappings區(qū)段如何將以下這幾個component的關(guān)係化成文字?index.jspSayHelloActionhello.jspActionServlet/sayHello.dosuccessRequestScopeUserNameFormActionMappings區(qū)段<action-mappings><actionpath="/sayHello"
type="simple.action.SayHelloAction"
name="userNameForm"
scope="request"
input=“index.jsp”>
<forwardname="success"path="/hello.jsp"/></action><action>…..</action><action>…..</action></action-mappings>要將.do去掉StrutsApplicationDemo(1)
-使用JBuilderX系統(tǒng)設(shè)計askName.jspProcessNameActionsayHello.jspActionServlet/processName.dosayHelloRequestScopeUserNameForm輸入驗(yàn)証(Validation)ClientsidevalidationServersidevalidation實(shí)作ActionForm.validate()Struts的輸入驗(yàn)証架構(gòu)實(shí)作validation步驟在ActionForm中實(shí)作validate方法struts-config.xml中的<action>標(biāo)籤中之validate屬性設(shè)為true設(shè)定ApplicationResource.properties寫作ActionError與錯誤訊息StrutsApplicationDemo(2)
-validationStruts就這樣嗎?還有很
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年建筑工地吊籃租賃協(xié)議
- 2024年數(shù)據(jù)中心的建設(shè)和運(yùn)營租賃合同
- 2024年房產(chǎn)銷售代表協(xié)議
- 2024年圖書銷售版權(quán)轉(zhuǎn)讓協(xié)議
- 2024-2030年埋弧焊用燒結(jié)焊劑公司技術(shù)改造及擴(kuò)產(chǎn)項(xiàng)目可行性研究報告
- 2024-2030年全球及中國麥芽提取物行業(yè)銷售策略及前景趨勢預(yù)測報告
- 2024-2030年全球及中國重烷基苯行業(yè)需求態(tài)勢及發(fā)展趨勢預(yù)測報告
- 2024年建筑設(shè)計咨詢服務(wù)合同
- 2024-2030年全球及中國盲閘板防噴器行業(yè)發(fā)展態(tài)勢及產(chǎn)銷形勢分析報告
- 2024-2030年全球及中國現(xiàn)場制氮裝置行業(yè)需求狀況及投資效益預(yù)測報告
- 公司組織架構(gòu)圖模板課件
- 遼寧省葫蘆島市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)
- 植物種子的傳播方式課件
- 電纜敷設(shè)施工方案及安全措施
- 百合干(食品安全企業(yè)標(biāo)準(zhǔn))
- 肺血栓栓塞癥臨床路徑(縣級醫(yī)院版)
- 國開成本會計第10章綜合練習(xí)試題及答案
- 《西游記》-三打白骨精(劇本臺詞)精選
- T∕CSCS 012-2021 多高層建筑全螺栓連接裝配式鋼結(jié)構(gòu)技術(shù)標(biāo)準(zhǔn)-(高清版)
- 充電站項(xiàng)目合作方案-高新
- 急診科臨床診療指南-技術(shù)操作規(guī)范更新版
評論
0/150
提交評論