畢業(yè)設(shè)計(論文)基于mvc模式的web開發(fā)框架研究_第1頁
已閱讀1頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  基于MVC模式的WEB開發(fā)框架研究</p><p>  摘要: MVC設(shè)計模式是基于J2EE的Web應(yīng)用開發(fā)的首選模式,當(dāng)前許多流行的框架也都是基于MVC設(shè)計模式的。本文介紹了MVC設(shè)計模式的結(jié)構(gòu)和優(yōu)缺點,然后介紹了Sun公司提出的再Java Web開發(fā)領(lǐng)域的兩種規(guī)范:JSP Model1和JSP Model2、接著介紹了Struts實現(xiàn)MVC的機制,并在此基礎(chǔ)上提出了一種基于MVC模式的新

2、型WEB應(yīng)用開發(fā)框架——WebFramework,并對該框架的各個層次的組成、功能進(jìn)行了詳細(xì)的描述。</p><p>  關(guān)鍵詞: MVC設(shè)計模式;J2EE;Struts;WebFramework</p><p><b>  1引言3</b></p><p><b>  2 MVC概述3</b></p>

3、<p>  2.1 MVC設(shè)計模式3</p><p>  2.2 視圖(View)4</p><p>  2.3 模型(Model)5</p><p>  2.4 控制器(Controller)5</p><p>  2.5 MVC處理過程5</p><p>  2.6 MVC的優(yōu)點6</p

4、><p>  2.7 MVC的不足6</p><p>  2.8 MVC的適用范圍7</p><p>  3 JSP Model1和JSP Model27</p><p>  3.1早期的Java Web開發(fā)7</p><p>  3.2 JSP Model18</p><p>  3.3

5、 JSP Model29</p><p>  4 基于Struts 框架的Web系統(tǒng)的應(yīng)用9</p><p>  4.1 Struts 如何實現(xiàn)MVC 模式10</p><p>  4.2 Struts 框架在Web 系統(tǒng)中的實現(xiàn)10</p><p>  4.3 設(shè)計模式中的模板方法模式的介紹12</p><p&

6、gt;  4.4 用模板方法模式實現(xiàn)程序控制流12</p><p>  4.5 Struts的優(yōu)點14</p><p>  4.6 Struts的不足14</p><p>  5 WebFramework框架14</p><p>  5.1 設(shè)計目標(biāo)14</p><p>  5.2 框架結(jié)構(gòu)15</p

7、><p>  5.3  框架的配置文件18</p><p><b>  結(jié)論19</b></p><p><b>  致謝20</b></p><p><b>  參考文獻(xiàn)21</b></p><p><b>  1引言</

8、b></p><p>  模型、視圖和控制器即 MVC 模式是在Smalltalk-80 中使用的一種軟件設(shè)計模式,這種模式在應(yīng)用到Web 開發(fā)中,也就是SUN 公司的Model2 架構(gòu),在很多場合這兩個詞交互使用。既然說到了MVC 模式,我們不得不提Struts 框架體系結(jié)構(gòu),眾所周知,它是MVC 的一種很好的實現(xiàn)。Struts 框架的核心是一個MVC 風(fēng)格的控制器,搭起了模型和視圖之間的支柱橋梁。<

9、;/p><p>  隨著開源軟件的興起,各種框架也紛紛出現(xiàn),在實際軟件開發(fā)中運用這些框架,大大降低了J2EE開發(fā)的復(fù)雜度和難度,降低了開發(fā)成本。但是這些框架也有不足的地方,如難于掌握,配置復(fù)雜等等。本文研究的目的在于設(shè)計出一種簡單易行的WEB開發(fā)框架——WebFramework,WebFramework結(jié)構(gòu)清晰,易于理解,增加系統(tǒng)的可擴展性,可維護(hù)性,降低開發(fā)成本。</p><p><b

10、>  2 MVC概述</b></p><p>  MVC模式是"Model-View-Controller"的縮寫,中文翻譯為"模式-視圖-控制器"。MVC是Xerox PARC在20世紀(jì)80年代為編程語言SmallTalk-80發(fā)明的一種軟件設(shè)計模式,至今已被廣泛使用,最近幾年被推薦為Sun公司J2EE平臺的設(shè)計模式,受到越來越多的Web開發(fā)者的歡迎。&

11、lt;/p><p>  2.1 MVC設(shè)計模式</p><p>  MVC是一種設(shè)計模式,她強制性地把應(yīng)用程序的輸入、處理和輸出分開。MVC應(yīng)用程序總是由這三個部分組成:模型、視圖和控制器,它們分別擔(dān)負(fù)不同的任務(wù)。圖2-1 顯示了這幾個模塊各自的功能以及它們的相互關(guān)系。</p><p>  圖2-1 MVC設(shè)計模式</p><p>  Event

12、(事件)導(dǎo)致Controller改變Model或View,或者同時改變兩者。只要Controller改變了Models的數(shù)據(jù)或者屬性,所有依賴的View都會自動更新。類似的,只要Controller改變了View,View會從潛在的Model中獲取數(shù)據(jù)來刷新自己。</p><p>  2.2 視圖(View)</p><p>  視圖時用戶看到并與之交互的界面。視圖向用戶顯示相關(guān)的數(shù)據(jù),并

13、能接受用戶的輸入數(shù)據(jù),但是它并不進(jìn)行任何實際的業(yè)務(wù)處理。視圖可以向模型查詢業(yè)務(wù)狀態(tài),但不能改變模型。視圖還能接受模型發(fā)出的數(shù)據(jù)更新事件,從而對用戶界面進(jìn)行同步更新。</p><p>  對于Web應(yīng)用來說,可以概括為HTML界面,但有可能為XHTML、XML和Applet。隨著應(yīng)用的復(fù)雜性和規(guī)模性,界面的處理也變得具有挑戰(zhàn)性。一個應(yīng)用可能有很多不同的視圖,MVC設(shè)計模式對于視圖的處理僅限于視圖上數(shù)據(jù)的采集和處理,

