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

下載本文檔

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

文檔簡介

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

response

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

Model1BrowserData

response

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

Model2定義:Struts1是在JSPModel2根底上實現(xiàn)的一個MVC框架。Web客戶WebServerAction〔模型〕ActionFormJavaBean控制器ActionServlet視圖JSPActionActionServlet/JSP容器Struts1實現(xiàn)的MVC框架MVC結(jié)構視圖〔電視〕控制器〔遙控器〕模型〔頻道〕選擇視圖用戶請求響應請求狀態(tài)查詢通知更新方法調(diào)用事件控制器視圖模型接受用戶請求調(diào)用模型響應用戶請求選擇視圖顯示模型處理結(jié)果把用戶數(shù)據(jù)傳給用戶控制器顯示模型狀態(tài)響應模型狀態(tài)更新封裝應用程序狀態(tài)響應狀態(tài)查詢處理業(yè)務流程通知視圖更新狀態(tài)Struts框架提供的Hotspot主要有Action和Formbean,應用程序需要繼承這兩個類,此外還需編寫含有業(yè)務邏輯的JavaBean。Struts提供Taglibrary,在JSP中便于對JavaBean、Html、錯誤消息、perties〔本地文字〕的訪問和處理。配置web.xml讓JSP容器“知曉”struts框架,配置struts-config.xml讓struts“知曉”特定的應用。做到這三點,應用程序就充分利用了Struts框架,具有了MVC體系結(jié)構的設計特點Struts1主要構件調(diào)用關系圖Struts1〔一〕環(huán)境配置〔Tomcat〕目錄描述/bin存放windows、Linux平臺啟動和關閉腳本文件/conf存放tomcat的重要配置文件,尤其是server.xml/server子目錄lib下存放tomcat所需的JAR文件;子目錄webapps下存放tomcat自帶的admin和manager兩個應用/common/lib存放tomcat和所有web應用都可以訪問的JAR文件/shared/lib存放所有web應用都可以訪問的JAR文件/logs存放tomcat的日志文件/webappsweb應用的發(fā)布目錄/work由JSP生成的Servlet存放于此表:Tomcat主要目錄用途描述Hello應用下部署struts1的jar文件Hello應用下部署struts1的標簽文件Struts1是Tomcat的一個應用,而用戶建立的應用又是Struts1的一個應用,因而需要進行相應的配置工作,主要分為Tomcat配置、環(huán)境變量配置、struts1應用配置。<?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”的請求都轉(zhuǎn)給Controller〔ActionServlet〕進行處理,并對Controller的包路徑和轉(zhuǎn)載參數(shù)〔struts-config.xml〕進行了設置。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>對應用的標簽庫文件進行設置。默認歡送頁面的設置。web.xml文件配置〔二〕Struts1〔二〕應用開發(fā)應用需求1)如果用戶輸入姓名<name>,返回字符串“Hello<name>!”。2)如果用戶沒有輸入姓名就提交表單,返回錯誤信息,并提示用戶輸入姓名。3)輸入“Monster”,返回錯誤信息,拒絕與其打招呼。繼承Struts1的Hotspot對需求進行設計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負責request中表單數(shù)據(jù)的接收,并進行必要的有效性檢查。如果驗證正確,那么ActionServlet調(diào)用相應的Action,否那么產(chǎn)生錯誤轉(zhuǎn)交給JSP視圖處理。HotspotHtml提交的userName表單項就是利用該接口給屬性userName賦值。該方法被調(diào)用,驗證userName表單項內(nèi)容是否為空。errors為哈希表結(jié)構,驗證合法時,其單元長度為0;

ActionMessage對象可以讀取perties文本文件獲得相應的字符串。提供reset接口對屬性設置默認值。#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〕實現(xiàn)控制器調(diào)用相應模型對象的功能:從FormBean中得到提交的數(shù)據(jù),對數(shù)據(jù)進行邏輯判斷,如果有問題那么調(diào)用ActionForward提交給相應的JSP視圖,如果沒有問題,那么產(chǎn)生JavaBean進行業(yè)務邏輯處理,并將JavaBean對象放入request當中,再指出下一步處理的JSP視圖,由視圖從request當中取出進行處理。StringbadUserName="Monster";//邏輯判斷if(userName.equalsIgnoreCase(badUserName)){errors.add("username",newActionMessage("hello.dont.talk.to.monster",badUserName));saveErrors(request,errors);//得到處理錯誤的JSP視圖return(newActionForward(mapping.getInput()));}//產(chǎn)生相應的JavaBean,用于特定的業(yè)務規(guī)那么處理PersonBeanpb=newPersonBean();pb.setUserName(userName);pb.saveToPersistentStore();

//將產(chǎn)生的pb對象的引用放入request當中,由JSP視圖取出處理request.setAttribute(Constants.PERSON_KEY,pb);//得到FormBean并從request當中刪除,因為不需要其屬性進行再轉(zhuǎn)發(fā)request.removeAttribute(mapping.getAttribute());//將控制權轉(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自動調(diào)用publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{ActionMessageserrors=newActionMessages();//從FormBean中得到提交數(shù)據(jù)StringuserName=(String)((HelloForm)form).getUserName();Hotspot//本類類型是JavaBean,是處理實際業(yè)務邏輯的類。packagehello;publicclassPersonBean{privateStringuserName=null;publicStringgetUserName(){returnthis.userName;}publicvoidsetUserName(StringuserName){this.userName=userName;}//提交userName的持久化處理,例如存入數(shù)據(jù)庫或文件當中

publicvoidsaveToPersistentStore(){}}//系統(tǒng)中使用的所有常量在此定義packagehello;publicfinalclassConstants{publicstaticfinalStringPERSON_KEY="personbean“;}持久存儲的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>當JavaBean存放在request當中時,<logic:present>主體才被執(zhí)行,通過<bean:write>得到request中指定javabean的屬性值。第二次調(diào)用后,在提交參數(shù)沒有錯誤的情況下執(zhí)行。聲明和加載標簽庫,JSP中不再存在Java代碼。對ActionForm以及Action中的錯誤進行顯示處理。不再存在直接的文本內(nèi)容,利用<bean:message>從perties中得到key對應的字符串。生成相應的html標簽,第一次調(diào)用時只有此局部執(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頁面form標記中的action屬性對應type=“hello.HelloAction”//action的包路徑name=“HelloForm“//指定action處理的ActionForm,與<form-beans>中的name對應scope=“request“//指定ActionForm的存放范圍,還可選擇page、session、applicationvalidate=“true“//如果為true,那么ActionServlet調(diào)用ActionForm的validte()方法。input=“/hello.jsp“//ActionForm的validte()返回錯誤時的調(diào)用頁面。>//action中execute()執(zhí)行完畢后的轉(zhuǎn)發(fā)頁面,可以設置多個<forward>,但name應不同<forwardname="SayHello"path="/hello.jsp"/></action></action-mappings><!--==========MessageResourcesDefinitions===========================--><message-resourcesparameter="hello.application"/></struts-config>Struts1〔三〕應用部署一個應用最終如果能被struts框架“知道”,一定要在struts-config.xml中進行配置。每個應用都需要在<form-beans>中

配置<form-bean>項,在<action-mappings>

溫馨提示

  • 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

提交評論