J2EE前端应用程式架构与StrutsFramework_第1页
J2EE前端应用程式架构与StrutsFramework_第2页
J2EE前端应用程式架构与StrutsFramework_第3页
J2EE前端应用程式架构与StrutsFramework_第4页
J2EE前端应用程式架构与StrutsFramework_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

WebApplicationFramework

CraigMcClanahan在2000年提出,2001年6月releasestruts1.0。HostedinApacheJakartaproject將開發web程式之bestpractice以ApplicationFramework的方式封裝,供開發人員重用。為何有資格稱為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前端的相關規格/技術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規格書中訂有那四個scope,其意義為何?使用時機為何?請舉例說明一個合乎Servlet2.3規格書的WebApplication應該長什麼樣子。Forward和Redirect有何不同?FrameworkandDesignPatternsStrutsFrameworkisbuiltuponseveralwell-knownprovenpatterns簡介如果建築師都用軟體工程師的方法來建造房子,那麼第一隻飛來的啄木鳥便足以將整個文明都給摧毀。-AppliedJavaPatternsbyStephenSteltingandOlavaMaassenDesignPatternsChristopherAlexander(U.C.Berkeley)–1977出版了一本建築學用的樣式目錄(Pattern-Catalog)。1987OOPSLA中KentBeck等人發表了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通常針對特定領域來設計。讓成功的設計經驗可以重複使用!框架與應用程式的關係框架可以看成是整個應用程式的骨架,程式開發人員將框架客製化以寫出真正的應用程式。框架(抽象的、不能使用)應用程式(具體的、可以使用的)客製化Framework與Patterns的比較DesignPatterns是從很多Framework中歸納得來。一個Framework可能會包括很多DesignPatterns。DesignPatterns只能在觀念層級被重用。PatternsaremoreabstractthanframeworksFramework通常會由一群DesignPatterns組成。使用Framework的好處?讓成功的經驗得以重複使用。將領域專家(DomainExpert)的知識封裝於Framework中。鼓勵重用。增進開發效率。將軟體開發經驗轉換成具體資產。ApplyingFrameworkFrameworkDeveloptime2002.11~2003.06(7個月/1人)ApplicationsDeveloptime改寫時間2003.7~2003.8(2個月/2人)使用Framework的經驗DevelopersshouldhavestrongOObackgrounds.在Programmer沒有足夠OOBackground的情況下套用Framework可能造成反效果.Learningcurveshouldbetakenintoaccount.Onceframeworkison-line,itwillbeveryhardtomodified.FrameworkandDesignPatterns幾個常用到的基本技巧實作和流程控制角色互換(InversionofControl)傳統的公用函式庫(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發出post時,會觸發doPost()方法。一個Browser向Servlet發出get時,會觸發doGet()方法。判別是get或post,由HttpServlet決定,至於doPost(),doGet()由子類別決定。TemplateMethod是Framework中最常見到的DesignPattern!ServletInterfaceInterface規定了一組契約(method),所有實作它的類別都要實作所有方法。Client呼叫的是Interface中的方法,所以元件的抽換對Client來說是感覺不到的(不用改code)。實作界面就可保証符合規格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經由查表可得知該使用那個那個Action類別來處理該ActionString。ActionStringAction類別indexIndexActionviewCategoryViewCategoryActionHansMVC簡單的MVC實作查表Strutsmodificationsstruts-config.xmlActionServlet+RequestProcessorAbstractAction使用ActionForm

來協助處理HTML表單每一個HTMLForm背後都有一個ActionForm來support。idpassword<<ActionForm>>LoginActionFormidpasswordgetId()/setId()getPassword()setPassword()reset()validate()ActionForm的處理askName.jspProcessNameActionActionServlet/processName.doUserNameFormActionSerlvet會依據config檔將使用者填入的資料填入ActionForm中ActionForm的會以參數的形式傳給Action類別,供開發者在取得ActionForm的資料<<ActionForm>><<Action>>struuts-config.xml主要區段依先後次序為: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,何者優先?ShouldyouuseJSTLtagsinsteadofStrutstagswheneveryoucan?Sure,ifyourcontainersupportsServlets2.3andJSP1.2,andthat’swhatyouwanttodo.(儘可能使用JSTL取代Struts標籤)IfJSTLalreadyexisted,mostoftheStrutstagswouldneverhavebeenwritten.-TedHusted,JakartaStrutstechnicallead.JSTL優先!JSTL與Strutstag取捨準則(摘自StrutsinActionbyTedHusted)使用JSTL取代<bean:…>與<logic:…>繼續使用<html:……>目前Struts正在開發Struts-EL,未來在<html:…>中將可使用ExpressionLanguage.使用Struts控制項

取代傳統Html控制項目的:使用Struts的html控制項才能利用ActionForm的好處。有時會和JSTL一起合併使用。傳統的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控制項

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

取代傳統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區段中使用使用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的資料以參數形式傳入取得ActionForm的參考ActionClass(revisited)Struts的MVC模型index.jspActionClassBusinessLogicRequestorSessionScopeindex.htmActionFormModelViewControllerActionServletAction做些什麼?從ActionForm中取得資料從request/response中取得資料委任商業邏輯(含資料庫存取)將控制權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工具可支援自動產生。struuts-config.xml主要區段依先後次序為:DataSource設定(JDBC)ActionForm設定

重要!Global相關設定ActionMapping設定

重要!Controller設定其它設定(i18n,plug-in,…)我們只講ActionForm及ActionMapping,其它config的細節請自行參考struts線上文件。ActionForm區段目的:在此宣告你寫的ActionForm及其代名(你要怎麼稱呼他?),以便在ActionMapping中做相對設定。以<form-beans>…</form-beans>為界。<form-beans>中包含數個<form-bean>。ActionForm區段<form-beans><form-beanname="userNameForm"type="simple.form.SimpleForm“/><form-beanname=“anotherForm"type="simple.form.AnotherForm“/></form-beans>ActionMapping區段將使用這個名字來指稱你的FormBeansActionMappings區段目的:將jsp背後的ActionForm、發出的url

、Actionclass及其處理完後要forward的對象,四者間的關係連結起來。ActionMappings區段如何將以下這幾個component的關係化成文字?index.jspSayHelloActionhello.jspActionServlet/sayHello.dosuccessRequestScopeUserNameFormActionMappings區段<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系統設計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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论