14、以及用戶的請求,而不包括在視圖上的業(yè)務(wù)流程的處理。業(yè)務(wù)流程的處理交予模型(Model)處理。比如一個訂單的視圖只接受來自模型的數(shù)據(jù)并顯示給用戶,以及將用戶界面的輸入數(shù)據(jù)和請求傳遞給控制和模型。</p><p>  注: 對于基于請求/響應(yīng)方式的主體。模型表示業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯。一個模型能為多個視圖提供數(shù)據(jù)。由于同一個模型可以被多個視圖重用,所以提高了應(yīng)用的可重用性。</p><p>  2

15、.3 模型(Model)</p><p>  模型是應(yīng)用程序的主體部分。模型表示業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯。就是業(yè)務(wù)流程/狀態(tài)的處理以及業(yè)務(wù)規(guī)則的制定。一個模型能為多個視圖提供數(shù)據(jù)。由于同一個模型可以被多個視圖重用,所以提高了應(yīng)用的可重用性。</p><p>  業(yè)務(wù)流程的處理過程對其它層來說是黑箱操作,模型接受視圖請求的數(shù)據(jù),并返回最終的處理結(jié)果。業(yè)務(wù)模型的設(shè)計可以說是MVC最主要的核心。目前流

16、行的EJB模型就是一個典型的應(yīng)用例子,它從應(yīng)用技術(shù)實現(xiàn)的角度對模型做了進(jìn)一步的劃分,以便充分利用現(xiàn)有的組件,但它不能作為應(yīng)用設(shè)計模型的框架。它僅僅告訴你按這種模型設(shè)計就可以利用某些技術(shù)組件,從而減少了技術(shù)上的困難。對一個開發(fā)者來說,就可以專注于業(yè)務(wù)模型的設(shè)計。MVC設(shè)計模式告訴我們,把應(yīng)用的模型按一定的規(guī)則抽取出來,抽取的層次很重要,這也是判斷開發(fā)人員是否優(yōu)秀的設(shè)計依據(jù)。抽象與具體不能隔得太遠(yuǎn),也不能太近。MVC并沒有提供模型的設(shè)計方法

17、,而只告訴你應(yīng)該組織管理這些模型,以便于模型的重構(gòu)和提高重用性。我們可以用對象編程來做比喻,MVC定義了一個頂級類,告訴它的子類你只能做這些,但沒法限制你能做這些。這點對編程的開發(fā)人員非常重要。 </p><p>  業(yè)務(wù)模型還有一個很重要的模型那就是數(shù)據(jù)模型。數(shù)據(jù)模型主要指實體對象的數(shù)據(jù)保存(持續(xù)化)。比如將一張訂單保存到數(shù)據(jù)庫,從數(shù)據(jù)庫獲取訂單。我們可以將這個模型單獨列出,所有有關(guān)數(shù)據(jù)庫的操作只限制在該模型中

18、。</p><p>  2.4 控制器(Controller)</p><p>  控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求。當(dāng)Web用戶單擊Web頁面中的提交按鈕來發(fā)送HTML表單時,控制器接受請求并調(diào)用相應(yīng)的模型組件去處理請求,然后調(diào)用相應(yīng)的視圖來顯示模型返回的數(shù)據(jù)。</p><p>  劃分控制層的作用也很明顯,它清楚地告訴你,它就是一個分發(fā)器,選

19、擇什么樣的模型,選擇什么樣的視圖,可以完成什么樣的用戶請求??刂茖硬⒉蛔鋈魏蔚臄?shù)據(jù)處理。例如,用戶點擊一個連接,控制層接受請求后, 并不處理業(yè)務(wù)信息,它只把用戶的信息傳遞給模型,告訴模型做什么,選擇符合要求的視圖返回給用戶。因此,一個模型可能對應(yīng)多個視圖,一個視圖可能對應(yīng)多個模型。</p><p>  2.5 MVC處理過程</p><p>  現(xiàn)在我們來總結(jié)MVC處理過程。首先控制器接受

20、用戶的請求,并決定應(yīng)該調(diào)用哪個模型來進(jìn)行處理;然后模型根據(jù)用戶請求進(jìn)行相應(yīng)的業(yè)務(wù)邏輯處理,并返回數(shù)據(jù);最后控制器調(diào)用相應(yīng)的視圖來格式化模型返回的數(shù)據(jù),并通過視圖呈現(xiàn)給用戶。</p><p>  2.6 MVC的優(yōu)點</p><p>  大部分用過程語言比如ASP、PHP開發(fā)出來的Web應(yīng)用,初始的開發(fā)模板就是混合層的數(shù)據(jù)編程。例如,直接向數(shù)據(jù)庫發(fā)送請求并用HTML顯示,開發(fā)速度往往比較快,

21、但由于數(shù)據(jù)頁面的分離不是很直接,因而很難體現(xiàn)出業(yè)務(wù)模型的樣子或者模型的重用性。產(chǎn)品設(shè)計彈性力度很小,很難滿足用戶的變化性需求。MVC要求對應(yīng)用分層,雖然要花費額外的工作,但產(chǎn)品的結(jié)構(gòu)清晰,產(chǎn)品的應(yīng)用通過模型可以得到更好地體現(xiàn)。</p><p>  首先,最重要的是應(yīng)該有多個視圖對應(yīng)一個模型的能力。在目前用戶需求的快速變化下,可能有多種方式訪問應(yīng)用的要求。例如,訂單模型可能有本系統(tǒng)的訂單,也有網(wǎng)上訂單,或者其他系統(tǒng)

22、的訂單,但對于訂單的處理都是一樣,也就是說訂單的處理是一致的。按MVC設(shè)計模式,一個訂單模型以及多個視圖即可解決問題。這樣減少了代碼的復(fù)制,即減少了代碼的維護(hù)量,一旦模型發(fā)生改變,也易于維護(hù)。</p><p>  其次,由于模型返回的數(shù)據(jù)不帶任何顯示格式,因而這些模型也可直接應(yīng)用于接口的使用。</p><p>  此外,由于一個應(yīng)用被分離為三層,因此有時改變其中的一層就能滿足應(yīng)用的改變。一

