框架式編程和設(shè)計模式_第1頁
框架式編程和設(shè)計模式_第2頁
框架式編程和設(shè)計模式_第3頁
框架式編程和設(shè)計模式_第4頁
框架式編程和設(shè)計模式_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第10章

框架式編程和設(shè)計模式孫燾重點:框架式編程1MVC編程思想

2structs概述與舉例

3難點:MVC編程思想理解

1structs流程

210.1框架式編程什么是模式什么是框架為什么要用模式為什么要用框架常見的設(shè)計模式常見的java框架10.1框架式編程10.1.1什么是模式模式,即pattern。其實就是解決某一類問題的方法論。你把解決某類問題的方法總結(jié)歸納到理論高度,那就是模式。

Alexander給出的經(jīng)典定義是:每個模式都描述了一個在我們的環(huán)境中不斷出現(xiàn)的問題,然后描述了該問題的解決方案的核心。通過這種方式,你可以無數(shù)次地使用那些已有的解決方案,無需在重復(fù)相同的工作。模式有不同的領(lǐng)域,建筑領(lǐng)域有建筑模式,軟件設(shè)計領(lǐng)域也有設(shè)計模式。當一個領(lǐng)域逐漸成熟的時候,自然會出現(xiàn)很多模式。

10.1框架式編程10.1.2什么是框架

框架,即framework。是整個或部分系統(tǒng)的可重用設(shè)計,表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實例間交互的方法;另一種定義認為,框架是可被應(yīng)用開發(fā)者定制的應(yīng)用骨架。前者是從應(yīng)用方面而后者是從目的方面給出的定義??蚣?,其實就是某種應(yīng)用的半成品,就是一組組件,供你選用完成你自己的系統(tǒng)。簡單說就是使用別人搭好的舞臺,你來做表演。而且,框架一般是成熟的,不斷升級的軟件。

10.1框架式編程10.1.3為什么要用模式

因為模式是一種指導(dǎo),在一個良好的指導(dǎo)下,有助于你完成任務(wù),有助于你作出一個優(yōu)良的設(shè)計方案,達到事半功倍的效果。而且會得到解決問題的最佳辦法。

10.1框架式編程10.1.4為什么要用框架

因為軟件系統(tǒng)發(fā)展到今天已經(jīng)很復(fù)雜了,特別是服務(wù)器端軟件,設(shè)計到的知識,內(nèi)容,問題太多。在某些方面使用別人成熟的框架,就相當于讓別人幫你完成一些基礎(chǔ)工作,你只需要集中精力完成系統(tǒng)的業(yè)務(wù)邏輯設(shè)計。而且框架一般是成熟,穩(wěn)健的,他可以處理系統(tǒng)很多細節(jié)問題,比如,事物處理,安全性,數(shù)據(jù)流控制等問題。還有框架一般都經(jīng)過很多人使用,所以結(jié)構(gòu)很好,所以擴展性也很好,而且它是不斷升級的,你可以直接享受別人升級代碼帶來的好處。

框架一般處在低層應(yīng)用平臺(如J2EE)和高層業(yè)務(wù)邏輯之間的中間層。

10.1框架式編程10.1.5常見的設(shè)計模式最常見的MVC模式。

MVC模式是1996年由Buschmann提出的:

模型(Model):就是封裝數(shù)據(jù)和所有基于對這些數(shù)據(jù)的操作。

視圖(View):就是封裝的是對數(shù)據(jù)顯示,即用戶界面。

控制器(Control):就是封裝外界作用于模型的操作和對數(shù)據(jù)流向的控制等。

10.1框架式編程10.1.6常見的JAVA框架(1)WAF:

全稱:WEBAPPLICATIONFRAMEWORK

主要應(yīng)用方面:EJB層,(WEB層也有,但是比較弱)。

主要應(yīng)用技術(shù):EJB等

出處:/blueprints/code/index.html

簡述:這是SUN在展示J2EE平臺時所用的例子PetStore(寵物商店系統(tǒng))里面的框架。是SUN藍皮書例子程序中提出的應(yīng)用框架。它實現(xiàn)了MVC和其他良好的設(shè)計模式。SUN的網(wǎng)站上有技術(shù)資料,最好下載PetStore來研究,WEBLOGIC里自帶此系統(tǒng),源碼在bea\weblogic700\samples\server\src\petstore。這是學(xué)習了解J2EE的首選框架。

