J2EE前端應用程式架構與StrutsFramework_第1頁
J2EE前端應用程式架構與StrutsFramework_第2頁
J2EE前端應用程式架構與StrutsFramework_第3頁
J2EE前端應用程式架構與StrutsFramework_第4頁
J2EE前端應用程式架構與StrutsFramework_第5頁
已閱讀5頁,還剩103頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

AgendaStruts簡介與定位Web-tier概觀Framework&DesignPatterns概論基本觀念與常用OO技巧簡介StrutsFrameworkArchitecturalOverviewTheMVCArchitecturalPatternStruts設計理念Struts實作議題WhatisStruts?基於MVCArchitecturalPattern所開發(fā)的

WebApplicationFramework

CraigMcClanahan在2000年提出,2001年6月releasestruts1.0。HostedinApacheJakartaproject將開發(fā)web程式之bestpractice以ApplicationFramework的方式封裝,供開發(fā)人員重用。為何有資格稱為bestpractice?MustReadwhen

ArchitectingJ2EEApplicationsPofEAACoreJ2EEPatterns2/eStruts與J2EECorePatternsStruts實作了下列J2EECorePatternsApplicationController(PEAA)FrontController(PEAA)ViewHelper(PEAA:TemplateView)ServicetoWorkerDispatcherViewStrutsFramework的定位Webtier/Persistence/workflowYourCodeWebLogic/WebSphere?jRocketVM/JDK?Linux/Windows?Strutsisoneofyour

architecturaldecisionsHowStrutsfitsintoRUP?ArchitectureshouldbefinishedJ2EE前端的任務UI(顯示畫面)PresentationLogic(顯示邏輯)CollectsInputsPageFlowControl決定接下來要顯示那個Page當不使用EJB時…MayMaintainState(HttpSession)MayImplementBusinessLogicJ2EE前端=WebTierJ2EE前端的相關規(guī)格/技術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如何運作?什麼是Container?什麼是ServletContainer?至少說出三個JSP與ASP不同之處?一個完全使用Servlet的應用程式可能有什麼缺點?什麼是scriptlet?一個完全使用scriptlet的JSP應用程式可能有什麼缺點?JSP1.2規(guī)格書中訂有那四個scope,其意義為何?使用時機為何?請舉例說明一個合乎Servlet2.3規(guī)格書的WebApplication應該長什麼樣子。Forward和Redirect有何不同?FrameworkandDesignPatternsStrutsFrameworkisbuiltuponseveralwell-knownprovenpatterns簡介如果建築師都用軟體工程師的方法來建造房子,那麼第一隻飛來的啄木鳥便足以將整個文明都給摧毀。-AppliedJavaPatternsbyStephenSteltingandOlavaMaassenDesignPatternsChristopherAlexander(U.C.Berkeley)–1977出版了一本建築學用的樣式目錄(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通常針對特定領域來設計。讓成功的設計經(jīng)驗可以重複使用!框架與應用程式的關係框架可以看成是整個應用程式的骨架,程式開發(fā)人員將框架客製化以寫出真正的應用程式??蚣?抽象的、不能使用)應用程式(具體的、可以使用的)客製化Framework與Patterns的比較DesignPatterns是從很多Framework中歸納得來。一個Framework可能會包括很多DesignPatterns。DesignPatterns只能在觀念層級被重用。PatternsaremoreabstractthanframeworksFramework通常會由一群DesignPatterns組成。使用Framework的好處?讓成功的經(jīng)驗得以重複使用。將領域?qū)<?DomainExpert)的知識封裝於Framework中。鼓勵重用。增進開發(fā)效率。將軟體開發(fā)經(jīng)驗轉(zhuǎn)換成具體資產(chǎn)。ApplyingFrameworkFrameworkDeveloptime2002.11~2003.06(7個月/1人)ApplicationsDeveloptime改寫時間2003.7~2003.8(2個月/2人)使用Framework的經(jīng)驗DevelopersshouldhavestrongOObackgrounds.在Programmer沒有足夠OOBackground的情況下套用Framework可能造成反效果.Learningcurveshouldbetakenintoaccount.Onceframeworkison-line,itwillbeveryhardtomodified.FrameworkandDesignPatterns幾個常用到的基本技巧實作和流程控制角色互換(InversionofControl)傳統(tǒng)的公用函式庫(Library)函式由函式庫定義。我們寫主程式,在主程式中呼叫函式。你控制流程,Library提供實作??蚣?Framework)主程式由框架定義。我們實作函式,被框架定義的主程式所呼叫。Framework控制流程,它會呼叫你所提供的實作!又稱:HollyWood法則

Don’tcallme,Iwillcallyou!InversionofControlLibrary使用者的實作Framework使用者的實作LibraryReuseStringcountStr=“256”;Stringcount=Integer.parseInt(countStr);你控制流程,Library提供實作!StructuredStyle!FrameworkReusepublicclassMyServlet

extendsHttpServlet{publicvoiddoGet(…){

//提供實作

}}Framework控制流程,你提供實作!CallBackStyle!建構框架基本原則