23、個應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則的改變只需改動MVC的模型層??刂茖拥母拍钜埠苡行В捎谒巡煌哪P秃筒煌囊晥D組合在一起完成不同的請求,因此,控制層可以說是包含了用戶請求權(quán)限的概念。</p><p>  最后,它還有利于軟件工程化管理。由于不同的層各司其職,每一層不同的應(yīng)用具有某些相同的特征,有利于通過工程化、工具化產(chǎn)生管理程序代碼。</p><p>  2.7 MVC的不足</p&

24、gt;<p>  MVC的不足體現(xiàn)在以下幾個方面:</p><p>  增加了系統(tǒng)結(jié)構(gòu)和實現(xiàn)的復(fù)雜性。對于簡單的界面,嚴(yán)格遵循MVC,使模型、視圖與控制器分離,會增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過多的更新操作,降低運行效率。</p><p>  視圖與控制器間的過于緊密的連接。視圖與控制器是相互分離,但確實聯(lián)系緊密的部件,視圖沒有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨

25、礙了他們的獨立重用。</p><p>  視圖對模型數(shù)據(jù)的低效率訪問。依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對未變化數(shù)據(jù)的不必要的頻繁訪問,也將損害操作性能。</p><p>  目前,一般高級的界面工具或構(gòu)造器不支持MVC架構(gòu)。改造這些工具以適應(yīng)MVC需要和建立分離的部件的代價是很高的,從而造成使用MVC的困難。</p><p>  

26、2.8 MVC的適用范圍</p><p>  使用MVC需要精心的計劃,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費一些時間去理解它。講MVC運用到應(yīng)用程序中,會帶來額外的工作量,增加應(yīng)用的復(fù)雜性,所以MVC不適合小型的應(yīng)用程序。</p><p>  但對于開發(fā)存在大量用戶界面,并且業(yè)務(wù)邏輯復(fù)雜的大型應(yīng)用程序,MVC將會使軟件在健壯性、代碼重用和結(jié)構(gòu)方面上一個新的臺階。盡管在最初構(gòu)建MVC框架時

27、會花費一定的工作量,但從長遠(yuǎn)的角度來看,它會大大提高后期軟件開發(fā)的效率。</p><p>  3 JSP Model1和JSP Model2</p><p>  3.1早期的Java Web開發(fā)</p><p>  盡管MVC設(shè)計模式很早就出現(xiàn)了,但在Web應(yīng)用的開發(fā)中引入MVC卻是步履維艱。主要原因是在早期的Web應(yīng)用的開發(fā)中,程序語言和HTML的分離一直難以實現(xiàn)

28、。例如在JSP網(wǎng)頁中執(zhí)行業(yè)務(wù)邏輯的程序代碼和HTML表示層數(shù)據(jù)混雜在一起,因而很難分離出單獨的業(yè)務(wù)模型。這使得維護(hù)JSP網(wǎng)頁非常困難,很難滿足用戶的變化性需求。</p><p>  在早期的Java Web應(yīng)用中,JSP文件負(fù)責(zé)業(yè)務(wù)邏輯、控制網(wǎng)頁流程并創(chuàng)建HTML,參見圖3-1。JSP文件時一個獨立的、自主完成所有任務(wù)的模塊,這給Web開發(fā)帶來一系列問題:</p><p>  HTML代碼

29、和Java程序強耦合在一起:JSP文件的編寫者必須既是網(wǎng)頁設(shè)計者,有是Java開發(fā)者。但實際情況是,多數(shù)Web開發(fā)人員要么只精通網(wǎng)頁設(shè)計,能夠設(shè)計出漂亮的網(wǎng)頁外觀,但是編寫的Java代碼很糟糕;要么僅熟悉Java編程,能夠編寫健壯的Java代碼,但是設(shè)計的網(wǎng)頁外觀很難看。兼?zhèn)鋬煞N才能的開發(fā)人員很少見。</p><p>  內(nèi)嵌的流程邏輯:要理解應(yīng)用程序的整個流程,必須瀏覽所有網(wǎng)頁,試想一下?lián)碛?00個網(wǎng)頁的網(wǎng)站的

30、錯綜復(fù)雜的邏輯。</p><p>  調(diào)試?yán)щy:除了很糟的外觀之外,HTML標(biāo)記、Java代碼和JavaScript代碼都集中在一個網(wǎng)頁中,使調(diào)試變得相當(dāng)困難。</p><p>  強耦合:更改業(yè)務(wù)邏輯或數(shù)據(jù)可能牽涉相關(guān)的多個網(wǎng)頁。</p><p>  美學(xué):設(shè)想有1000很代碼的網(wǎng)頁,起編碼樣式看起來雜亂無章。即使有彩色語法顯示,閱讀和理解這些代碼仍然比較困難。&

31、lt;/p><p>  圖3-1 JSP作為自主獨立的模塊</p><p>  為了解決以上問題,SUN公司先后制定了兩種規(guī)范,成為JSP Model和JSP Mode2。雖然Model在一定程度上實現(xiàn)了MVC,但是它的運行并不理想;知道居于J2EE的JSP Model2問世才得以改觀。JSP Model2用JSP實現(xiàn)視圖的功能,用Servlet技術(shù)實現(xiàn)控制器的功能,用JavaBean技術(shù)實現(xiàn)

32、模型的功能。</p><p>  3.2 JSP Model1</p><p>  JSP Model1和JSP Model2的 區(qū)別在于處理用戶請求的位置不同。在Model1體系中,如圖3-2所示,JSP頁面負(fù)責(zé)響應(yīng)用戶請求并將處理結(jié)果返回用戶。JSP既要負(fù)責(zé)業(yè)務(wù)流程控制,又要負(fù)責(zé)提供表示層數(shù)據(jù),同事充當(dāng)視圖和控制器,未能實現(xiàn)這兩個模塊之間的獨立和分離。盡管Model1體系十分合適簡單應(yīng)

33、用的需要,它卻不適合開發(fā)復(fù)雜的大型應(yīng)用程序。不加選擇地隨意運用Model1,會導(dǎo)致JSP頁嵌入大量的Java代碼。盡管這對于Java程序員來說可能不是什么大問題,但如果JSP頁面是由網(wǎng)頁設(shè)計人員開維護(hù)的,這就確實是個問題了。從根本上講,講導(dǎo)致角色定義不清和職責(zé)分配不明,給項目管理帶來很多麻煩。</p><p>  圖3-2 JSP Model1</p><p>  3.3 JSP Mode