免費。

10.1框架式編程10.1.6常見的JAVA框架(2)StrutsStruts是一個基于SunJ2EE平臺的MVC框架,主要是采用Servlet和JSP技術(shù)來實現(xiàn)的。由于Struts能充分滿足應(yīng)用開發(fā)的需求,簡單易用,敏捷迅速,頗受關(guān)注。Struts把Servlet、JSP、自定義標簽和信息資源(messageresources)整合到一個統(tǒng)一的框架中,開發(fā)人員利用其進行開發(fā)時不用再自己編碼實現(xiàn)全套MVC模式,極大的節(jié)省了時間,所以說Struts是一個非常不錯的應(yīng)用框架。10.1框架式編程10.1.6常見的JAVA框架(3)SpringFrameworkSpring是一個解決了許多在J2EE開發(fā)中常見的問題的強大框架。Spring提供了管理業(yè)務(wù)對象的一致方法并且鼓勵了注入對接口編程而不是對類編程的良好習慣。Spring的架構(gòu)基礎(chǔ)是基于使用JavaBean屬性的InversionofControl容器。然而,這僅僅是完整圖景中的一部分:Spring在使用IoC容器作為構(gòu)建完關(guān)注所有架構(gòu)層的完整解決方案方面是獨一無二的。Spring提供了唯一的數(shù)據(jù)訪問抽象,包括簡單和有效率的JDBC框架,極大的改進了效率并且減少了可能的錯誤。Spring的數(shù)據(jù)訪問架構(gòu)還集成了Hibernate和其他O/Rmapping解決方案。Spring還提供了唯一的事務(wù)管理抽象,它能夠在各種底層事務(wù)管理技術(shù),例如JTA或者JDBC事務(wù)提供一個一致的編程模型。Spring提供了一個用標準Java語言編寫的AOP框架,它給POJOs提供了聲明式的事務(wù)管理和其他企業(yè)事務(wù)。這個框架足夠強大,使得應(yīng)用程序能夠拋開EJB的復(fù)雜性,同時享受著和傳統(tǒng)EJB相關(guān)的關(guān)鍵服務(wù)。Spring還提供了可以和IoC容器集成的強大而靈活的MVCWeb框架。

10.1框架式編程10.1.6常見的JAVA框架(4)HibernateHibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。Hibernate可以應(yīng)用在任何使用JDBC的場合,既可以在Java的客戶端程序?qū)嵱茫部梢栽赟ervlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。

10.2MVC編程思想

10.2MVC編程思想MVC是什么MVC設(shè)計模式MVC的優(yōu)點MVC的缺點MVC例子10.2MVC編程思想MVC是什么MVC是一種目前廣泛流行的軟件設(shè)計模式,早在70年代,IBM就推出了Sanfronscisico項目計劃,其實就是MVC設(shè)計模式的研究。近來,隨著J2EE的成熟,它正在成為在J2EE平臺上推薦的一種設(shè)計模型,也是廣大Java開發(fā)者非常感興趣的設(shè)計模型。MVC模式也逐漸在PHP和ColdFusion開發(fā)者中運用,并有增長趨勢。隨著網(wǎng)絡(luò)應(yīng)用的快速增加,MVC模式對于Web應(yīng)用的開發(fā)無疑是一種非常先進的設(shè)計思想,無論你選擇哪種語言,無論應(yīng)用多復(fù)雜,它都能為你理解分析應(yīng)用模型時提供最基本的分析方法,為你構(gòu)造產(chǎn)品提供清晰的設(shè)計框架,為你的軟件工程提供規(guī)范的依據(jù)。

10.2MVC編程思想MVC設(shè)計模式MVC英文即Model-View-Controller,即把一個應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應(yīng)用被分成三個層——模型層、視圖層、控制層

