第8章MVC設(shè)計(jì)模式_第1頁(yè)
第8章MVC設(shè)計(jì)模式_第2頁(yè)
第8章MVC設(shè)計(jì)模式_第3頁(yè)
第8章MVC設(shè)計(jì)模式_第4頁(yè)
第8章MVC設(shè)計(jì)模式_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章MVC模式目錄8.1MVC模式8.2Struts28.3配置詳解8.1MVC模式什么是模式?23種設(shè)計(jì)模式體系結(jié)構(gòu)(架構(gòu))模式MVC模式模型-視圖-控制器(MVC)是80年代Smalltalk-80出現(xiàn)的一種軟件設(shè)計(jì)模式,現(xiàn)在已經(jīng)被廣泛的使用MVC是一種軟件設(shè)計(jì)模式,不僅僅應(yīng)用于WEB。在日常生活中處處可以找到類似于MVC的例子。在WEB應(yīng)用上,J2EE平臺(tái)最先應(yīng)用MVC設(shè)計(jì)模式,并成為一個(gè)事實(shí)上的標(biāo)準(zhǔn)。數(shù)據(jù)與顯示分離什么是MVC設(shè)計(jì)模式

1、模型(Model)

業(yè)務(wù)邏輯層。用于封裝業(yè)務(wù)邏輯和數(shù)據(jù)模型。

2、視圖(View)

表示層。就是與用戶實(shí)現(xiàn)交互的界面,通常實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出功能。

3、控制器(controller)

控制層。起到控制整個(gè)業(yè)務(wù)流程的作用,實(shí)現(xiàn)View層跟Model層的協(xié)同工作。

模型

模型(Model):就是業(yè)務(wù)流程/狀態(tài)的處理以及數(shù)據(jù)模型的制定。業(yè)務(wù)流程的處理過(guò)程對(duì)其它層來(lái)說(shuō)是黑箱操作,模型接受視圖請(qǐng)求的數(shù)據(jù),并返回最終的處理結(jié)果。模型的設(shè)計(jì)可以說(shuō)是MVC最主要的核心。Struts2Struts2MVC模式的信息管理系統(tǒng)8.2View組件——視圖層作用:實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)的輸入和顯示,外部對(duì)象與系統(tǒng)進(jìn)行交互和通信要通過(guò)視圖層。一般視圖就是為操作者顯示的窗口界面,操作者通過(guò)該窗口來(lái)進(jìn)行系統(tǒng)管理。職責(zé):與操作者進(jìn)行交互功能:

(1)提供數(shù)據(jù)輸入的機(jī)制。如表單。

(2)顯示業(yè)務(wù)數(shù)據(jù)。

1)列表方式

2)詳細(xì)方式Model組件作用:用于封裝與應(yīng)用程序的業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)以及對(duì)數(shù)據(jù)的處理方法。模型有對(duì)數(shù)據(jù)直接訪問(wèn)的權(quán)利,模型不依賴與視圖和控制也就是他不關(guān)心如何被顯示和被操作。職責(zé):業(yè)務(wù)處理。主要功能:

(1)表達(dá)業(yè)務(wù)數(shù)據(jù):表達(dá)存儲(chǔ)在數(shù)據(jù)庫(kù)中的業(yè)務(wù)數(shù)據(jù)。(2)業(yè)務(wù)數(shù)據(jù)持久化:將業(yè)務(wù)數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。(3)業(yè)務(wù)處理方法:管理系統(tǒng)的核心功能是模擬業(yè)務(wù)代理,代替人工的處理模式,實(shí)現(xiàn)信息管理的高效率和低成本。8.3Control組件職責(zé):協(xié)調(diào)View和Mode組件,控制整個(gè)系統(tǒng)的流程,接收客戶端請(qǐng)求,并調(diào)用Model組件對(duì)其作出響應(yīng)。主要功能:(1)取得View提交的數(shù)據(jù)(2)驗(yàn)證View數(shù)據(jù)的合法性(形式和業(yè)務(wù))(3)View數(shù)據(jù)的類型轉(zhuǎn)換(4)調(diào)用Model業(yè)務(wù)處理方法(5)保存Model業(yè)務(wù)數(shù)據(jù)給View組件(6)導(dǎo)航到指定View組件。JavaEE框架下的MVCJavaEE平臺(tái)MVC實(shí)現(xiàn)View:JSP+EL+JSTLControl:ServletModel:JavaBean8.5MVC模式分層結(jié)構(gòu)MVC模式分層結(jié)構(gòu)UIO:視圖層CO:控制層BO:業(yè)務(wù)層實(shí)現(xiàn)業(yè)務(wù)邏輯PO/DAO:持久層向數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)持久化操作DTO/VO:傳輸層在各層之間傳遞數(shù)據(jù)時(shí),依賴傳遞層實(shí)現(xiàn),需要實(shí)現(xiàn)序列化接口Serializable每層的設(shè)計(jì)思想面向接口設(shè)計(jì)原則,通過(guò)接口向上層暴露業(yè)務(wù)方法,每層由接口,接口實(shí)現(xiàn)類和工廠類組成。詳細(xì)的MVC分層架構(gòu)View設(shè)計(jì)HTMLJSPELJSTL控制類設(shè)計(jì)控制類由Servlet充當(dāng),具有Servlet中常見(jiàn)方法。Action控制類的設(shè)計(jì)

