版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
課程設(shè)計(jì)說明書課程設(shè)計(jì)說明書 課程名稱設(shè)計(jì)模式課程設(shè)計(jì) 設(shè)計(jì)題目設(shè)計(jì)模式在FileUpload組件中的應(yīng)用 班號(hào)專業(yè)軟件工程 學(xué)生姓名###### 指導(dǎo)教師(簽字)目錄設(shè)計(jì)模式概述1.1模式與設(shè)計(jì)模式1.2設(shè)計(jì)模式的定義1.3設(shè)計(jì)模式的基本要素1.4設(shè)計(jì)模式的分類FileUpload組件簡介2.1FileUpload組件由來及使用2.2FileUpload組件的工作原理2.3FileUpload組件中的部分接口、類簡介設(shè)計(jì)模式在FileUpload組件中的應(yīng)用3.1工廠方法模式在FileUpload組件中的應(yīng)用3.2策略模式在FileUpload組建中的應(yīng)用3.3迭代器模式在FileUpload組建中的應(yīng)用3.4FileUpload組件中的重要類圖結(jié)束語4.1收獲與總結(jié)4.2參考文獻(xiàn)設(shè)計(jì)模式概述1.1模式與設(shè)計(jì)模式模式起源于建筑業(yè)而非軟件業(yè),模式(Pattern)之父—美國加利佛尼亞大學(xué)環(huán)境結(jié)構(gòu)中心研究所所長ChristopherAlexander博士。Alexander給出了關(guān)于模式的經(jīng)典定義:每個(gè)模式都描述了我們環(huán)境中不斷出現(xiàn)的問題,然后描述了解決這個(gè)問題解決方案的核心,通過這種方式,我們可以無數(shù)次的重用那些已有的解決方案,無需再重復(fù)相同的工作,也可以用一句話概括為:模式是在特定環(huán)境中解決問題的一種方案。最早將Alexander博士的模式思想引入軟件工程方法學(xué)的是以四人組(GangofFour,GoF)自稱的四位著名軟件工程學(xué)者,他們在1949歸納發(fā)表的23中在軟件開發(fā)中使用頻率較高的設(shè)計(jì)模式,旨在用模式來統(tǒng)一溝通面向?qū)ο蠓椒▽W(xué)在分析、設(shè)計(jì)和實(shí)現(xiàn)間的鴻溝。GoF將模式的概念引入軟件工程領(lǐng)域,標(biāo)志著軟件模式的誕生,軟件模式是將模式的一般概念應(yīng)用于軟件開發(fā)領(lǐng)域,即軟件開發(fā)的總體指導(dǎo)思想或參照樣板軟件模式并非僅限于設(shè)計(jì)模式,還包括架構(gòu)模式、分析模式、和過程模式等。從1987年KentBeck和WardCunningham借鑒Alexander的模式思想在程序開發(fā)中開始應(yīng)用一些模式到目前設(shè)計(jì)模式在軟件開發(fā)的廣泛應(yīng)用,Sun公司的JavaSE/JavaEE平臺(tái)和Microsoft公司的.net平臺(tái)設(shè)計(jì)中就應(yīng)用了大量的設(shè)計(jì)模式。再設(shè)計(jì)模式領(lǐng)域,下一的設(shè)計(jì)模式是指GoF的《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書中包含的23中經(jīng)典設(shè)計(jì)模式,不過設(shè)計(jì)模式并不僅僅只有這23中,隨著軟件開發(fā)技術(shù)的發(fā)展,越來越多的模式不斷誕生并得以廣泛應(yīng)用。1.2設(shè)計(jì)模式的定義設(shè)計(jì)模式(DesignPattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),使用設(shè)計(jì)模式是為了可重用代碼,讓代碼更容易被他人理解,保證代碼的可靠性。1.3設(shè)計(jì)模式的基本要素1.3.1模式名稱(Patternname)模式名稱通過一兩個(gè)詞來描述模式的問題、解決方案和效果,以便更好地理解模式并方便開發(fā)人員之間的交流,絕大多數(shù)模式都是根據(jù)其功能或模式結(jié)構(gòu)來命名的。 1.3.2問題(Problem)
問題描述了應(yīng)該在何時(shí)使用模式,它包含了設(shè)計(jì)中存在的問題以及問題存在的原因。這些問題有些是一些特定的設(shè)計(jì)問題,如怎樣使用對象封裝狀態(tài)或者使用對象表示算法等,也可能是系統(tǒng)中存在不靈活的類或?qū)ο蠼Y(jié)構(gòu),導(dǎo)致系統(tǒng)可維護(hù)性較差。1.3.3解決方案(Solution)解決方案描述了設(shè)計(jì)模式的組成成分,以及這些組成成分之間的相互關(guān)系,各自的職責(zé)和協(xié)作方式。模式是一個(gè)通用的模板,它們可以應(yīng)用于各種不同的場合,解決方案并不描述一個(gè)特定而具體的設(shè)計(jì)或?qū)崿F(xiàn),而是提供設(shè)計(jì)問題的抽象描述和怎樣用一個(gè)具有一般意義的元素組合(類或?qū)ο蠼M合)來解決這個(gè)問題。1.3.4效果(Consequences)效果描述了模式應(yīng)用的效果以及在使用模式時(shí)應(yīng)權(quán)衡的問題。效果主要包含模式的優(yōu)缺點(diǎn)分析,我們應(yīng)該知道,沒有任何一個(gè)解決方案是百分之百完美的,在使用設(shè)計(jì)模式時(shí)需要進(jìn)行合理的評價(jià)和選擇。1.4設(shè)計(jì)模式的分類根據(jù)設(shè)計(jì)模式的目的(模式是用來做什么的)可分為創(chuàng)建型(creational)、結(jié)構(gòu)型(structural)和行為型(behavioral)三種。以下是GoF的23中經(jīng)典模式的分類。FileUpload組件簡介2.1.FileUpload組件由來及使用FileUpload是Apachecommons下面的一個(gè)子項(xiàng)目,用來實(shí)現(xiàn)Java環(huán)境下面的文件上傳功能,與常見的Smartypants齊名。需要注意的是FileUpload組件在使用時(shí)依賴于CommonsIO組件,因此在繼續(xù)之前,要確保在你的工程classpath中有描述頁中提到的相應(yīng)版本,本次課程實(shí)際使用的FileUpload版本為:commons-fileupload-1.3.1,CommonsIO版本為:commons-io-1.4。2.2.FileUpload組件的工作原理上傳的文件要求包括一個(gè)根據(jù)RFC1867(在HTML中基于表單的文件)編碼的選項(xiàng)列表清單。組件FileUpload可以解析這個(gè)請求,并給你的應(yīng)用程序提供一份獨(dú)立上傳的項(xiàng)目清單。無論每個(gè)項(xiàng)目背后如何執(zhí)行都實(shí)現(xiàn)了FileItem接口。這里將描述組件FileUpload庫的普通API,這些API比較簡單。不過,對于最終的實(shí)現(xiàn),你可以參考最新的API流。每一個(gè)文件項(xiàng)目都有一些屬性,這些可能在你的應(yīng)用程序中應(yīng)用到。比如:每一個(gè)項(xiàng)目有一個(gè)名稱name和內(nèi)容類型contenttype,并提供了一個(gè)InputStream訪問其數(shù)據(jù)。另一方面,你處理項(xiàng)目的方法可能有所不同,這個(gè)依賴于是否這個(gè)項(xiàng)目是一個(gè)規(guī)則的表單域,即:這個(gè)數(shù)據(jù)是來自普通的表單文本,還是普通的HTML域或是一個(gè)上傳文件。在FileItem接口中提供了處理這些問題的方法,可以更加方便的去訪問這些數(shù)據(jù)。組件FileUpload使用FileItemFactory工廠創(chuàng)建新的文件項(xiàng)目。這個(gè)給了組件FileUpload很大的靈活性。這個(gè)工廠擁有怎樣創(chuàng)建項(xiàng)目的最終控制權(quán)。工廠執(zhí)行過程中上傳項(xiàng)目文件的臨時(shí)數(shù)據(jù)可以存儲(chǔ)在內(nèi)存中或硬盤上。這個(gè)依賴于上傳項(xiàng)目的大小(即:數(shù)據(jù)的字節(jié))。不過這種行為可以在你的應(yīng)用程序中適當(dāng)?shù)淖远ㄖ啤?.3FileUpload組件中部分接口、類簡介2.3.1FileItem接口mons.fileupload.disk.DiskFileItem實(shí)現(xiàn)了FileItem接口,用來封裝單個(gè)表單字段元素的數(shù)據(jù)。通過調(diào)用FileItem定義的方法可以獲得相關(guān)表單字段元素的數(shù)據(jù)。2.3.2FileUpload類FileUpload類的繼承結(jié)構(gòu):java.lang.Omons.fileupload.FileUploadBase mons.fileupload.FileUpload2.3.3DiskFileItemFactory此類將請求消息實(shí)體中的每一個(gè)項(xiàng)目封裝成單獨(dú)的DiskFileItem(FileItem接口的實(shí)現(xiàn))對象的任務(wù)由mons.fileupload.FileItemFactory接口的默認(rèn)實(shí)現(xiàn)mons.fileupload.disk.DiskFileItemFactory來完成。當(dāng)上傳的文件項(xiàng)目比較小時(shí),直接保存在內(nèi)存中(速度比較快),比較大時(shí),以臨時(shí)文件的形式,保存在磁盤臨時(shí)文件夾(雖然速度慢些,但是內(nèi)存資源是有限的)。2.3.4ServletFileUpload類mons.fileupload.servlet.ServletFileUpload類是Apache文件上傳組件處理文件上傳的核心高級類(所謂高級就是不需要管底層實(shí)現(xiàn),暴露給用戶的簡單易用的接口)。使用其parseRequest(HttpServletRequest)方法可以將通過表單中每一個(gè)HTML標(biāo)簽提交的數(shù)據(jù)封裝成一個(gè)FileItem對象,然后以List列表的形式返回。第三章設(shè)計(jì)模式在FileUpload組件中的應(yīng)用3.1工廠方法模式在FileUpload組件中的應(yīng)用3.1.1工廠方法模式定義工廠方法模式(FactoryMethodPattern)定義:工廠方法模式又稱為工廠模式,也叫虛擬構(gòu)造器(VirtualConstructor)模式或者多態(tài)工廠(PolymorphicFactory)模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類。3.1.2工廠方法模式結(jié)構(gòu)1.Product(抽象產(chǎn)品)
抽象產(chǎn)品是定義產(chǎn)品的接口,是工廠方法模式所創(chuàng)建對象的超類型,也就是產(chǎn)品對象的共同父類或接口。2.ConcreteProduct(具體產(chǎn)品)具體產(chǎn)品實(shí)現(xiàn)了抽象產(chǎn)品接口,某種類型的具體產(chǎn)一一對應(yīng)。3.Factory(抽象工廠)在抽象工廠類中,聲明了工廠方法(FactoryMethod)廠方法模式的核心,它與應(yīng)用程序無關(guān)。任何在模式中創(chuàng)建對象的工廠類都必須實(shí)現(xiàn)該接口。4.ConcreteFactory(具體工廠)具體工廠是抽象工廠類的子類,實(shí)現(xiàn)了抽象工廠中返回一個(gè)具體產(chǎn)品類的實(shí)例。在具體工廠類中包含與應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對象。
3.1.3模式分析工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。工廠方法模式保持了簡單工廠模式的優(yōu)點(diǎn),而且克服了的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不負(fù)責(zé)哪一個(gè)產(chǎn)方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)類與產(chǎn)品類往往具有平行的等級結(jié)構(gòu),它們之間一一對應(yīng)。通過分析,該組件中應(yīng)用了工廠方法模式的類如下:FileItemFactory類(抽象工廠):是工廠方法的核心,它與應(yīng)用程序無關(guān)。包含了抽象的工廠方法:FileItemcreateItem(StringfieldName,StringcontentType,booleanisFormField,StringfileName);返回一個(gè)抽象產(chǎn)品FileItem對象。DiskFileItemFactory類(具體工廠):實(shí)現(xiàn)了抽象工廠方法FileItemcreateItem(),在工廠方法中創(chuàng)建并返回一個(gè)對象的具體產(chǎn)品。publicFileItemcreateItem(StringfieldName,StringcontentType,booleanisFormField,StringfileName){DiskFileItemresult=newDiskFileItem(fieldName,contentType,isFormField,fileName,sizeThreshold,repository);FileCleaningTrackertracker=getFileCleaningTracker();if(tracker!=null){tracker.track(result.getTempFile(),result);}returnresult;}FileItem類(抽象產(chǎn)品),是一個(gè)接口,其中包含了產(chǎn)品類所具有的所有的業(yè)務(wù)方法。InputStreamgetInputStream()throwsIOException;StringgetContentType();StringgetName();booleanisInMemory();longgetSize();byte[]get();StringgetString(Stringencoding)throwsUnsupportedEncodingException;StringgetString();voidwrite(Filefile)throwsException;voiddelete();StringgetFieldName();voidsetFieldName(Stringname);booleanisFormField();voidsetFormField(booleanstate);OutputStreamgetOutputStream()throwsIOException;DiskFileItem類(具體產(chǎn)品類):是抽象產(chǎn)品FileItem接口的子類,實(shí)現(xiàn)了FileItem接口中所有的業(yè)務(wù)方法,以下就其中的部分方法的實(shí)現(xiàn)做介紹:publicInputStreamgetInputStream()throwsIOException{if(!isInMemory()){returnnewFileInputStream(dfos.getFile());}if(cachedContent==null){cachedContent=dfos.getData();}returnnewByteArrayInputStream(cachedContent);}3.2策略模式在FileUpload組建中的應(yīng)用3.2.1策略模式定義策略模式(StrategyPattern)定義:定義一系列算法,將每一個(gè)算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化,也稱為政策模式(Policy)策略模式是一種對象行為型模式。3.2.2策略模式結(jié)構(gòu)圖Context(環(huán)境類)環(huán)境類是使用算法的角色,它在解決某個(gè)問題時(shí)可以采用多種策略。在環(huán)境類中維護(hù)一個(gè)對抽象策略類的引用實(shí)例,用于定義所采用的策略。Strategy(抽象策略類)抽象策略類為所支持的算法申明了抽象方法,是所有策略類的父類,他可以是抽象類也可以是接口。環(huán)境類使用在其中聲明的方法調(diào)用在具體策略類中實(shí)現(xiàn)的算法。concretStrategy(具體策略類)具體策略類實(shí)現(xiàn)了在抽象策略中定義的算法,在運(yùn)行時(shí),具體策略類將覆蓋在環(huán)境淚中定義的抽象策略類對象,使用一種具體的算法實(shí)現(xiàn)某個(gè)業(yè)務(wù)處理。
3.2.3策略模式分析策略模式是對算法的封裝,它把算法的責(zé)任和算法本身分割開,委派給不同的對象管理。策略模式通常把一個(gè)系列的算法封裝到一系列的策略類里面,作為一個(gè)抽象策略類的子類。用一句話來說,就是“準(zhǔn)備一組算法,并將每一個(gè)算法封裝起來,使得它們可以互換”。3.2.4策略模式在FileUpload組件中的分析類圖如下:FileUpload類(環(huán)境類)publicclassFileUploadextendsFileUploadBase{privateFileItemFactoryfileItemFactory;publicFileUpload(){super();}publicFileUpload(FileItemFactoryfileItemFactory){super();this.fileItemFactory=fileItemFactory;}publicFileItemFactorygetFileItemFactory(){returnfileItemFactory;}publicvoidsetFileItemFactory(FileItemFactoryfactory){this.fileItemFactory=factory;}}FileUpload類是環(huán)境類,他定義并維持了對抽象策略類的一個(gè)引用,通過其方法privateFileItemFactoryfileItemFactory;可以在運(yùn)行時(shí)設(shè)置一種具體策略,并在其算法下調(diào)用策略類提供的算法完成相應(yīng)的業(yè)務(wù)處理。FileItemFactory類(抽象策略類)publicinterfaceFileItemFactory{FileItemcreateItem(StringfieldName,StringcontentType,booleanisFormField,StringfileName);}FileItemFactory作為抽象策略類,它定義了算法的抽象定義,而在其子類DiskFileItemFactory類中實(shí)現(xiàn)了具體算法。DiskFileItemFactory類(具體策略類)publicclassDiskFileItemFactoryimplementsFileItemFactory{publicstaticfinalintDEFAULT_SIZE_THRESHOLD=10240;privateFilerepository;privateintsizeThreshold=DEFAULT_SIZE_THRESHOLD;privateFileCleaningTrackerfileCleaningTracker;publicDiskFileItemFactory(){this(DEFAULT_SIZE_THRESHOLD,null);}publicDiskFileItemFactory(intsizeThreshold,Filerepository){this.sizeThreshold=sizeThreshold;this.repository=repository;}publicFilegetRepository(){returnrepository;}publicvoidsetRepository(Filerepository){this.repository=repository;}publicintgetSizeThreshold(){returnsizeThreshold;}publicvoidsetSizeThreshold(intsizeThreshold){this.sizeThreshold=sizeThreshold;}publicFileItemcreateItem(StringfieldName,StringcontentType,booleanisFormField,StringfileName){DiskFileItemresult=newDiskFileItem(fieldName,contentType,isFormField,fileName,sizeThreshold,repository);FileCleaningTrackertracker=getFileCleaningTracker();if(tracker!=null){tracker.track(result.getTempFile(),result);}returnresult;}publicFileCleaningTrackergetFileCleaningTracker(){returnfileCleaningTracker;}publicvoidsetFileCleaningTracker(FileCleaningTrackerpTracker){fileCleaningTracker=pTracker;}}DiskFileItemFactory類作為FileItemFactory類的子類,是一種具體策略類,實(shí)現(xiàn)了抽象策略類中的方法。3.3迭代器模式在FileUpload組建中的應(yīng)用3.3.1迭代器模式定義迭代器模式(Iteratorpattern)定義:提供一種方法來訪問聚合對象,而不用暴露這個(gè)對象的內(nèi)部表示,其別名為游標(biāo)(Cursor)。迭代器模式是一種對象行為型模式。3.3.2迭代器模式結(jié)構(gòu)迭代器模式包含如下角色:Iterator(抽象迭代器)
抽象迭代器定義了訪問和遍歷元素的接口,一般聲明如下方法:用于獲取第一個(gè)元素的first(),用于訪問下一個(gè)元素的next(),用于判斷是否還有下一個(gè)元素的hasNext(),用于獲取當(dāng)前元素的。urrentltemO,在其子類中將實(shí)現(xiàn)這些方法。Concretelterator(具體迭代器)
具體迭代器實(shí)現(xiàn)了抽象迭代器接口,完成對聚合對象的遍歷,同時(shí)在對聚合進(jìn)行遍歷時(shí)跟蹤其當(dāng)前位置。Aggregate(抽象聚合類)抽象聚合類用于存儲(chǔ)對象,并定義創(chuàng)建相應(yīng)迭代器對象的接口,聲明一個(gè)createIterator()方法用于創(chuàng)建一個(gè)迭代器對象。4.ConcreteAggregate(具體聚合類)具體聚合類實(shí)現(xiàn)了創(chuàng)建相應(yīng)迭代器的接口,實(shí)現(xiàn)了在聚合類中聲明的createlterator()方法,該方法返回一個(gè)與該具體聚合對應(yīng)的具體迭代器Concretelterator實(shí)例。
3.3.3迭代器模式分析根據(jù)“單一職責(zé)原則”,在面向?qū)ο笤O(shè)計(jì)時(shí),對象承擔(dān)的職責(zé)越少,則該對象的穩(wěn)定性就很好,受到的約束也就越少,復(fù)用也就越方便。職責(zé)分離可以最大限度地減少彼此之間的耦合程度,從而建立一個(gè)松散藕合的對象網(wǎng)絡(luò),職責(zé)分離的要點(diǎn)是對被分離的職責(zé)進(jìn)行封裝,以抽象的方式建立起彼此之間的關(guān)系。以聚合對象為例,聚合是一個(gè)管理和組織數(shù)據(jù)對象的數(shù)據(jù)結(jié)構(gòu)。這就表明聚合首先應(yīng)備一個(gè)基本功能,即存儲(chǔ)數(shù)據(jù),這其中包含存儲(chǔ)數(shù)據(jù)的類型、存儲(chǔ)空間的大小、存儲(chǔ)空間的配,以及存儲(chǔ)的方式和順序。如果不具備這些特點(diǎn),則該對象就不能稱為聚合對象。也就,存儲(chǔ)數(shù)據(jù)是聚合對象最基本的職責(zé)。然而,聚合對象除了能夠存儲(chǔ)數(shù)據(jù)外,還必須提前遍歷訪問其內(nèi)部數(shù)據(jù)的方式,同時(shí)這些遍歷方式可能會(huì)根據(jù)不同的情形提供不同的實(shí)現(xiàn)正向遍歷或逆向遍歷等。因此,聚合對象主要擁有兩個(gè)職責(zé):一是存儲(chǔ)內(nèi)部數(shù)據(jù);二是遍歷內(nèi)部數(shù)據(jù)。但是前者是聚合對象的基木功能,而后者是可以分離的。因此,我們將遍歷聚合對象中數(shù)據(jù)的行為提取出來,封裝到一個(gè)迭代器中,通過專門的迭代器來遍歷聚合對象內(nèi)部數(shù)據(jù),這就是迭代器模式的本質(zhì)。迭代器模式是“單一職責(zé)原則”的完美體現(xiàn)。經(jīng)分析可知,迭代器模式在FileUpload組件中的應(yīng)用情況如下:FileItemIterator(抽象迭代器):publicinterfaceFileItemIterator{booleanhasNext()throwsFileUploadException,IOException;FileItemStreamnext()throwsFileUploadException,IOException;}Next方法用于訪問下一個(gè)元素,hasNext方法用于判斷是否還有下一個(gè)元素。FileItemIteratorImpl(具體迭代器):privateclassFileItemIteratorImplimplementsFileItemIterator{FileItemIteratorImpl(RequestContextctx)throwsFileUploadException,IOException{if(ctx==null){thrownewNullPointerException("ctxparameter");}StringcontentType=ctx.getContentType();if((null==contentType)||(!contentType.toLowerCase(Locale.ENGLISH).startsWith(MULTIPART))){thrownewFileUploadBase.InvalidContentTypeException(format("therequestdoesn'tcontaina%sor%sstream,contenttypeheaderis%s",contentType));}.................(此處省略若干行)publicbooleanhasNext()throwsFileUploadException,IOException{if(eof){returnfalse;}if(itemValid){returntrue;}try{returnfindNextItem();}catch(FileUploadIOExceptione){//unwrapencapsulatedSizeExceptionthrow(FileUploadException)e.getCause();}}publicFileItemStreamnext()throwsFileUploadException,IOException{if(eof||(!itemValid&&!hasNext())){thrownewNoSuchElementException();}itemValid=false;returncurrentItem;}}抽象聚合類(FileItemStream)publicinterfaceFileItemStreamextendsFileItemHeadersSupport{publicstaticclassItemSkippedExceptionextendsIOException{privatestaticfinallongserialVersionUID=-7280778431581963740L;}InputStreamopenStream()throwsIOException;StringgetContentType();StringgetName();StringgetFieldName();booleanisFormField();}具體聚合類(FileItemStreamImpl)publicclassFileItemStreamImplimplementsFileItemStream{privatefinalStringcontentType;privatefinalStringfieldName;privatefinalStringname;privatefinalbooleanformField;privatefinalInputStreamstream;privatebooleanopened;privateFileItemHeadersheaders;FileItemStreamImpl(StringpName,StringpFieldName,StringpContentType,booleanpFormField,longpContentLength)throwsIOException{name=pName;fieldName=pFieldName;contentType=pContentType;formField=pFormField;......(省略若干行)publicStringgetContentType(){returncontentType;}publicStringgetFieldName(){returnfieldName;}publicStringgetName(){returnStreams.checkFileName(name);}publicbooleanisFormField(){returnformField;}publicInputStreamopenStream()throwsIOException{if(opened){thrownewIllegalStateException("Thestreamwasalreadyopened.");}if(((Closeable)stream).isClosed()){thrownewFileItemStream.ItemSkippedException();}returnstream;}voidclose()throwsIOException{stream.close();}publicFileItemHeadersgetHeaders(){returnheaders;}publicvoidsetHeaders(FileItemHeaderspHeaders){headers=pHeaders;}}3.4FileUpload組件中的重要類圖3.4.1所有類匯總圖:3.4.2重要類之間的類圖:FileItem類
FileItem類用來封裝單個(gè)表單字段元素的數(shù)據(jù),一個(gè)表單字段元素對應(yīng)一個(gè)FileItem對象,通過調(diào)用FileItem對象的方法可以獲得相關(guān)表單字段元素的數(shù)據(jù)。FileItem是一個(gè)接口,在應(yīng)用程序中使用的實(shí)際上是該接口一個(gè)實(shí)現(xiàn)類,該實(shí)現(xiàn)類的名稱并不重要,程序可以采用FileItem接口類型來對它進(jìn)行引用和訪問,為了便于講解,這里將FileItem實(shí)現(xiàn)類稱之為FileItem類。FileItem類還實(shí)現(xiàn)了Serializable接口,以支持序列化操作。其中的重要方法為:isFormField方法用于判斷FileItem類對象封裝的數(shù)據(jù)是否屬于一個(gè)普通表單字段,還是屬于一個(gè)文件表單字段,如果是普通表單字段則返回true,否則返回false。該方法的完整語法定義如下:
publicbooleanisFormField();getName方法用于獲得文件上傳字段中的文件名。getName方法的完整語法定義如下:
publicStringgetName();write方法用于將FileItem對象中保存的主體內(nèi)容保存到某個(gè)指定的文件中。其完整語法定義如下:
publicvoidwrite(Filefile);getString方法用于將FileItem對象中保存的主體內(nèi)容作為一個(gè)字符串返回,它有兩個(gè)重載的定義形式:
publicjava.lang.StringgetString()
publicjava.lang.StringgetString(java.lang.Stringencoding)
throwsjava.io.UnsupportedEncodingException;getContentType方法用于獲得上傳文件的類型,getContentType方法的完整語法定義如下:
publicStringgetContentType();isInMemory方法用來判斷FileItem類對象封裝的主體內(nèi)容是存儲(chǔ)在內(nèi)存中,還是存儲(chǔ)在臨時(shí)文件中,如果存儲(chǔ)在內(nèi)存中則返回true,否則返回false。其完整語法定義如下:
publicbooleanisInMemory();FileUploadException類在文件上傳過程中,可能發(fā)生各種各樣的異常,例如網(wǎng)絡(luò)中斷、數(shù)據(jù)丟失等等。為了對不同異常進(jìn)行合適的處理,Apache文件上傳組件還開發(fā)了四個(gè)異常類,其中FileUploadException是其他異常類的父類,其他幾個(gè)類只是被間接調(diào)用的底層類,對于Apache組件調(diào)用人員來說,只需對FileUploadException異常類進(jìn)行捕獲和處理即可。MultipartStream類用來對上傳的請求輸入流進(jìn)行解析,它是整個(gè)Apache上傳組件中最復(fù)雜的類。
DiskFileUpload類是文件上傳組件的核心類,它是一個(gè)總的控制類,首先由Apache文件上傳組件的使用者直接調(diào)用DiskFileUpload類的方法,DiskFileUpload類再調(diào)用和協(xié)調(diào)更底層的類來完成具體的功能。解析類MultipartStream和工廠類DefaultFileItemFactory就是DiskFileUpload類調(diào)用的兩個(gè)的底層類。MultipartStream類用于對請求消息中的實(shí)體數(shù)據(jù)進(jìn)行具體解析,DefaultFileItemFactory類對MultipartStream類解析出來的數(shù)據(jù)進(jìn)行封裝,它將每個(gè)表單字段數(shù)據(jù)封裝成一個(gè)個(gè)的FileItem類對象,用戶通過FileItem類對象來獲得相關(guān)表單字段的數(shù)據(jù)。DefaultFileItem是FileItem接口的實(shí)現(xiàn)類,實(shí)現(xiàn)了FileItem接口中定義的功能,用戶只需關(guān)心FileItem接口,通過FileItem接口來使用DefaultFileItem類實(shí)現(xiàn)的功能。DefaultFileItem類使用了兩個(gè)成員變量來分別存儲(chǔ)表單字段數(shù)據(jù)的描述頭和主體內(nèi)容,其中保存主體內(nèi)容的變量類型為DeferredFileOutputStream類。DeferredFileOutputStream類是一個(gè)輸出流類型,在開始時(shí),DeferredFileOutputStream類內(nèi)部使用一個(gè)ByteArrayOutputStream類對象來存儲(chǔ)數(shù)據(jù),當(dāng)寫入它里面的主體內(nèi)容的大小大于DiskFileUpload.setSizeThreshold方法設(shè)置的臨界值時(shí),DeferredFileOutputStream類內(nèi)部創(chuàng)建一個(gè)文件輸出流對象來存儲(chǔ)數(shù)據(jù),并將前面寫入到ByteArrayOutputStream類對象中的數(shù)據(jù)轉(zhuǎn)移到文件輸出流對象中。這個(gè)文件輸出流對象關(guān)聯(lián)的文件是一個(gè)臨時(shí)文件,它的保存路徑由DiskFileUpload.setRepositoryPath方法指定。
結(jié)束語4.1收獲與總結(jié)在這持續(xù)了近乎三個(gè)星期的時(shí)間里,我又把以往所學(xué)的設(shè)計(jì)模式知識(shí)點(diǎn)復(fù)習(xí)了一遍。這種開放式的課程設(shè)計(jì),充分調(diào)動(dòng)了我的主觀能動(dòng)性和自學(xué)的積極性,同時(shí)還讓我對以往所學(xué)知識(shí)的疏忽得以補(bǔ)充。在課程設(shè)計(jì)過程中遇到的一系列問題,也在同學(xué)的熱情幫助下,大豆得到了解決。比如:在分析FileUpload組件中使用的設(shè)計(jì)模式的時(shí)候,需要對這個(gè)組件中的一些類做逆向工程,然后得到類和接口之間的關(guān)系。由于之前課上講過對JDK的分析,所以一開始就對FileUpload組件做類似的處理,但是怎么都行不通,也是在請教了同學(xué),才知道只需要?jiǎng)h除每個(gè)Java文件里的包的信息就可以實(shí)現(xiàn),這才慢慢實(shí)現(xiàn)了逆向工程,得到了想要的類圖,對此組件的分析才能一步一步按部就班的往下走。雖然這次課程設(shè)計(jì)主要是分析FileUpload組件中使用的設(shè)計(jì)模式,但是我覺得這次課程設(shè)計(jì)所了解的設(shè)計(jì)模式比前邊上課的時(shí)候?qū)W習(xí)的知識(shí)點(diǎn)還要多,這次課設(shè)任務(wù)原則上是分析,其實(shí)就是對上學(xué)期所學(xué)知識(shí)點(diǎn)的做一個(gè)系統(tǒng)全面的復(fù)習(xí),然后再將所學(xué)的知識(shí)加以應(yīng)用。對于這個(gè)課題來說,就是找出這個(gè)組件中使用了哪些設(shè)計(jì)模式,并加以分析。作為一個(gè)軟件工程專業(yè)的學(xué)生,編程能力卻很渣,還不怎么愿意看先驅(qū)前輩們的代碼,為了這次的課程設(shè)計(jì),還是耐著頭皮把這個(gè)組件中大部分類與接口的代碼閱讀了一遍,雖然并不怎么了解,但是看了好過不看。通過拜讀大師們的代碼,我發(fā)現(xiàn)我還是可以靜下心來認(rèn)真的做一件有意義的事情,此次課程設(shè)計(jì),我發(fā)現(xiàn)了自身的不足,需要提升自我能力,用不恰當(dāng)?shù)脑捳f就是:“革命尚未成功,同志人需努力|”。課程設(shè)計(jì)是培訓(xùn)學(xué)生運(yùn)用本專業(yè)所學(xué)的理論知識(shí)和專業(yè)知識(shí)來分析解決實(shí)際問題的重要教學(xué)環(huán)節(jié),是對所學(xué)知識(shí)的復(fù)習(xí)和鞏固。因此,我們必須認(rèn)真、謹(jǐn)慎、踏實(shí)、一步一步的完成設(shè)計(jì)。通過課程設(shè)計(jì),我了解到一些實(shí)際與理論之間的差異;通過課程設(shè)計(jì)不僅可以鞏固專業(yè)知識(shí),為以后的工作打下了堅(jiān)實(shí)的基礎(chǔ),而其還可以培養(yǎng)和熟練使用資料,運(yùn)用工具書的能力,把我們所學(xué)的課本知識(shí)與實(shí)踐結(jié)合起來,起到溫故而知新的作用。4.2參考文獻(xiàn)[1]劉偉,設(shè)計(jì)模式.北京:清華大學(xué)出版社,2021.[2]模式工程化實(shí)現(xiàn)及擴(kuò)展.設(shè)計(jì)模式C#版/王翔,孫遜著.北京:電子工業(yè)出版社,2021
咖啡店創(chuàng)業(yè)計(jì)劃書第一部分:背景在中國,人們越來越愛喝咖啡。隨之而來的咖啡文化充滿生活的每個(gè)時(shí)刻。無論在家里、還是在辦公室或各種社交場合,人們都在品著咖啡。咖啡逐漸與時(shí)尚、現(xiàn)代生活聯(lián)系在一齊。遍布各地的咖啡屋成為人們交談、聽音樂、休息的好地方,咖啡豐富著我們的生活,也縮短了你我之間的距離,咖啡逐漸發(fā)展為一種文化。隨著咖啡這一有著悠久歷史飲品的廣為人知,咖啡正在被越來越多的中國人所理解。第二部分:項(xiàng)目介紹第三部分:創(chuàng)業(yè)優(yōu)勢目前大學(xué)校園的這片市場還是空白,競爭壓力小。而且前期投資也不是很高,此刻國家鼓勵(lì)大學(xué)生畢業(yè)后自主創(chuàng)業(yè),有一系列的優(yōu)惠政策以及貸款支持。再者大學(xué)生往往對未來充滿期望,他們有著年輕的血液、蓬勃的朝氣,以及初生牛犢不怕虎的精神,而這些都是一個(gè)創(chuàng)業(yè)者就應(yīng)具備的素質(zhì)。大學(xué)生在學(xué)校里學(xué)到了很多理論性的東西,有著較高層次的技術(shù)優(yōu)勢,現(xiàn)代大學(xué)生有創(chuàng)新精神,有對傳統(tǒng)觀念和傳統(tǒng)行業(yè)挑戰(zhàn)的信心和欲望,而這種創(chuàng)新精神也往往造就了大學(xué)生創(chuàng)業(yè)的動(dòng)力源泉,成為成功創(chuàng)業(yè)的精神基礎(chǔ)。大學(xué)生創(chuàng)業(yè)的最大好處在于能提高自己的潛力、增長經(jīng)驗(yàn),以及學(xué)以致用;最大的誘人之處是透過成功創(chuàng)業(yè),能夠?qū)崿F(xiàn)自己的理想,證明自己的價(jià)值。第四部分:預(yù)算1、咖啡店店面費(fèi)用咖啡店店面是租賃建筑物。與建筑物業(yè)主經(jīng)過協(xié)商,以合同形式達(dá)成房屋租賃協(xié)議。協(xié)議資料包括房屋地址、面積、結(jié)構(gòu)、使用年限、租賃費(fèi)用、支付費(fèi)用方法等。租賃的優(yōu)點(diǎn)是投資少、回收期限短。預(yù)算10-15平米店面,啟動(dòng)費(fèi)用大約在9-12萬元。2、裝修設(shè)計(jì)費(fèi)用咖啡店的滿座率、桌面的周轉(zhuǎn)率以及氣候、節(jié)日等因素對收益影響較大??Х瑞^的消費(fèi)卻相對較高,主要針對的也是學(xué)生人群,咖啡店布局、格調(diào)及采用何種材料和咖啡店效果圖、平面圖、施工圖的設(shè)計(jì)費(fèi)用,大約6000元左右3、裝修、裝飾費(fèi)用具體費(fèi)用包括以下幾種。(1)外墻裝飾費(fèi)用。包括招牌、墻面、裝飾費(fèi)用。(2)店內(nèi)裝修費(fèi)用。包括天花板、油漆、裝飾費(fèi)用,木工、等費(fèi)用。(3)其他裝修材料的費(fèi)用。玻璃、地板、燈具、人工費(fèi)用也應(yīng)計(jì)算在內(nèi)。整體預(yù)算按標(biāo)準(zhǔn)裝修費(fèi)用為360元/平米,裝修費(fèi)用共360*15=5400元。4、設(shè)備設(shè)施購買費(fèi)用具體設(shè)備主要有以下種類。(1)沙發(fā)、桌、椅、貨架。共計(jì)2250元(2)音響系統(tǒng)。共計(jì)450(3)吧臺(tái)所用的烹飪設(shè)備、儲(chǔ)存設(shè)備、洗滌設(shè)備、加工保溫設(shè)備。共計(jì)600(4)產(chǎn)品制造使用所需的吧臺(tái)、咖啡杯、沖茶器、各種小碟等。共計(jì)300凈水機(jī),采用美的品牌,這種凈水器每一天能生產(chǎn)12l純凈水,每一天銷售咖啡及其他飲料100至200杯,價(jià)格大約在人民幣1200元上下??Х葯C(jī),咖啡機(jī)選取的是電控半自動(dòng)咖啡機(jī),咖啡機(jī)的報(bào)價(jià)此刻就應(yīng)在人民幣350元左右,加上另外的附件也不會(huì)超過1200元。磨豆機(jī),價(jià)格在330―480元之間。冰砂機(jī),價(jià)格大約是400元一臺(tái),有點(diǎn)要說明的是,最好是買兩臺(tái),不然夏天也許會(huì)不夠用。制冰機(jī),從制冰量上來說,一般是要留有富余??钪票鶛C(jī)每一天的制冰量是12kg。價(jià)格稍高550元,質(zhì)量較好,所以能夠用很多年,這么算來也是比較合算的。5、首次備貨費(fèi)用包括購買常用物品及低值易耗品,吧臺(tái)用各種咖啡豆、奶、茶、水果、冰淇淋等的費(fèi)用。大約1000元6、開業(yè)費(fèi)用開業(yè)費(fèi)用主要包括以下幾種。(1)營業(yè)執(zhí)照辦理費(fèi)、登記費(fèi)、保險(xiǎn)費(fèi);預(yù)計(jì)3000元(2)營銷廣告費(fèi)用;預(yù)計(jì)450元7、周轉(zhuǎn)金開業(yè)初期,咖啡店要準(zhǔn)備必須量的流動(dòng)資金,主要用于咖啡店開業(yè)初期的正常運(yùn)營。預(yù)計(jì)2000元共計(jì): 120000+6000+5400+2250+450+600+300+1200+1200+480+400+550+1000+3000+450+2000=145280元
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度工業(yè)廠房交易全程服務(wù)合同4篇
- 2024音樂制作方與影視制作公司版權(quán)許可合同
- 二零二五年度交通樞紐害蟲防治與消毒作業(yè)合同3篇
- 專業(yè)水電安裝及消防系統(tǒng)承包合同2024年版版B版
- 2025年度12年首次智慧旅游項(xiàng)目合作協(xié)議3篇
- 2025年度叉車租賃合同范本(叉車租賃與維護(hù))4篇
- 2025年度智慧城市基礎(chǔ)設(shè)施場地平整與物聯(lián)網(wǎng)協(xié)議4篇
- 2025年度奶牛養(yǎng)殖牛場租賃合同范本3篇
- 2025年廠房租賃合同風(fēng)險(xiǎn)評估與管理規(guī)范4篇
- 2024年04月廣西桂林銀行南寧分行社會(huì)招考筆試歷年參考題庫附帶答案詳解
- 【高空拋物侵權(quán)責(zé)任規(guī)定存在的問題及優(yōu)化建議7100字(論文)】
- TDALN 033-2024 學(xué)生飲用奶安全規(guī)范入校管理標(biāo)準(zhǔn)
- 物流無人機(jī)垂直起降場選址與建設(shè)規(guī)范
- 冷庫存儲(chǔ)合同協(xié)議書范本
- AQ/T 4131-2023 煙花爆竹重大危險(xiǎn)源辨識(shí)(正式版)
- 武術(shù)體育運(yùn)動(dòng)文案范文
- 設(shè)計(jì)服務(wù)合同范本百度網(wǎng)盤
- 2024年市級專科護(hù)士理論考核試題及答案
- 肺炎臨床路徑
- 供應(yīng)商供貨服務(wù)方案(2篇)
- JB∕T 3077-2019 汽輪機(jī)圖形符號(hào)
評論
0/150
提交評論