Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第2版)第19章_第1頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第2版)第19章_第2頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第2版)第19章_第3頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第2版)第19章_第4頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第2版)第19章_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

軟件框架FrameworkClassHotspotOperation()operation()HotspotSpecializationFrameworkcodeApplicationcode軟件框架具有四個(gè)特點(diǎn):基于框架的應(yīng)用程序的流程控制在框架內(nèi)部;框架針對(duì)通用功能給出了默認(rèn)實(shí)現(xiàn);框架內(nèi)部代碼不可被用戶修改;框架可以被應(yīng)用代碼有選擇的覆蓋〔重定義框架中的代碼功能〕或者細(xì)化〔對(duì)框架中的空方法給出具體實(shí)現(xiàn)〕來擴(kuò)展功能??蚣芊庋b了應(yīng)用程序共性難點(diǎn)的解決方案,因而軟件開發(fā)人員在應(yīng)用框架進(jìn)行編程時(shí),不僅應(yīng)明白自己做什么,更應(yīng)明白框架已經(jīng)做了什么,畢竟只有全面的邏輯理解才能更好地應(yīng)用框架進(jìn)行編程。框架Hotspot類軟件框架〔SoftwareFramework〕是對(duì)通用功能操作進(jìn)行抽象的軟件,這些抽象的功能操作可以被應(yīng)用代碼通過框架提供的API接口進(jìn)行有選擇的改變,從而形成特定的應(yīng)用軟件?;诳蚣艿膽?yīng)用軟件在編程上可以復(fù)用框架代碼,而不必從頭編寫。框架編程可以提高軟件的質(zhì)量、降低軟件的開發(fā)本錢、縮短開發(fā)周期。框架軟件產(chǎn)品的最終用戶不是一般使用者,而是軟件開發(fā)人員。軟件框架與應(yīng)用的控制關(guān)系當(dāng)應(yīng)用依賴框架程度較高時(shí),應(yīng)用只能復(fù)用特定的框架,當(dāng)有功能或性能更好的框架出現(xiàn)時(shí),可能會(huì)因Hotspot的差異而無(wú)法移植。應(yīng)用程序基于框架編程就是對(duì)框架的復(fù)用,這種復(fù)用自然引出框架與應(yīng)用之間控制關(guān)系問題。應(yīng)用程序復(fù)用框架,必須以Hotspot作為連接點(diǎn),因而框架在某種程度上就決定了應(yīng)用,或稱應(yīng)用依賴于框架。以Struts1和Struts2兩個(gè)版本的框架為例,對(duì)框架與應(yīng)用之間的正向控制與反向控制給出進(jìn)一步說明。。如果能做到應(yīng)用不依賴于框架,控制關(guān)系就會(huì)反向〔IoC,InversionofControl〕,框架和應(yīng)用的耦合關(guān)系就會(huì)大大降低,從而對(duì)框架和應(yīng)用都有益處。Struts1BrowserhttpresponseDatahttprequest1)當(dāng)軟件系統(tǒng)只有幾個(gè)功能頁(yè)面,這種結(jié)構(gòu)合適。2)當(dāng)軟件系統(tǒng)功能多,需要團(tuán)隊(duì)合作開發(fā),按這種結(jié)構(gòu)設(shè)計(jì),團(tuán)隊(duì)成員的分工只能按照功能進(jìn)行劃分,引起的問題是:重復(fù)勞動(dòng)工作量大;出錯(cuò)難找,排錯(cuò)量大;需求變化時(shí)代碼重頭編寫;下一個(gè)項(xiàng)目難以重用。JSP獨(dú)立模塊DataBrowser

response

request1)將軟件項(xiàng)目模型(業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯)與顯示分離開。2)團(tuán)隊(duì)成員的分工不再簡(jiǎn)單的按功能劃分,降低了重復(fù)工作量;容易鎖定問題;當(dāng)用戶界面需求變化時(shí),業(yè)務(wù)數(shù)據(jù)處理代碼不需要重頭編寫;重用性較上一結(jié)構(gòu)好。JSP

Model1BrowserData

response

request1)將軟件項(xiàng)目顯示、控制和模型分離開。2)團(tuán)隊(duì)成員的分工劃分界面清晰,幾乎沒有重復(fù)工作量;出錯(cuò)時(shí)容易鎖定問題;當(dāng)需求變化時(shí),業(yè)務(wù)數(shù)據(jù)處理代碼不需要重頭編寫;該種體系結(jié)構(gòu)便于代碼的重用性。3)體系結(jié)構(gòu)的基礎(chǔ)框架代碼技術(shù)含量高,但部署麻煩,不適合小型項(xiàng)目。JSP