34、l2</p><p>  JSP Model2體系結(jié)構(gòu)式(如圖3-3)是一種聯(lián)合使用JSP與Servlet來提供動態(tài)內(nèi)容服務(wù)的方法。她吸引了JSP和Servlet兩種技術(shù)各自的突出優(yōu)點,用JSP生成表示層的內(nèi)容,讓Servlet完成深層次的處理任務(wù)。在這里,Servlet充當(dāng)控制器的角色,負(fù)責(zé)處理用戶。在JSP頁內(nèi)需要使用的JavaBean對象,根據(jù)用戶請求選擇合適的JSP也返回給用戶。在JSP頁內(nèi)沒有處理邏輯,

35、他不僅負(fù)責(zé)檢索原先有Servlet創(chuàng)建的JavaBean對象,從Servlet中提取動態(tài)內(nèi)容插入到靜態(tài)模板。這是一種有突破性的軟件設(shè)計方法,她清晰地分離了表達(dá)和內(nèi)容,明確了角色定義以及開發(fā)者與網(wǎng)頁設(shè)計的分工。事實上,項目越復(fù)雜,使用Model2設(shè)計模式的好處就越大。</p><p>  圖3-3 JSP Model2</p><p>  4 基于Struts 框架的Web系統(tǒng)的應(yīng)用<

36、/p><p>  Struts是Apache基金會Jakarta項目組的一個Open Source項目,它將Servlet2.2和JSP1.1標(biāo)記用作實現(xiàn)的一部分,它由一組相互協(xié)作的類、servlet和JSP標(biāo)記,組成一個可重用的系統(tǒng)設(shè)計。它能夠很好地幫助Java開發(fā)者利用J2EE開發(fā)WEB應(yīng)用。它將設(shè)計模式中“分離顯示邏輯與業(yè)務(wù)邏輯”的能力發(fā)揮的淋漓盡致。因此,越來越多的大型的WEB應(yīng)用項目的開發(fā)都紛紛采用Stru

37、ts框架,或者借鑒Struts架構(gòu)設(shè)計,進(jìn)行基于MVC模式的應(yīng)用系統(tǒng)的開發(fā)。</p><p>  Struts的工作原理如圖2所示: </p><p>  圖4-1:Struts 的工作原理</p><p>  4.1 Struts 如何實現(xiàn)MVC 模式</p><p>  Struts提供了一個控制器Servlet類ActionServle

38、t來實現(xiàn)MVC模式,用來管理JSP頁面和其他表現(xiàn)層組件之間的流程控制。在表現(xiàn)層之外,Struts通過使用類ActionForward和ActionMapping的控制流決策來實現(xiàn)MVC控制層模式。下面我們就列舉Struts的幾個核心類并簡要說明一下這些類是如何對應(yīng)MVC的組件職責(zé)。</p><p>  ActionServlet:實現(xiàn)控制器功能,接受用戶請求和狀態(tài)改變以及發(fā)出視圖選擇。</p>&l

39、t;p>  Action:控制器的一部分,與用戶業(yè)務(wù)模型進(jìn)行交互,執(zhí)行狀態(tài)改變或查詢,以及告訴</p><p>  ActionServlet:下一個要選擇的視圖。</p><p>  ActionForm:顯示模塊的數(shù)據(jù)。</p><p>  ActionForward:用戶指向或者視圖的選擇。</p><p>  ActionMap

40、ping:幫助控制器將請求影射到操作。</p><p>  以上介紹了幾個Struts的核心類。另外,Struts使用了一些配置文件和視圖助手來溝通控制器和模型,這里我們就不在介紹了。接下來,我們介紹一個Web應(yīng)用系統(tǒng),看它是如何來整合Struts這些可編程組件的。</p><p>  4.2 Struts 框架在Web 系統(tǒng)中的實現(xiàn)</p><p>  在這個 W

41、eb 系統(tǒng)中,我們根據(jù)自己的需要主要繼承了Struts 的ActionForm 類、Action類,以及使用了一些Struts 的視圖標(biāo)簽。在這里我們著重討論的是控制器層組件如何和業(yè)務(wù)模型層進(jìn)行交互,也許你可以從圖4-1中得到一些信息。</p><p><b>  圖4-2</b></p><p>  在上圖中,我們用到了四種不同組件,它們分別對應(yīng)于MVC 不同的層,

42、JSP 頁面表示視圖層,ActionForm、InitAction 和EventAction 組件來自于控制層,而各個具體的InitHandler和EventHandler 用于業(yè)務(wù)模型層。在系統(tǒng)實際開發(fā)過程中,我們力求各個業(yè)務(wù)邏輯獨立開發(fā),相互間互不影響,也就是達(dá)到系統(tǒng)的松散耦合性?,F(xiàn)在我們就圖-1 說明一下各個組件的作用和之間的交互。</p><p>  JSP 頁面:控制頁面輸出,接收來自ActionFor

43、m 的數(shù)據(jù)。</p><p>  ActionForm 子類:繼承Struts 的ActionForm 類,紀(jì)錄從頁面取得或?qū)⒁@示到頁面的數(shù)值,作為參數(shù)在控制層和模型層之間傳遞。</p><p>  InitAction 類:用于初始化各個頁面,每個頁面都對應(yīng)一個具體的InitAction 子類,實現(xiàn)父類</p><p>  InitAction 的一些方法,關(guān)于

44、InitAction 類和這些方法如何實現(xiàn)我們將在下面介紹。</p><p>  EventAction 類:定義了各個頁面上的事件操作,每個頁面對應(yīng)一個具體的EventAction 子類,對于父類EventAction 類我們也在下面內(nèi)容中介紹。</p><p>  InitHandler 類:實現(xiàn)初始化頁面的業(yè)務(wù)處理,InitHandler 類定義了一下共同的操作和一些虛方法,而具體的