10.2MVC編程思想MVC設(shè)計模式模型(Model):就是業(yè)務(wù)流程/狀態(tài)的處理以及業(yè)務(wù)規(guī)則的制定。業(yè)務(wù)流程的處理過程對其它層來說是黑箱操作,模型接受視圖請求的數(shù)據(jù),并返回最終的處理結(jié)果。業(yè)務(wù)模型的設(shè)計可以說是MVC最主要的核心。目前流行的EJB模型就是一個典型的應(yīng)用例子,它從應(yīng)用技術(shù)實現(xiàn)的角度對模型做了進一步的劃分,以便充分利用現(xiàn)有的組件,但它不能作為應(yīng)用設(shè)計模型的框架。它僅僅告訴你按這種模型設(shè)計就可以利用某些技術(shù)組件,從而減少了技術(shù)上的困難。對一個開發(fā)者來說,就可以專注于業(yè)務(wù)模型的設(shè)計。MVC設(shè)計模式告訴我們,把應(yīng)用的模型按一定的規(guī)則抽取出來,抽取的層次很重要,這也是判斷開發(fā)人員是否優(yōu)秀的設(shè)計依據(jù)。抽象與具體不能隔得太遠,也不能太近。MVC并沒有提供模型的設(shè)計方法,而只告訴你應(yīng)該組織管理這些模型,以便于模型的重構(gòu)和提高重用性。我們可以用對象編程來做比喻,MVC定義了一個頂級類,告訴它的子類你只能做這些,但沒法限制你能做這些。這點對編程的開發(fā)人員非常重要。10.2MVC編程思想MVC設(shè)計模式視圖(View)代表用戶交互界面,對于Web應(yīng)用來說,可以概括為HTML界面,但有可能為XHTML、XML和Applet。隨著應(yīng)用的復(fù)雜性和規(guī)模性,界面的處理也變得具有挑戰(zhàn)性。一個應(yīng)用可能有很多不同的視圖,MVC設(shè)計模式對于視圖的處理僅限于視圖上數(shù)據(jù)的采集和處理,以及用戶的請求,而不包括在視圖上的業(yè)務(wù)流程的處理。業(yè)務(wù)流程的處理交予模型(Model)處理。比如一個訂單的視圖只接受來自模型的數(shù)據(jù)并顯示給用戶,以及將用戶界面的輸入數(shù)據(jù)和請求傳遞給控制和模型。

10.2MVC編程思想MVC設(shè)計模式控制(Controller)可以理解為從用戶接收請求,將模型與視圖匹配在一起,共同完成用戶的請求。劃分控制層的作用也很明顯,它清楚地告訴你,它就是一個分發(fā)器,選擇什么樣的模型,選擇什么樣的視圖,可以完成什么樣的用戶請求。控制層并不做任何的數(shù)據(jù)處理。例如,用戶點擊一個連接,控制層接受請求后,并不處理業(yè)務(wù)信息,它只把用戶的信息傳遞給模型,告訴模型做什么,選擇符合要求的視圖返回給用戶。因此,一個模型可能對應(yīng)多個視圖,一個視圖可能對應(yīng)多個模型。

10.2MVC編程思想10.2MVC編程思想MVC的優(yōu)點1.低耦合性。視圖層和業(yè)務(wù)層分離,這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼,同樣,一個應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則的改變只需要改動MVC的模型層即可。因為模型與控制器和視圖相分離,所以很容易改變應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。

2.高重用性和可適用性3.較低的生命周期成本4.快速的部署5.可維護性。分熟視圖層和業(yè)務(wù)邏輯層也使得WEB應(yīng)用更易于維護和修改

6.有利于軟件工程化管理10.2MVC編程思想MVC的缺點MVC的缺點是由于它沒有明確的定義,所以完全理解MVC并不是很容易。使用MVC需要精心的計劃,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費一些時間去思考。

MVC并不適合小型甚至中等規(guī)模的應(yīng)用程序,花費大量時間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通常會得不償失。

MVC設(shè)計模式是一個很好創(chuàng)建軟件的途徑,它所提倡的一些原則,像內(nèi)容和顯示互相分離可能比較好理解。但是如果你要隔離模型、視圖和控制器的構(gòu)件,你可能需要重新思考你的應(yīng)用程序,尤其是應(yīng)用程序的構(gòu)架方面。如果你肯接受MVC,并且有能力應(yīng)付它所帶來的額外的工作和復(fù)雜性,MVC將會使你的軟件在健壯性,代碼重用和結(jié)構(gòu)方面上一個新的臺階。

10.2MVC編程思想MVC的例子servlet.java(MVC中的C)

package

zz;

importjava.io.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassservletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponse

response)throwsServletException,IOException{

HttpSession

session=request.getSession();

NameBeannameBean=newNameBean();

Stringname=request.getParameter("name");

nameBean.setname(name);

session.setAttribute("nameBean",nameBean);

Stringadd="/WEB-INF/classes/ShowName.jsp";

RequestDispatcher dispatcher=request.getRequestDispatcher(add);

dispatcher.forward(request,response);

}

}10.2MVC編程思想MVC的例子NameBean.java(MVC中的M)