類命名:處理功能名稱+Action

包名:域名.項(xiàng)目名.模塊名.action如:com.city.oa.action.LoginAction,

VO/DTO類設(shè)計(jì)用于封裝表的記錄值,每個(gè)表1個(gè)類。類對(duì)應(yīng)表,對(duì)象對(duì)應(yīng)記錄,屬性對(duì)象字段。使用關(guān)聯(lián)關(guān)系表達(dá)類之間的對(duì)應(yīng)關(guān)系,與表的外鍵對(duì)應(yīng)。每個(gè)屬性一對(duì)get/Set方法。包:jectname.value類名:實(shí)體類名+”Value”

如:com.city.oa.value.UserValuecom.city.oa.value.POValuecom.city.oa.value.EmployeeValueBO類(BusinessObject)BO接口:定義BO業(yè)務(wù)功能命名:OOA實(shí)體名稱包名:ject.business

如:com.dashang.erp.business.UserBO實(shí)現(xiàn)類:實(shí)現(xiàn)BO接口的功能命名:OOA實(shí)體類Impl

包:ject.business.impl

如:com.dashang.erp.business.impl.UserImplBO工廠:命名:BusinessFactory

包:ject.business.factoryDAO類(DataAccessObject)設(shè)計(jì)DAO接口:定義CRUD方法命名:OOA實(shí)體類名稱+DAO

包:ject.daoDAO實(shí)現(xiàn)類命名:OOA實(shí)體類+DAOImpl

包:ject.dao.impl

如:com.dashang.erp.dao.impl.UserDAOImplDAO工廠命名:DAOFactory

包:ject.dao.factoryMVC模式Model1Model2MVC缺點(diǎn)視圖與控制器間的過(guò)于緊密的連接。視圖與控制器是相互分離,但確實(shí)聯(lián)系緊密的部件,視圖沒(méi)有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨礙了他們的獨(dú)立重用。視圖對(duì)模型數(shù)據(jù)的低效率訪問(wèn)。依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對(duì)未變化數(shù)據(jù)的不必要的頻繁訪問(wèn),也將損害操作性能。MVC的幾種實(shí)現(xiàn)StrutsSpringMVCSpringGuiceHibernateIBatis幾種常見(jiàn)的模式

J2EE?SOA?EAI?基于組件基于插件LayersFa?ade…人氣技術(shù)框架市場(chǎng)占有率

沒(méi)有繼承Struts1的血統(tǒng),而是繼承WebWork的血統(tǒng)

即:Struts2是在WebWork2的基礎(chǔ)上開(kāi)發(fā)的

8.2strutsStruts2Struts1WebWorkStruts1的MVC結(jié)構(gòu)1struts1簡(jiǎn)介2Webwork簡(jiǎn)介Webwork是由OpenSymphony組織開(kāi)發(fā)的基于MVC架構(gòu)模式的J2EEWeb框架。從2.0版本開(kāi)始拆分為XWork和WebWorkXwork完全脫離Web層,提供了很多核心功能:前端攔截器(interceptor),表單驗(yàn)證,數(shù)據(jù)類型轉(zhuǎn)換,強(qiáng)大的表達(dá)式語(yǔ)言(OGNL),IoC(控制反轉(zhuǎn))容器等。WebWork2建立在Xwork之上,處理HTTP的請(qǐng)求和響應(yīng)。WebWork解決了Struts1的ActionForm問(wèn)題,可以使用普通的JavaBean對(duì)象,甚至Action本身來(lái)接受表單數(shù)據(jù)。其Action也沒(méi)有和ServletAPI耦合在一起,單元測(cè)試更容易。

3、struts2架構(gòu)剖析

體系結(jié)構(gòu)

調(diào)用流程請(qǐng)求首先通過(guò)Filterchain,Filter主要包括ActionContextCleanUp,它主要清理當(dāng)前線程的ActionContext和Dispatcher;FilterDispatcher主要通過(guò)AcionMapper來(lái)決定需要調(diào)用哪個(gè)Action。