45、InitHandler 則來實現(xiàn)這些虛方法。</p><p>  EventHandler 類:實現(xiàn)頁面上的事件處理,每個頁面對應(yīng)一個或多個EventHandler 子類,這些類繼承父類EventHandler,同樣實現(xiàn)了父類的一些虛方法。</p><p>  4.3 設(shè)計模式中的模板方法模式的介紹</p><p>  當(dāng)然 MVC 本來就是一種集合了多個設(shè)計模式的

46、框架,它的實現(xiàn)已經(jīng)集成到Struts 的各個組件中,但是,在這里我們主要介紹另外一種設(shè)計模式,也就是應(yīng)用在我們的Web 系統(tǒng)中的模板方法設(shè)計模式,它是獨立于Struts 框架,用于封裝具體到本系統(tǒng)的控制邏輯,調(diào)用不同的業(yè)務(wù)模型。在父類中定義一個算法的骨架,而將一些具體的步驟延遲到子類中。這種模式使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。它是一種類行為模式,它的結(jié)構(gòu)很簡單,如圖4-2 所示。</p>&

47、lt;p><b>  圖4-3</b></p><p>  模板方法導(dǎo)致一種反向的控制結(jié)構(gòu),指的是由父類來調(diào)用子類的操作,而不是相反,圖-2 中AbstractClass 類的作用是定義子類要實現(xiàn)的原語操作(Primitive operation);另外,它實現(xiàn)了一個模板方法,定義一個算法的骨架,該方法不僅可以調(diào)用原語操作,而且也調(diào)用定義在AbstractClass 或其他對象中的操作

48、。ConcreteClass 實現(xiàn)了原語操作以完成算法中與特定子類相關(guān)的步驟。</p><p>  4.4 用模板方法模式實現(xiàn)程序控制流</p><p>  在本 Web 系統(tǒng)實例中,對于業(yè)務(wù)模型層的控制,多次用到模板方法設(shè)計模式,結(jié)合Java的反射機制實現(xiàn)了一些模板算法,調(diào)用不同包路徑的模型組件。在本文的第2 部分我們討論了一些Action 和Handler 類,下面我們就來具體介紹一下

49、這些類的實現(xiàn)方法和應(yīng)用效果,首先,請參照圖4-3。</p><p><b>  圖4-3</b></p><p>  上圖中簡單表示了各個層次Action 類的繼承關(guān)系,它與圖-2 的思想完全一樣,也就是模板方法設(shè)計模式被應(yīng)用到了我們的Web 系統(tǒng)實例中。通過前面的介紹,我們知道在系統(tǒng)中有很多頁面,每個頁面對應(yīng)一個ConcreteInitAction、一個Concre

50、teEventAction、一個ConcreteInitHandler 和多個ConcreteEventHandler 類,為了管理和開發(fā)的方便,我們往往把這些保存在不同的包路徑當(dāng)中。各種Handler 類的繼承關(guān)系類似于Action 類的繼承方式,同樣是基于模板方法的設(shè)計模式。下面我們利用一段Java 代碼來具體說明其實現(xiàn)方法。</p><p>  在 InitAction 中定義的execute()方法的一個

51、片斷:</p><p>  在上面的程序段落中,InitAction 類實現(xiàn)了一個算法,根據(jù)各個業(yè)務(wù)模型類的路徑和頁面名稱生成對應(yīng)得模型類,從而調(diào)用相應(yīng)的業(yè)務(wù)操作。行1 調(diào)用了在InitAction 類定義并在其子類中實現(xiàn)的虛方法getHandlerPakageInfo()和getScreenId(),這兩個方法根據(jù)不同的頁面返回不同的值,從而生成不同的業(yè)務(wù)處理InitHandler 類,從而調(diào)用不同的業(yè)務(wù)處理操

52、作,程序段落行2~8 生成具體的InitHandler 類,行9、10 用來初始化和調(diào)用業(yè)務(wù)邏輯操作,并返回相應(yīng)的畫面跳轉(zhuǎn)內(nèi)容。</p><p>  4.5 Struts的優(yōu)點</p><p>  Struts的優(yōu)點主要體現(xiàn)在兩個方面:表單驗證和頁面導(dǎo)航。表單驗證解決了請求數(shù)據(jù)的驗證問題,增強了系統(tǒng)健壯性。而頁面導(dǎo)航使系統(tǒng)的業(yè)務(wù)流程脈絡(luò)清晰,系統(tǒng)各部分之間的聯(lián)系可以通過配置文件反映出來,從

53、而在一定程度上簡化了系統(tǒng)以后的維護(hù)工作。 </p><p>  4.6 Struts的不足</p><p>  陡峭的學(xué)習(xí)曲線。Taglib是Struts的標(biāo)記庫,如果能靈活運用,能大提高開發(fā)效率,但對初學(xué)者來說,卻需要一個持續(xù)學(xué)習(xí)的過程,增加了系統(tǒng)的開發(fā)成本。</p><p>  增加了系統(tǒng)的復(fù)雜度。業(yè)務(wù)層和表現(xiàn)層之間的耦合度太高,使得開發(fā)人員無法專注于表現(xiàn)層的設(shè)

54、計和實現(xiàn)。</p><p>  沒有對表單數(shù)據(jù)前端驗證提出方案,不利于在大型系統(tǒng)中使用。</p><p>  配置文件過于復(fù)雜繁索,隨著系統(tǒng)規(guī)模的增大,struts-config.xml越來越龐大,維護(hù)也變得越來越困難。</p><p><b>  心得:</b></p><p>  模板方法是一種比較簡單設(shè)計模式,它是

55、代碼復(fù)用的基本技術(shù),在我們的 Web 系統(tǒng)實例中,這種模式幫助我們提取了一些公共行為操作,而把變化的操作延遲實現(xiàn)。在基于Struts的Java Web 系統(tǒng)中,隨著業(yè)務(wù)需求邏輯的發(fā)展變化,一定會用到越來越多的設(shè)計模式或開發(fā)方法,其實我們的目的就是讓我們的系統(tǒng)更具有可復(fù)用性和靈活性、節(jié)省開發(fā)成本和優(yōu)化開發(fā)的流程。</p><p>  5 WebFramework框架</p><p>  針對