Model2定義:Struts1是在JSPModel2根底上實(shí)現(xiàn)的一個(gè)MVC框架。Web客戶WebServerAction〔模型〕ActionFormJavaBean控制器ActionServlet視圖JSPActionActionServlet/JSP容器Struts1實(shí)現(xiàn)的MVC框架MVC結(jié)構(gòu)視圖〔電視〕控制器〔遙控器〕模型〔頻道〕選擇視圖用戶請(qǐng)求響應(yīng)請(qǐng)求狀態(tài)查詢通知更新方法調(diào)用事件控制器視圖模型接受用戶請(qǐng)求調(diào)用模型響應(yīng)用戶請(qǐng)求選擇視圖顯示模型處理結(jié)果把用戶數(shù)據(jù)傳給用戶控制器顯示模型狀態(tài)響應(yīng)模型狀態(tài)更新封裝應(yīng)用程序狀態(tài)響應(yīng)狀態(tài)查詢處理業(yè)務(wù)流程通知視圖更新狀態(tài)Struts框架提供的Hotspot主要有Action和Formbean,應(yīng)用程序需要繼承這兩個(gè)類,此外還需編寫含有業(yè)務(wù)邏輯的JavaBean。Struts提供Taglibrary,在JSP中便于對(duì)JavaBean、Html、錯(cuò)誤消息、perties〔本地文字〕的訪問和處理。配置web.xml讓JSP容器“知曉”struts框架,配置struts-config.xml讓struts“知曉”特定的應(yīng)用。做到這三點(diǎn),應(yīng)用程序就充分利用了Struts框架,具有了MVC體系結(jié)構(gòu)的設(shè)計(jì)特點(diǎn)Struts1主要構(gòu)件調(diào)用關(guān)系圖Struts1〔一〕環(huán)境配置〔Tomcat〕目錄描述/bin存放windows、Linux平臺(tái)啟動(dòng)和關(guān)閉腳本文件/conf存放tomcat的重要配置文件,尤其是server.xml/server子目錄lib下存放tomcat所需的JAR文件;子目錄webapps下存放tomcat自帶的admin和manager兩個(gè)應(yīng)用/common/lib存放tomcat和所有web應(yīng)用都可以訪問的JAR文件/shared/lib存放所有web應(yīng)用都可以訪問的JAR文件/logs存放tomcat的日志文件/webappsweb應(yīng)用的發(fā)布目錄/work由JSP生成的Servlet存放于此表:Tomcat主要目錄用途描述Hello應(yīng)用下部署struts1的jar文件Hello應(yīng)用下部署struts1的標(biāo)簽文件Struts1是Tomcat的一個(gè)應(yīng)用,而用戶建立的應(yīng)用又是Struts1的一個(gè)應(yīng)用,因而需要進(jìn)行相應(yīng)的配置工作,主要分為Tomcat配置、環(huán)境變量配置、struts1應(yīng)用配置。<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN""://java.sun/j2ee/dtds/web-app_2_2.dtd"><web-app><display-name>HelloAppStrutsApplication</display-name>

<!--StandardActionServletConfiguration--><servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param><load-on-startup>2</load-on-startup></servlet><!--StandardActionServletMapping--><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>