ActionMapper取得了ActionMapping后,在Dispatcher的serviceAction方法里創(chuàng)建ActionProxy,ActionProxy創(chuàng)建ActionInvocation,然后ActionInvocation調(diào)用Interceptors,執(zhí)行Action本身,創(chuàng)建Result并返回,當(dāng)然,如果要在返回之前做些什么,可以實(shí)現(xiàn)PreResultListener。4struts2調(diào)用流程當(dāng)Servlet容器接收到一個(gè)請(qǐng)求后,將請(qǐng)求交給web.xml文件中配置的過(guò)濾器FilterDispatcher,調(diào)用它的doFilter()方法。FilterDispatcher通過(guò)ActionMapper來(lái)決定這個(gè)Request需要調(diào)用哪個(gè)Action如果ActionMapper決定調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy。ActionProxy根據(jù)ActionMapping和ConfigurationManager找到需要調(diào)用的Action類ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例ActionInvocation調(diào)用真正的Action,當(dāng)然這涉及到相關(guān)攔截器的調(diào)用Action執(zhí)行完畢,ActionInvocation創(chuàng)建Result并返回。8.3配置詳解配置文件包的配置名稱空間的配置攔截器配置action配置result配置

1配置文件web.xml:配置核心控制器FilterDispatcher,對(duì)struts框架進(jìn)行初始化。perties:struts2的屬性配置文件struts.xml:struts2的核心配置文件,主要配置和管理開(kāi)發(fā)人員編寫的action。struts-default.xml:struts2的基礎(chǔ)配置文件,會(huì)被自動(dòng)的包含到struts.xml中struts-plugin.xml:就是由插件使用的配置文件,如果不開(kāi)發(fā)插件的話,就無(wú)需編寫這個(gè)配置文件2包的配置package元素有一個(gè)必需的屬性name,指定包的名字,包的名字必需是唯一的package元素的extends屬性是可選的,允許一個(gè)或多個(gè)先前定義的包pageckage元素的abstract屬性是可選的,設(shè)為true,表明是抽象的。抽象的包不能有action定義,只能被其他包繼承。3名稱空間的配置struts2框架使用action的名字和它所在的空間來(lái)標(biāo)識(shí)一個(gè)action。所以多個(gè)包可以映射到相同的名稱空間,不同的名稱空間中也可以使用同名的action。struts2會(huì)將一個(gè)請(qǐng)求分為namespace和action名字兩部分,如果從struts.xml中沒(méi)有找到namespace/action命名對(duì),就會(huì)在默認(rèn)的名稱空間(“”)中搜索相應(yīng)的action名。4攔截器配置如果你在一個(gè)action中定義了其它的攔截器引用,那么這個(gè)action將不再使用默認(rèn)的攔截器。攔截器按照它們?cè)跀r截器棧中定義的順序執(zhí)行。攔截器都是在包中定義的,一個(gè)包中不能引用其他包中定義的攔截器,除非這兩個(gè)包是繼承關(guān)系。5action配置action取名時(shí),默認(rèn)在名字中是不能出現(xiàn)”/”的,要出現(xiàn)需在struts.xml中指定<constantname="struts.enable.SlashesInActionNames"value=“true"/>

action取名時(shí),名字中盡量不要使用.和-如:create.user,my-action,否則會(huì)出現(xiàn)一些莫名奇妙的問(wèn)題。Struts2根據(jù)action元素的method屬性查找方法時(shí)有兩種途徑:

(1)查找與method屬性值完全一致的方法

(2)查找doMethod()形式的方法5action配置可以使用default-action-ref元素來(lái)聲明默認(rèn)的action。<packagename=""namespace="/"extends="struts-default">

<default-action-refname="errors"></default-action-ref>

<actionname="errors"><result>/errors.jsp</result></action>

</package>每一個(gè)包中都可以有它自己默認(rèn)的action,但每一個(gè)名稱空間應(yīng)該只有一個(gè)。如果相同名稱空間的多個(gè)包中都申明了默認(rèn)action,那么哪一個(gè)action才是默認(rèn)的將無(wú)法保證。

5action配置動(dòng)態(tài)方法調(diào)用:

(1).語(yǔ)法格式:actionName!methodName(2).會(huì)帶來(lái)安全隱患,惡意用戶會(huì)利用這一特性來(lái)執(zhí)行一些敏感方法。所以一般禁止使用。struts.xml文件中配置如下:

<constantname="struts.enable.DynamicMethodInvocation"value="false"/>

當(dāng)只需要一個(gè)請(qǐng)求轉(zhuǎn)發(fā)時(shí),可做如下操作:action配置中將class屬性省略,此時(shí)默認(rèn)使用ActionSupport類。<actionname=“index”><result>/index.jsp</result></action>5act

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論