56、Struts框架的以上不足之處,本文提出WebFramework框架,與Struts框架相比,WebFramework更簡單易行,它通過簡化表現(xiàn)層的設(shè)計,降低開發(fā)難度,節(jié)約開發(fā)成本;使用VO(Value Object)作為數(shù)據(jù)傳遞的方式,降低系統(tǒng)復(fù)雜度;運用簡單的瀏覽器端表單字段數(shù)據(jù)驗證,提高系統(tǒng)的運行效率;簡化的配置文件,便于系統(tǒng)的維護(hù)。</p><p><b>  5.1 設(shè)計目標(biāo)</b>

57、;</p><p>  遵循J2EE規(guī)范,基于多層分布式應(yīng)用軟件開發(fā)框架,分布式的層次構(gòu)架方式可以提高軟件系統(tǒng)性能上的可擴展性,從長期的角度上保障了客戶對當(dāng)前的軟件投資;實現(xiàn)軟件系統(tǒng)在異常情況下也可以正常地提供服務(wù),提高軟件系統(tǒng)的穩(wěn)定性;各個構(gòu)架層次邏輯分離,有利于軟件開發(fā)過程中團(tuán)隊成員的協(xié)同工作,提高生產(chǎn)效率。</p><p><b>  5.2 框架結(jié)構(gòu)</b>&

58、lt;/p><p>  在設(shè)計策略中,將軟件系統(tǒng)從構(gòu)架上分為數(shù)據(jù)層、業(yè)務(wù)邏輯層和表示層,主要集中在業(yè)務(wù)表示與業(yè)務(wù)邏輯層。將普通三層架構(gòu)的表示層細(xì)分成視圖格式層和表示控制邏輯層。表示層涉及基于“瘦客戶”技術(shù)的用戶視圖格式服務(wù)器端表示和相應(yīng)的交互式控制邏輯。視圖格式層,只保留了構(gòu)建客戶端用戶視圖必要的顯示格式和事件觸發(fā);而在表示控制邏輯層則如名稱所描述的那樣,實現(xiàn)了人機交互所需控制邏輯和部分業(yè)務(wù)會話邏輯,再加上貫穿所有系

59、統(tǒng)邏輯層的業(yè)務(wù)實體,則構(gòu)成了以MVC模式為核心的表示層架構(gòu),將顯示格式、顯示控制邏輯、模型數(shù)據(jù)三部分有效地分隔開來,大大加強了系統(tǒng)架構(gòu)的可擴展性和應(yīng)用子系統(tǒng)的可插拔性。</p><p>  業(yè)務(wù)層細(xì)分成業(yè)務(wù)會話層和業(yè)務(wù)持久化層。業(yè)務(wù)層集中在業(yè)務(wù)流程中處理邏輯的組件化封裝,且與數(shù)據(jù)層平臺和外部系統(tǒng)無關(guān)。業(yè)務(wù)會話層,側(cè)重于業(yè)務(wù)活動,將一項業(yè)務(wù)的所有活動事務(wù)性地封裝起來,也確保業(yè)務(wù)流程處理的一致性和高效率;而業(yè)務(wù)持久化

60、層則是為業(yè)務(wù)會話層提供支持,提供業(yè)務(wù)數(shù)據(jù)的持久化操作,在業(yè)務(wù)與數(shù)據(jù)庫之間建立分離作用的中間層,構(gòu)成松耦合的架構(gòu)。</p><p>  本分層模型中實現(xiàn)了MVC設(shè)計模式。其中,Servlet組件對應(yīng)于MVC中的控制器(Controller)部分,JSP及Browser對應(yīng)于視圖(View)部分,而會話外觀、邏輯Bean及值對象則對應(yīng)于模型(Model)部分。其結(jié)構(gòu)圖5-1所示:</p><p&g

61、t;<b>  5.2.1 數(shù)據(jù)層</b></p><p>  (1)層定義    </p><p>  數(shù)據(jù)層對數(shù)據(jù)進(jìn)行管理,并向業(yè)務(wù)邏輯層提供標(biāo)準(zhǔn)化的開放訪問接口。</p><p>  數(shù)據(jù)層目前主要提供兩種形式的服務(wù)方式:數(shù)據(jù)庫方式和文件方式。數(shù)據(jù)庫主要提供業(yè)務(wù)操作數(shù)據(jù)等具有明顯結(jié)構(gòu)化特性的數(shù)據(jù)的存儲和訪問服

62、務(wù);文件主要提供包括掃描文檔圖像、傳真、照片、計算機生成的報告、字處理文檔、電子表格、演示文稿、語音和視頻片段等非結(jié)構(gòu)化數(shù)據(jù)的存儲和訪問服務(wù)。</p><p>  主要功能:數(shù)據(jù)創(chuàng)建、數(shù)據(jù)存儲、數(shù)據(jù)查詢、數(shù)據(jù)更新、數(shù)據(jù)刪除、數(shù)據(jù)安全、事務(wù)支持、數(shù)據(jù)備份/恢復(fù)。 </p><p> ?。ǎ玻┡c其他層接口    </p><p> ?。保?shù)

63、據(jù)庫方式的數(shù)據(jù)層面向業(yè)務(wù)邏輯層提供數(shù)據(jù)庫訪問服務(wù)接口,業(yè)務(wù)邏輯層通過JDBC協(xié)議訪問數(shù)據(jù)庫服務(wù)。</p><p>  2)文件方式的數(shù)據(jù)層面向業(yè)務(wù)邏輯層提供文件級的訪問服務(wù)接口,業(yè)務(wù)邏輯層通過操作系統(tǒng)本身提供的文件訪問API訪問文件數(shù)據(jù)。</p><p>  圖5-1 MyFramework框架結(jié)構(gòu)圖</p><p>  5.2.2  業(yè)務(wù)邏輯層</