但凡“*.do”的請(qǐng)求都轉(zhuǎn)給Controller〔ActionServlet〕進(jìn)行處理,并對(duì)Controller的包路徑和轉(zhuǎn)載參數(shù)〔struts-config.xml〕進(jìn)行了設(shè)置。web.xml文件配置〔一〕<!--TheUsualWelcomeFileList--><welcome-file-list><welcome-file>hello.jsp</welcome-file></welcome-file-list><!--StrutsTagLibraryDescriptors--><taglib><taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri><taglib-location>/WEB-INF/struts-bean.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-html.tld</taglib-uri><taglib-location>/WEB-INF/struts-html.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri><taglib-location>/WEB-INF/struts-logic.tld</taglib-location></taglib></web-app>對(duì)應(yīng)用的標(biāo)簽庫(kù)文件進(jìn)行設(shè)置。默認(rèn)歡送頁(yè)面的設(shè)置。web.xml文件配置〔二〕Struts1〔二〕應(yīng)用開發(fā)應(yīng)用需求1)如果用戶輸入姓名<name>,返回字符串“Hello<name>!”。2)如果用戶沒有輸入姓名就提交表單,返回錯(cuò)誤信息,并提示用戶輸入姓名。3)輸入“Monster”,返回錯(cuò)誤信息,拒絕與其打招呼。繼承Struts1的Hotspot對(duì)需求進(jìn)行設(shè)計(jì)packagehello;importjavax.servlet..HttpServletRequest;importorg.apache.struts.action.ActionMessage;importorg.apache.struts.action.ActionErrors;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionMapping;publicfinalclassHelloFormextendsActionForm{privateStringuserName=null;publicStringgetUserName(){return(this.userName);}publicvoidsetUserName(StringuserName){this.userName=userName;}

publicvoidreset(ActionMappingmapping,HttpServletRequestrequest){this.userName=null;}

publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest){ActionErrorserrors=newActionErrors();if((userName==null)||(userName.length()<1))errors.add("username",newActionMessage("hello.no.username.error"));returnerrors;}}1〕ActionForm負(fù)責(zé)request中表單數(shù)據(jù)的接收,并進(jìn)行必要的有效性檢查。如果驗(yàn)證正確,那么ActionServlet調(diào)用相應(yīng)的Action,否那么產(chǎn)生錯(cuò)誤轉(zhuǎn)交給JSP視圖處理。HotspotHtml提交的userName表單項(xiàng)就是利用該接口給屬性u(píng)serName賦值。該方法被調(diào)用,驗(yàn)證userName表單項(xiàng)內(nèi)容是否為空。errors為哈希表結(jié)構(gòu),驗(yàn)證合法時(shí),其單元長(zhǎng)度為0;

ActionMessage對(duì)象可以讀取perties文本文件獲得相應(yīng)的字符串。提供reset接口對(duì)屬性設(shè)置默認(rèn)值。#ApplicationResourcesforthe"Hello"sampleapplication#ApplicationResourcesthatarespecifictothehello.jspfilehello.jsp.title=Hello-AfirstStrutsprogramhello.jsp.page.heading=HelloWorld!AfirstStrutsapplicationmpt.person=PleaseenteraUserNametosayhelloto:hello.jsp.page.hello=Hello#ValidationanderrormessagesforHelloForm.javaandHelloAction.javahello.dont.talk.to.monster=Wedon'twanttosayhellotoMonster!!!hello.no.username.error=Pleaseentera<i>UserName</i>tosayhelloto!perties文本文件內(nèi)容2〕實(shí)現(xiàn)控制器調(diào)用相應(yīng)模型對(duì)象的功能:從FormBean中得到提交的數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行邏輯判斷,如果有問題那么調(diào)用ActionForward提交給相應(yīng)的JSP視圖,如果沒有問題,那么產(chǎn)生JavaBean進(jìn)行業(yè)務(wù)邏輯處理,并將JavaBean對(duì)象放入request當(dāng)中,再指出下一步處理的JSP視圖,由視圖從request當(dāng)中取出進(jìn)行處理。StringbadUserName="Monster";//邏輯判斷if(userName.equalsIgnoreCase(badUserName)){errors.add("username",newActionMessage("hello.dont.talk.to.monster",badUserName));saveErrors(request,errors);//得到處理錯(cuò)誤的JSP視圖return(newActionForward(mapping.getInput()));}//產(chǎn)生相應(yīng)的JavaBean,用于特定的業(yè)務(wù)規(guī)那么處理PersonBeanpb=newPersonBean();pb.setUserName(userName);pb.saveToPersistentStore();