-EssentialFrameworkconstructionprinciplesUnificationSeparationTemplateMethod/HookMethodFramework的作者通常將主要邏輯寫在TemplateMethod中。TemplateMethod會呼叫若干HookMethod,HookMethod通常就是「變異點(HotSpot)」。覆寫HookMethod,就可改變TemplateMethod的行為。(例如Servlet的doGet()/doPost())參考下頁的例子。範例: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),所有實作它的類別都要實作所有方法。Client呼叫的是Interface中的方法,所以元件的抽換對Client來說是感覺不到的(不用改code)。實作界面就可保証符合規(guī)格java.io.FilenameFilterps.其實這是一個strategypatternSeparationTemplatemethodHookmethodTemplateClass與HookClass有委任關係ObserverPattern範例:時常需要切換多臺資料庫templatemethodhookmethod在templatemethod中呼叫hookmethod討論:彈性的登入機制Whichistemplatemethod?whichishookmethod?StrutsArchitecturalOverview伺服端應用程式設計的演進ServletJSPscriptletJSP+Bean(Model1,PageController)MVC(Model2)Model1在JSP中決定下一頁是那裏,所以稱為PageController,通常PageController會有多個。(PEAA)ASP.NET的標準做法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實作基本觀念(1)index.doActionStringControllerStringControllerString用來指定Controller類別來處理ActionString用來指定要交給那個Action類別處理http://localhost:8080/jpetstore/index.doMVC實作基本觀念(2)ActionTable在Controller中以HashMap方式實作Controller經(jīng)由查表可得知該使用那個那個Action類別來處理該ActionString。ActionStringAction類別indexIndexActionviewCategoryViewCategoryActionHansMVC簡單的MVC實作查表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ū)段依先後次序為:DataSource設定(JDBC)ActionForm設定

重要!Global相關設定ActionMapping設定

重要!Controller設定其它設定(i18n,plug-in,resource…)struts-config.xmlActionForm設定ActionMapping設定struts-config.xml的處理Author:Jean-MichelGarnier,http://rollerjm.free.fr/pro/Struts11.htmlDevelopingWebApplicationswithStrutsFrameworkStruts主要元件StrutsJSP自訂標籤庫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標籤)IfJSTLalreadyexisted,mostoftheStrutstagswouldneverhavebeenwritten.-TedHusted,JakartaStrutstechnicallead.JSTL優(yōu)先!JSTL與Strutstag取捨準則(摘自StrutsinActionbyTedHusted)使用JSTL取代<bean:…>與<logic:…>繼續(xù)使用<html:……>目前Struts正在開發(fā)Struts-EL,未來在<html:…>中將可使用ExpressionLanguage.使用Struts控制項

取代傳統(tǒng)Html控制項目的:使用Struts的html控制項才能利用ActionForm的好處。有時會和JSTL一起合併使用。傳統(tǒng)的HtmlForm<html><body><formaction=“sayHello.do”><inputtype=“text”name=“userName”/><inputtype=“submit”/></form></body></html>使用Struts控制項

取代html控制項修改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控制項

取代傳統(tǒng)html控制項隨便取個名字,識別用.TLD真正的位置使用Struts控制項

取代傳統(tǒng)html控制項<%@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。範例<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的要一一對應,名字也要相同

privateStringuserName;privateStringpassword;//每一個屬性都要有getter及setterpublicvoidsetUserName(StringuserName){…}publicStringgetUserName(){…..}publicvoidsetPassword(){…..}publicStringgetPassword(){….}}如果欄位很多,寫起來很麻煩?在那裏登記ActionForm?ActionForm設定登記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è)邏輯(含資料庫存取)將控制權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的核心,用來描述各元件的關係。市面上有很多GUI工具可支援自動產(chǎn)生。struuts-config.xml主要區(qū)段依先後次序為:DataSource設定(JDBC)ActionForm設定

重要!Global相關設定ActionMapping設定

重要!Controller設定其它設定(i18n,plug-in,…)我們只講ActionForm及ActionMapping,其它config的細節(jié)請自行參考struts線上文件。ActionForm區(qū)段目的:在此宣告你寫的ActionForm及其代名(你要怎麼稱呼他?),以便在ActionMapping中做相對設定。以<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的對象,四者間的關係連結(jié)起來。ActionMappings區(qū)段如何將以下這幾個component的關係化成文字?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)設計askName.jspProcessNameActionsayHello.jspActionServlet/processName.dosayHelloRequestScopeUserNameForm輸入驗証(Validation)ClientsidevalidationServersidevalidation實作ActionForm.validate()Struts的輸入驗証架構實作validation步驟在ActionForm中實作validate方法struts-config.xml中的<action>標籤中之validate屬性設為true設定ApplicationResource.properties寫作ActionError與錯誤訊息StrutsApplicationDemo(2)

-validationStruts就這樣嗎?還有很

溫馨提示

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

評論

0/150

提交評論