64、p><p>  (1)層定義    </p><p>  業(yè)務(wù)邏輯層接受從表示層輸入的用戶請求,將其轉(zhuǎn)化為業(yè)務(wù)邏輯過程能夠理解的方式,根據(jù)特定的業(yè)務(wù)邏輯有序地向數(shù)據(jù)層發(fā)送數(shù)據(jù)請求,并將數(shù)據(jù)層返回的數(shù)據(jù)解釋及組合成用戶所需信息,返回給表示層,是整個應(yīng)用軟件系統(tǒng)中業(yè)務(wù)邏輯的實現(xiàn)和處理核心。業(yè)務(wù)邏輯層運行在基于J2EE應(yīng)用服務(wù)器的EJB及WEB容器中。</p>

65、;<p> ?。ǎ玻┙M件定義    </p><p>  業(yè)務(wù)邏輯層包含會話外觀(Session Façade)、邏輯Bean(Logic Bean)和和數(shù)據(jù)存取Bean(Data Access Bean)等三個邏輯組件。</p><p> ?。保捦庥^    </p><p> 

66、 提供了面向表示層的統(tǒng)一的業(yè)務(wù)邏輯調(diào)用接口;是數(shù)據(jù)存取事務(wù)的邊界,所有數(shù)據(jù)存取事務(wù)都由會話外觀進(jìn)行管理,即會話外觀負(fù)責(zé)數(shù)據(jù)存取事務(wù)的開始和關(guān)閉。</p><p>  業(yè)務(wù)邏輯完成方式:通過調(diào)用邏輯Bean實現(xiàn)業(yè)務(wù)邏輯。</p><p> ?。玻┻壿婤ean    </p><p>  提供了業(yè)務(wù)邏輯具體實現(xiàn);具有可復(fù)用性:可以直接被會話

67、外觀調(diào)用,實現(xiàn)會話外觀所需的業(yè)務(wù)邏輯;可以被其他邏輯Bean調(diào)用,此時此邏輯Bean作為一個更復(fù)雜的業(yè)務(wù)邏輯的一個組成部分。</p><p>  業(yè)務(wù)邏輯完成方式:可以通過調(diào)用其他的邏輯Bean實現(xiàn)相對復(fù)雜的業(yè)務(wù)邏輯;可以直接調(diào)用數(shù)據(jù)存取Bean完成相對簡單的業(yè)務(wù)邏輯。</p><p> ?。常?shù)據(jù)存取Bean    </p><p>

68、  提供了數(shù)據(jù)層的訪問接口;不負(fù)責(zé)管理事務(wù),它只是被動的使用調(diào)用者傳入的事務(wù)環(huán)境;</p><p>  與數(shù)據(jù)庫表的映射方式,通常采取單個數(shù)據(jù)表對應(yīng)單個數(shù)據(jù)存取Bean的映射方式,由單個數(shù)據(jù)存取Bean包含對應(yīng)單個數(shù)據(jù)表的所有相關(guān)數(shù)據(jù)訪問操作。</p><p><b> ?。矗┲祵ο?#160;   </b></p><p>

69、;  包含業(yè)務(wù)邏輯實體的屬性,不包括業(yè)務(wù)邏輯實體的操作;是表示層和業(yè)務(wù)邏輯層數(shù)據(jù)交換的主體單元,和會話外觀一同組成了完整的業(yè)務(wù)邏輯實體,提供了業(yè)務(wù)邏輯層面向表示層的統(tǒng)一接口;與數(shù)據(jù)庫表的映射方式,通常采取單個數(shù)據(jù)表對應(yīng)單個值對象的映射方式;可以與不同類型值對象以聚合方式組成新的值對象。</p><p> ?。ǎ常┡c其他層接口    </p><p> ?。保┯?/p>

70、會話外觀提供面向表示層的業(yè)務(wù)邏輯調(diào)用接口,表示層通過Java本地調(diào)用訪問業(yè)務(wù)邏輯層。</p><p> ?。玻?shù)據(jù)存取Bean通過JDBC訪問數(shù)據(jù)庫服務(wù)。</p><p> ?。常?shù)據(jù)存取Bean通過操作系統(tǒng)提供的系統(tǒng)服務(wù)訪問文件數(shù)據(jù)。</p><p>  5.2.3 表示層    </p><p>&

71、lt;b> ?。ǎ保佣x</b></p><p>  表示層接受用戶提交的輸入請求,通過對業(yè)務(wù)邏輯層的訪問,獲得并向用戶輸出可視化響應(yīng)。</p><p><b> ?。ǎ玻┙M件定義</b></p><p>  采用MVC設(shè)計模式,由Servlet提供頁面請求和請求響應(yīng)的總體控制,JSP和瀏覽器提供請求結(jié)果響應(yīng)的可視化顯示。&

72、lt;/p><p><b>  1)Servlet</b></p><p>  接收所有用戶由通過瀏覽器提交的業(yè)務(wù)請求,并合成相應(yīng)的值對象,訪問業(yè)務(wù)邏輯層完成業(yè)務(wù)邏輯實體的業(yè)務(wù)處理;將業(yè)務(wù)邏輯實體的變化以值對象的方式通知并轉(zhuǎn)向相應(yīng)的JSP。</p><p><b>  2)JSP</b></p><p>

73、;  根據(jù)Servlet告知的值對象,合成請求響應(yīng)結(jié)果的最終輸出格式化文本(HTML);將合成格式化文本以網(wǎng)絡(luò)協(xié)議的方式發(fā)送給提交業(yè)務(wù)請求的用戶瀏覽器。</p><p><b>  3)瀏覽器</b></p><p>  提供用戶輸入業(yè)務(wù)請求數(shù)據(jù)的輸入界面,數(shù)據(jù)驗證通過后提交業(yè)務(wù)請求;接收業(yè)務(wù)請求響應(yīng)的HTML文本,將業(yè)務(wù)請求響應(yīng)結(jié)果以可視化的訪問呈現(xiàn)給用戶。<

74、/p><p> ?。矗¦ebService</p><p>  是業(yè)務(wù)邏輯層對外部系統(tǒng)提供服務(wù)的邊界和接口,完成和外部系統(tǒng)的集成和交互。</p><p><b>  (3)與其他層接口</b></p><p> ?。保㏒ervlet通過Java本地調(diào)用訪問業(yè)務(wù)邏輯層。</p><p> ?。玻g覽器通