packagezz;

publicclassNameBean{

privateStringname;

publicNameBean(){}

publicNameBean(Stringname){

setname(name);

}

publicStringgetname(){

returnname;

}

publicvoidsetname(Stringname){

=name;

}

}

10.2MVC編程思想10.2MVC編程思想MVC的例子ShowName.jsp(MVC中的V)

<%@pagesession="true"%>

<HTML>

<HEAD>

<TITLE></TITLE>

</HEAD>

<BODY>

<jsp:useBeanid="nameBean"type="zz.NameBean"

scope="session"/>

<jsp:getPropertyname="nameBean"property="name"/>

</body>

</html>

10.3struts概述與舉例

Struts1簡介及存在的問題

WebWork簡介

Struts2框架處理流程

Struts2和Struts1的對比Struts2框架開發(fā)應(yīng)用的過程

Struts2編寫Action

Struts2配置Action

Struts2下的helloworld

10.3struts概述與舉例Struts1簡介及存在的問題1.Model部分模型主要由底層的業(yè)務(wù)邏輯組件充當,它們提供數(shù)據(jù)庫訪問和業(yè)務(wù)邏輯的實現(xiàn)。可以是javaBean、EJB組件或者WebService服務(wù),struts1沒有為實現(xiàn)Model組件提供任何支持2.View部分采用JSP實現(xiàn),Struts1提供了豐富的標簽庫,減少JSP腳本的使用3.

Controller由核心控制核心控制器-ActionServlet和用戶自定義Action組合,由struts1框架提供支持缺陷1.

支持表現(xiàn)層技術(shù)單一只支持JSP,不提供與其它表現(xiàn)層技術(shù)整合,如FreeMarker\Velocity2.與ServletApi嚴重耦合,難于測試Action類包括HtttpServletRequest、HttpServletResponse3.代碼嚴重依賴于Struts1Api,屬于侵入式設(shè)計Aciton類必須繼承Action的基類10.3struts概述與舉例WebWork簡介struts2是webwork的升級,webwork到struts2是一次平滑的過渡。它來自另一個開源組織:opensymphony(交響樂)1.View它支持更多的表現(xiàn)層技術(shù):velocity、freeMarker和xslt等2.Controller提供核心控制器ServletDispatcher業(yè)務(wù)邏輯Action:,無需與servletapi耦合,由Action攔截器負責數(shù)據(jù)初始化,它只是一個普通的實現(xiàn)了webworkAction接口的POJO(包含了一個execute方法)10.3struts概述與舉例Struts2框架處理流程

10.3struts概述與舉例Struts2框架處理流程

1.用戶請求2.核心控制器FilterDispatcher根據(jù)請求決定調(diào)用的Action3.struts2攔截器鏈自動對請求應(yīng)用通用功能4.回調(diào)Action的execute方法5.execute方法返回處理結(jié)果10.3struts概述與舉例struts2和struts1的對比1、Action類struts1要繼承一個抽象基類,屬于抽象類編程而不是接口;struts2中Action實現(xiàn)接口是不必需的,只要一個包含execute的POJO類就要以作struts2的Action2、線程模式struts1的Action是單例模式并且必須是線程安全的,它用一個Action實例處理所有的請求;Struts2為每一個請求產(chǎn)生一個實例,沒有線程安全的問題3、Servlet依賴struts1的Action嚴重依賴ServletApi,使得測試要依賴web容器4、封裝請求參數(shù)struts1使用ActionForm對象封裝用戶請求參數(shù),雖然支持使用動態(tài)的ActionForm來簡化ActionForm開發(fā),但依然要在配置文件中定義ActionForm;struts2可以直接使用Action的屬性來封裝用戶請求參數(shù),也可以使用Model對象來封裝請求參數(shù),Model卻只是一個POJO5、執(zhí)行控制struts1一個模塊對應(yīng)一個請求,Action的資源必須是線程安全的,模塊中的Action共享相同的生命周期;struts2支持通過攔截器堆棧為每一個Action創(chuàng)建不同的生命周期(Action不是單例的)6、表達式語言struts1整合了JSTL,可以使用JSTL表達式語言。struts2可以使用JSTL,還整合了一種更強大和靈活的語言:OGNL(objectgraphnotationlanguae)