//將產(chǎn)生的pb對(duì)象的引用放入request當(dāng)中,由JSP視圖取出處理request.setAttribute(Constants.PERSON_KEY,pb);//得到FormBean并從request當(dāng)中刪除,因?yàn)椴恍枰鋵傩赃M(jìn)行再轉(zhuǎn)發(fā)request.removeAttribute(mapping.getAttribute());//將控制權(quán)轉(zhuǎn)交return(mapping.findForward("SayHello"));}}packagehello;importjavax.servlet.RequestDispatcher;importjavax.servlet.ServletException;importjavax.servlet..HttpServletRequest;importjavax.servlet..HttpSession;importjavax.servlet..HttpServletResponse;importorg.apache.struts.action.Action;importorg.apache.struts.action.ActionMessage;importorg.apache.struts.action.ActionMessages;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionForward;importorg.apache.struts.action.ActionMapping;importorg.apache.struts.util.MessageResources;publicfinalclassHelloActionextendsAction{//本方法將由ActionServlet自動(dòng)調(diào)用publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{ActionMessageserrors=newActionMessages();//從FormBean中得到提交數(shù)據(jù)StringuserName=(String)((HelloForm)form).getUserName();Hotspot//本類類型是JavaBean,是處理實(shí)際業(yè)務(wù)邏輯的類。packagehello;publicclassPersonBean{privateStringuserName=null;publicStringgetUserName(){returnthis.userName;}publicvoidsetUserName(StringuserName){this.userName=userName;}//提交userName的持久化處理,例如存入數(shù)據(jù)庫(kù)或文件當(dāng)中

publicvoidsaveToPersistentStore(){}}//系統(tǒng)中使用的所有常量在此定義packagehello;publicfinalclassConstants{publicstaticfinalStringPERSON_KEY="personbean“;}持久存儲(chǔ)的Framework可參見Hibenate3〕JSP視圖。<%@tagliburi="/WEB-INF/struts-bean.tld"prefix="bean"%><%@tagliburi="/WEB-INF/struts-html.tld"prefix="html"%><%@tagliburi="/WEB-INF/struts-logic.tld"prefix="logic"%><html:htmllocale="true"><head><title><bean:messagekey="hello.jsp.title"/></title><html:base/></head><bodybgcolor="white"><p><h2><bean:messagekey="hello.jsp.page.heading"/></h2><p><html:errors/><p><logic:presentname="personbean"scope="request"><h2><bean:messagekey="hello.jsp.page.hello"/><bean:writename="personbean"property="userName"/>!<p></h2></logic:present><html:formaction="/HelloWorld.do"focus="userName"><bean:messagekey="mpt.person"/><html:textproperty="userName"size="16"maxlength="16"/><br><html:submitproperty="submit"value="Submit"/><html:reset/></html:form><br></body></html:html>當(dāng)JavaBean存放在request當(dāng)中時(shí),<logic:present>主體才被執(zhí)行,通過<bean:write>得到request中指定javabean的屬性值。第二次調(diào)用后,在提交參數(shù)沒有錯(cuò)誤的情況下執(zhí)行。聲明和加載標(biāo)簽庫(kù),JSP中不再存在Java代碼。對(duì)ActionForm以及Action中的錯(cuò)誤進(jìn)行顯示處理。不再存在直接的文本內(nèi)容,利用<bean:message>從perties中得到key對(duì)應(yīng)的字符串。生成相應(yīng)的html標(biāo)簽,第一次調(diào)用時(shí)只有此局部執(zhí)行。<?xmlversion="1.0"encoding="ISO-8859-1"?><!DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.1//EN"":///struts/dtds/struts-config_1_1.dtd"><struts-config><!--========FormBeanDefinitions===================================--><form-beans><form-beanname="HelloForm"type="hello.HelloForm"/></form-beans><!--==========ActionMappingDefinitions==============================--><action-mappings><!--SayHello!--><actionpath=“/HelloWorld“//action的url,即html頁(yè)面form標(biāo)記中的action屬性對(duì)應(yīng)type=“hello.HelloAction”//action的包路徑name=“HelloForm“//指定action處理的ActionForm,與<form-beans>中的name對(duì)應(yīng)scope=“request“//指定ActionForm的存放范圍,還可選擇page、session、applicationvalidate=“true“//如果為true,那么ActionServlet調(diào)用ActionForm的validte()方法。input=“/hello.jsp“//ActionForm的validte()返回錯(cuò)誤時(shí)的調(diào)用頁(yè)面。>//action中execute()執(zhí)行完畢后的轉(zhuǎn)發(fā)頁(yè)面,可以設(shè)置多個(gè)<forward>,但name應(yīng)不同<forwardname="SayHello"path="/hello.jsp"/></action></action-mappings><!--==========MessageResourcesDefinitions===========================--><message-resourcesparameter="hello.application"/></struts-config>Struts1〔三〕應(yīng)用部署一個(gè)應(yīng)用最終如果能被struts框架“知道”,一定要在struts-config.xml中進(jìn)行配置。每個(gè)應(yīng)用都需要在<form-beans>中

配置<form-bean>項(xiàng),在<action-mappings>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論