75、過HTTP/HTTPS協(xié)議向表示層提出業(yè)務(wù)請求并接收表示層的業(yè)務(wù)響應(yīng)。</p><p>  5.3  框架的配置文件</p><p> ?。ǎ保┫到y(tǒng)初始化配置文件:web.xml </p><p>  該文件是Controller專屬的配置信息文件。控制器在第一次啟動時需要從這個文件載入系統(tǒng)的配置信息。文件內(nèi)容如下:</p><p>

76、; ?。ǎ玻╉撁鎸?dǎo)航配置文件:web_config.xml </p><p>  web_config.xml文件是整個框架的重要部分,它控制了系統(tǒng)執(zhí)行時的執(zhí)行流程。該文件包括兩種元素:<forwards>和<action-mappings>,其中<forwards>元素用來設(shè)置當(dāng)前要轉(zhuǎn)向調(diào)用的JSP頁面,而<action-mappings>則設(shè)置了當(dāng)前用戶提交的操

77、作要調(diào)用哪一個Action 類,及當(dāng)前類中的哪個方法。</p><p><b> ?。础⒖偨Y(jié)</b></p><p>  WebFramework框架已經(jīng)在一個航運管理項目中經(jīng)過測試和檢驗,實踐證明,此框架在中大型項目開發(fā)中,可以縮短開發(fā)周期,提高開發(fā)效率,系統(tǒng)運行穩(wěn)定,易于維護(hù)。</p><p>  有關(guān)應(yīng)用開發(fā)框架的研究是一個不斷深入,逐步

78、完善的過程,在對WebFramework不斷推廣試用的基礎(chǔ)上,還將進(jìn)一步擴展其功能,使其應(yīng)用領(lǐng)域更加廣泛。</p><p><b>  結(jié)論</b></p><p>  短暫而又寶貴的畢業(yè)設(shè)計結(jié)束了,在這段時間內(nèi)使我又一次對整個大學(xué)4年所學(xué)過的知識進(jìn)行了總結(jié)。本次畢業(yè)設(shè)計給了我一個實踐的機會,鍛煉了自己的意志及能力,并且在實踐中加深了對理論知識的理解,積累了豐富的經(jīng)驗

79、,為畢業(yè)后走向社會打下了良好的基礎(chǔ)。在設(shè)計中,我獲得了許多從課堂上學(xué)不到的知識和有意義的收獲,其中我對以下方面有很深刻的體會:充分利用互聯(lián)網(wǎng)和圖書館查閱資料,對設(shè)計有很大的幫助,可以避免走許多必要的彎路,大大提高了效率。在設(shè)計時多與同學(xué)和導(dǎo)師討論和溝通,這樣可以相互交流經(jīng)驗,從而充實和提高自己。</p><p>  由于時間的倉促和經(jīng)驗的不足及其他各個方面的原因,在設(shè)計中還有許多待完善的地方。</p>

80、<p><b>  致謝</b></p><p>  時光荏苒,歲月如梭。記憶的雪花翩翩起舞,思緒定格在鳳凰花開的季節(jié)。揮灑過汗水,也滴落過淚花,這里有我熟悉的一切,有我熱愛的一切?;秀敝校诿利惖哪虾?,度過了人生中最為寶貴的年華。 </p><p>  鳳凰涅磐需要經(jīng)歷烈火的煎熬和痛苦的考驗。邁進(jìn)象牙塔殿堂時的激動,仍時刻在內(nèi)心回蕩,不知不覺中完成了

81、人生中最大的一次蛻變。蛻變需要經(jīng)歷過磨練,磨練可以讓我們更為堅強,去勇敢面對生活中所遇到的困難與磨難。 </p><p>  我要特別感謝我的指導(dǎo)老師XXX老師。是你的悉心的指導(dǎo)、關(guān)心和鼓勵下,才使得我養(yǎng)成科學(xué)嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度,也讓我學(xué)會了如何去解決所遇到的問題。感謝你們讓我懂得了科學(xué)探索的奧秘在于永遠(yuǎn)保持一個樂觀積極向上的心態(tài)以及腳踏實地勤勉的務(wù)實作風(fēng),這是獲得勝利的無敵通關(guān)密碼。</p><

82、p><b>  參考文獻(xiàn)</b></p><p>  [1]Erich Gamma, Richard Helm, Ralph Johnson John Vlissides, ”Design Patterns”, Addison Wesley, 1995, Page214-218</p><p>  [2]張洪偉, “Tomcat Web 開發(fā)及整合應(yīng)用” , 清

83、華大學(xué)出版社, 2006, Page413-420</p><p>  [3]Ted Husted, “Struts In Action” Manning Publication Co., 2003, Page46-49</p><p>  [4]Struts 技術(shù)站點(DB/OL) . http://struts.apache.org</p><p>  [5]胡

84、萍陳世平.基于Web 服務(wù)的企業(yè)信息系統(tǒng)的設(shè)計與實現(xiàn)[J].微計算機信息,2007,9:27-29__</p><p>  [6]Robin Williams.《寫給大家看的設(shè)計書》.人民郵電出版社, 2009年1月 </p><p>  [7]閻宏.《Java與模式》.電子工業(yè)出版社,2002年10月 </p><p>  [8]孫衛(wèi)琴.《Tomcat與Java

85、 Web開發(fā)技術(shù)詳解》.電子工業(yè)出版社,2009年1月</p><p>  [9]BruceEckel.《Java編程思想》.機械工業(yè)出版社,2007年6月</p><p>  [10]高洪巖.《至簡SSH:精通java web 實用開發(fā)技術(shù)》.電子工業(yè)出版社,2009年9月</p><p>  [11]李剛.《Struts2.1權(quán)威指南》.電子工業(yè)出版社,2009

86、年6月</p><p>  [12]林上杰.《JSP2.0技術(shù)手冊》.電子工業(yè)出版社,2009年9月</p><p>  [13]《Thinking in JAVA》</p><p>  [14]《精通Struts:基于MVC的Java Web設(shè)計與開發(fā)》. 電子工業(yè)出版社,2002年</p><p>  [15]http://www.ver

溫馨提示

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

評論

0/150

提交評論