10.3struts概述與舉例Struts2框架開發(fā)應(yīng)用的過程第一步:創(chuàng)建Web工程第二步:引入Struts的類庫,核心的類庫有ognl.jar、freemarker.jar、struts2-core.jar、webwork.jar,common-logging,這些類庫最終都應(yīng)該在web-inf/lib下面。第三步:在web.xml中聲明中心控制器。

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>通過這樣的配置,所有的請求都會發(fā)送給中心控制器。第四步:在工程中創(chuàng)建struts2的配置文件struts.xml。配置我們編寫的每個Action,還有請求與Action對應(yīng)關(guān)系,執(zhí)行結(jié)果(字符串)與響應(yīng)界面的對應(yīng)關(guān)系。一般從其他地方拷貝,不要自己寫。第五步:編寫Action,配置Action。在開發(fā)過程中主要是這一步。10.3struts概述與舉例Struts2編寫ActionAction類可以是普通的類,可以是實現(xiàn)Action接口的類,可以是繼承ActionSupport的類。Action接口是execute方法和幾個常量,通常不使用。ActionSupport實現(xiàn)了Action接口,并且封裝了對國際化和驗證的支持,如果項目需要使用驗證和國際化等功能,可以繼承該類。Action類中的方法(控制方法),方法的返回值是字符串,是邏輯名字,表示某個輸出界面。方法沒有參數(shù)。對應(yīng)每個請求都應(yīng)該有這樣一個方法。為了獲取輸入信息,需要定義與輸入元素名字相同的成員變量,并提供set方法。為了輸出,需要編寫成員變量來表示這些輸出信息(在控制方法中對成員變量賦值),并提供get方法供框架調(diào)用。10.3struts概述與舉例Struts2配置Action在struts.xml中配置。主要包括兩部分:請求與具體的Action的方法的對應(yīng)關(guān)系;Action中的控制方法返回的字符串與具體的響應(yīng)界面的對應(yīng)關(guān)系。請求與Action方法的對應(yīng)關(guān)系:<actionname="login"class="action.UserAction"method="login">name指出請求的名字,class指出Action類的名字,method指出方法的名字

<actionname="login"class="action.UserAction">如果沒有指定method方法,默認找Action中的execute方法也可以在請求中指定方法的名字login!login.action,“!”之前是請求的名字,“!”之后是方法的名字,這樣在配置的時候就可以不指定方法的名字。執(zhí)行結(jié)果的配置:<resultname="success">/success.jsp</result>10.3struts概述與舉例Struts2下的helloworld使用:JDK1.5.0_17+eclipse-jee-europa-winter-win32+Tomcat5.5+struts-2.0.14-ga

下是Struts2HelloWorld實例的文件內(nèi)容。在eclipse中新建一個動態(tài)Web工程,命名為hello。

10.3struts概述與舉例(HelloWorld.java)

package

tutorial;//

導(dǎo)入創(chuàng)建一個Struts2action必須擴展的一個類import

com.opensymphony.xwork2.ActionSupport;/**

*

創(chuàng)建一個action

HelloWorld

*

創(chuàng)建一個Struts2

action必須擴展ActionSupport類

*/public

class

HelloWorld

extends

ActionSupport{

public

static

final

String

MESSAGE

=

"HelloWorld";

//action被請求時執(zhí)行的方法

public

Stringexecute()

throws

Exception{

setMessage(MESSAGE);

//

常量“SUCCESS”是在ActionSupport所實現(xiàn)的Action接口中定義的action的返回結(jié)果

return

SUCCESS;

}

private

String

message;

//

設(shè)置消息內(nèi)容

public

void

setMessage(Stringmessage){

this.message

=message;

}

//

取得消息內(nèi)容

public

StringgetMessage(){

return

message;

}}10.3struts概述與舉例HelloWorld.jsp

<%@

taglib

prefix="s"

uri="/struts-tags"

%><!--

第一行引用了Struts2的標簽庫

-->

<html>

<head>

<title>HelloWorld!</title>

</head>

<body>

<!--

使用Struts標簽獲得action的屬性值,通過action屬性的setters和getters-->

<h2><s:property

value="message"

/></h2>

</body></html>10.3struts概述與舉例10.3struts概述與舉例struts.xml

<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

struts

PUBLIC

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論