




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程設(shè)計(jì)說明書課程名稱 設(shè)計(jì)模式課程設(shè)計(jì) 設(shè)計(jì)題目 設(shè)計(jì)模式在FileUpload組件中的應(yīng)用班號(hào) 專業(yè) 軟件工程 學(xué)生姓名 # 指導(dǎo)教師(簽字) 目 錄第1章 設(shè)計(jì)模式概述 1.1模式與設(shè)計(jì)模式 1.2設(shè)計(jì)模式的定義 1.3設(shè)計(jì)模式的基本要素 1.4設(shè)計(jì)模式的分類第2章 FileUpload組件簡(jiǎn)介2.1 FileUpload組件由來及使用2.2 FileUpload組件的工作原理2.3 FileUpload組件中的部分接口、類簡(jiǎn)介第3章 設(shè)計(jì)模式在FileUpload組件中的應(yīng)用3.1 工廠方法模式在FileUpload組件中的應(yīng)用3.2 策略模式在FileUpload組建中的應(yīng)用3.3
2、迭代器模式在FileUpload組建中的應(yīng)用3.4 FileUpload組件中的重要類圖第4章 結(jié)束語4.1 收獲與總結(jié)4.2 參考文獻(xiàn)第1章 設(shè)計(jì)模式概述1.1模式與設(shè)計(jì)模式模式起源于建筑業(yè)而非軟件業(yè),模式(Pattern)之父 美國(guó)加利佛尼亞大學(xué)環(huán)境結(jié)構(gòu)中心研究所所長(zhǎng)Christopher Alexander博士。Alexander給出了關(guān)于模式的經(jīng)典定義:每個(gè)模式都描述了我們環(huán)境中不斷出現(xiàn)的問題,然后描述了解決這個(gè)問題解決方案的核心,通過這種方式,我們可以無數(shù)次的重用那些已有的解決方案,無需再重復(fù)相同的工作,也可以用一句話概括為:模式是在特定環(huán)境中解決問題的一種方案。最早將Alexand
3、er博士的模式思想引入軟件工程方法學(xué)的是以四人組(Gang of Four,GoF)自稱的四位著名軟件工程學(xué)者,他們?cè)?949歸納發(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年Kent Beck和Ward Cunningham借鑒Alexander的模式思想在程序開發(fā)中開始應(yīng)用一些模式到目前設(shè)計(jì)模式在軟件開發(fā)的廣泛應(yīng)
4、用,Sun公司的Java SE/Java EE平臺(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ì)模式(Design Pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),使用設(shè)計(jì)模式是為了可重用代碼,讓代碼更容易被他人理解,保證代碼的可靠性。1.3設(shè)計(jì)模式的基本要素1.3.1模式名稱(Pattern name) 模式
5、名稱通過一兩個(gè)詞來描述模式的問題、解決方案和效果,以便更好地理解模式并方便開發(fā)人員之間的交流,絕大多數(shù)模式都是根據(jù)其功能或模式結(jié)構(gòu)來命名的。 1.3.2問題(Problem) 問題描述了應(yīng)該在何時(shí)使用模式,它包含了設(shè)計(jì)中存在的問題以及問題存在的原因。這些問題有些是一些特定的設(shè)計(jì)問題,如怎樣使用對(duì)象封裝狀態(tài)或者使用對(duì)象表示算法等,也可能是系統(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)用于各種不同的場(chǎng)合,解決方案并不描述一個(gè)特定而具
6、體的設(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)行合理的評(píng)價(jià)和選擇。1.4設(shè)計(jì)模式的分類 根據(jù)設(shè)計(jì)模式的目的(模式是用來做什么的)可分為創(chuàng)建型(creational)、結(jié)構(gòu)型(structural)和行為型(behavioral)三種。以下是GoF的23 中經(jīng)典模式的分類。第2章 FileUpload組件簡(jiǎn)介2.1.FileUpload組
7、件由來及使用FileUpload 是 Apache commons下面的一個(gè)子項(xiàng)目,用來實(shí)現(xiàn)Java環(huán)境下面的文件上傳功能,與常見的Smartypants齊名。需要注意的是FileUpload組件在使用時(shí)依賴于Commons IO組件,因此在繼續(xù)之前,要確保在你的工程classpath中有描述頁中提到的相應(yīng)版本,本次課程實(shí)際使用的FileUpload版本為:commons- fileupload-1.3.1,Commons IO版本為:commons-io-1.4。2.2.FileUpload組件的工作原理上傳的文件要求包括一個(gè)根據(jù)RFC 1867(在HTML中基于表單的文件)編碼的選項(xiàng)列表清
8、單。組件FileUpload可以解析這個(gè)請(qǐng)求,并給你的應(yīng)用程序提供一份獨(dú)立上傳的項(xiàng)目清單。無論每個(gè)項(xiàng)目背后如何執(zhí)行都實(shí)現(xiàn)了FileItem接口。這里將描述組件FileUpload庫的普通API,這些API比較簡(jiǎn)單。不過,對(duì)于最終的實(shí)現(xiàn),你可以參考最新的API流。每一個(gè)文件項(xiàng)目都有一些屬性,這些可能在你的應(yīng)用程序中應(yīng)用到。比如:每一個(gè)項(xiàng)目有一個(gè)名稱name和內(nèi)容類型content type,并提供了一個(gè) InputStream訪問其數(shù)據(jù)。另一方面,你處理項(xiàng)目的方法可能有所不同,這個(gè)依賴于是否這個(gè)項(xiàng)目是一個(gè)規(guī)則的表單域,即:這個(gè)數(shù)據(jù)是來自普通的表單文本,還是普通的HTML域或是一個(gè)上傳文件。在Fi
9、leItem接口中提供了處理這些問題的方法,可以更加方便的去訪問這些數(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ù)淖远ㄖ啤?.3 FileUpload組件中部分接口、類簡(jiǎn)介2.3.1 FileItem接口 mons.fileupload.disk.DiskFileItem實(shí)現(xiàn)了FileItem接口,用來封裝單個(gè)表單字段元素的數(shù)
10、據(jù)。通過調(diào)用FileItem 定義的方法可以獲得相關(guān)表單字段元素的數(shù)據(jù)。2.3.2 FileUpload類 FileUpload類的繼承結(jié)構(gòu):java.lang.Objectmons.fileupload.FileUploadBase mons.fileupload.FileUpload2.3.3 DiskFileItemFactory 此類將請(qǐng)求消息實(shí)體中的每一個(gè)項(xiàng)目封裝成單獨(dú)的DiskFileItem (FileItem接口的實(shí)現(xiàn)) 對(duì)象的任務(wù)由 mons.fileupload.FileItemFactory 接口的默認(rèn)實(shí)現(xiàn) mons.fileupload.disk.DiskFileIte
11、mFactory 來完成。當(dāng)上傳的文件項(xiàng)目比較小時(shí),直接保存在內(nèi)存中(速度比較快),比較大時(shí),以臨時(shí)文件的形式,保存在磁盤臨時(shí)文件夾(雖然速度慢些,但是內(nèi)存資源是 有限的)。2.3.4 ServletFileUpload類 mons.fileupload.servlet.ServletFileUpload類是Apache文件上傳 組件處理文件上傳的核心高級(jí)類(所謂高級(jí)就是不需要管底層實(shí)現(xiàn),暴露給用戶的簡(jiǎn)單易用的接口)。使用其 parseRequest(HttpServletRequest) 方法可以將通過表單中每一個(gè)HTML標(biāo)簽提交的數(shù)據(jù)封裝成一個(gè)FileItem對(duì)象,然后以List列表的形式
12、返回。第三章 設(shè)計(jì)模式在FileUpload組件中的應(yīng)用3.1工廠方法模式在FileUpload組件中的應(yīng)用 3.1.1 工廠方法模式定義工廠方法模式(Factory Method Pattern)定義:工廠方法模式又稱為工廠模式,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類。 3.1.2 工廠方法模式
13、結(jié)構(gòu) 1. Product(抽象產(chǎn)品)抽象產(chǎn)品是定義產(chǎn)品的接口,是工廠方法模式所創(chuàng)建對(duì)象的超類型,也就是產(chǎn)品對(duì)象的共同父類或接口。 2.ConcreteProduct(具體產(chǎn)品)具體產(chǎn)品實(shí)現(xiàn)了抽象產(chǎn)品接口,某種類型的具體產(chǎn)一一對(duì)應(yīng)。 3.Factory(抽象工廠)在抽象工廠類中,聲明了工廠方法(Factory Method)廠方法模式的核心,它與應(yīng)用程序無關(guān)。任何在模式中創(chuàng)建對(duì)象的工廠類都必須實(shí)現(xiàn)該接口。4.ConcreteFactory(具體工廠)具體工廠是抽象工廠類的子類,實(shí)現(xiàn)了抽象工廠中返回一個(gè)具體產(chǎn)品類的實(shí)例。在具體工廠類中包含與應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。 3.1.3 模式分析工廠方
14、法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。工廠方法模式保持了簡(jiǎ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)品類往往具有平行的等級(jí)結(jié)構(gòu),它們之間一一對(duì)應(yīng)。通過分析,該組件中應(yīng)用了工廠方法模式的類如下:FileItemFactory類(抽象工廠):是工廠方法的核心,它與應(yīng)用程序無關(guān)。包含了抽象的工廠方法:FileItem createItem( String fieldName, String contentType, boolean isFormField, Str
15、ing fileName );返回一個(gè)抽象產(chǎn)品FileItem對(duì)象。DiskFileItemFactory類(具體工廠):實(shí)現(xiàn)了抽象工廠方法FileItem createItem(),在工廠方法中創(chuàng)建并返回一個(gè)對(duì)象的具體產(chǎn)品。public FileItem createItem(String fieldName, String contentType, boolean isFormField, String fileName) DiskFileItem result = new DiskFileItem(fieldName, contentType, isFormField, fileName
16、, sizeThreshold, repository); FileCleaningTracker tracker = getFileCleaningTracker(); if (tracker != null) tracker.track(result.getTempFile(), result); return result;FileItem類(抽象產(chǎn)品),是一個(gè)接口,其中包含了產(chǎn)品類所具有的所有的業(yè)務(wù)方法。InputStream getInputStream() throws IOException;String getContentType();String getName();boo
17、lean isInMemory();long getSize();byte get();String getString(String encoding) throws UnsupportedEncodingException;String getString();void write(File file) throws Exception;void delete();String getFieldName();void setFieldName(String name);boolean isFormField();void setFormField(boolean state);Output
18、Stream getOutputStream() throws IOException;DiskFileItem類(具體產(chǎn)品類):是抽象產(chǎn)品FileItem接口的子類,實(shí)現(xiàn)了FileItem接口中所有的業(yè)務(wù)方法,以下就其中的部分方法的實(shí)現(xiàn)做介紹: public InputStream getInputStream() throws IOException if (!isInMemory() return new FileInputStream(dfos.getFile(); if (cachedContent = null) cachedContent = dfos.getData(); re
19、turn new ByteArrayInputStream(cachedContent);3.2 策略模式在FileUpload組建中的應(yīng)用3.2.1 策略模式定義策略模式(Strategy Pattern)定義:定義一系列算法,將每一個(gè)算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化,也稱為政策模式(Policy)策略模式是一種對(duì)象行為型模式。3.2.2 策略模式結(jié)構(gòu)圖 Context(環(huán)境類) 環(huán)境類是使用算法的角色,它在解決某個(gè)問題時(shí)可以采用多種策略。在環(huán)境類中維護(hù)一個(gè)對(duì)抽象策略類的引用實(shí)例,用于定義所采用的策略。 Strategy(
20、抽象策略類)抽象策略類為所支持的算法申明了抽象方法,是所有策略類的父類,他可以是抽象類也可以是接口。環(huán)境類使用在其中聲明的方法調(diào)用在具體策略類中實(shí)現(xiàn)的算法。 concretStrategy(具體策略類)具體策略類實(shí)現(xiàn)了在抽象策略中定義的算法,在運(yùn)行時(shí),具體策略類將覆蓋在環(huán)境淚中定義的抽象策略類對(duì)象,使用一種具體的算法實(shí)現(xiàn)某個(gè)業(yè)務(wù)處理。3.2.3 策略模式分析策略模式是對(duì)算法的封裝,它把算法的責(zé)任和算法本身分割開,委派給不同的對(duì)象管理。策略模式通常把一個(gè)系列的算法封裝到一系列的策略類里面,作為一個(gè)抽象策略類的子類。用一句話來說,就是“準(zhǔn)備一組算法,并將每一個(gè)算法封裝起來,使得它們可
21、以互換”。3.2.4策略模式在FileUpload組件中的分析類圖如下:FileUpload類 (環(huán)境類) public class FileUpload extends FileUploadBase private FileItemFactory fileItemFactory; public FileUpload() super(); public FileUpload(FileItemFactory fileItemFactory) super(); this.fileItemFactory = fileItemFactory; public FileItemFactory getFil
22、eItemFactory() return fileItemFactory; public void setFileItemFactory(FileItemFactory factory) this.fileItemFactory = factory; FileUpload類是環(huán)境類,他定義并維持了對(duì)抽象策略類的一個(gè)引用,通過其方法private FileItemFactory fileItemFactory;可以在運(yùn)行時(shí)設(shè)置一種具體策略,并在其算法下調(diào)用策略類提供的算法完成相應(yīng)的業(yè)務(wù)處理。FileItemFactory類(抽象策略類)public interface FileItemFact
23、ory FileItem createItem( String fieldName, String contentType, boolean isFormField, String fileName );FileItemFactory作為抽象策略類,它定義了算法的抽象定義,而在其子類DiskFileItemFactory類中實(shí)現(xiàn)了具體算法。DiskFileItemFactory類(具體策略類)public class DiskFileItemFactory implements FileItemFactory public static final int DEFAULT_SIZE_THRES
24、HOLD = 10240; private File repository; private int sizeThreshold = DEFAULT_SIZE_THRESHOLD; private FileCleaningTracker fileCleaningTracker; public DiskFileItemFactory() this(DEFAULT_SIZE_THRESHOLD, null); public DiskFileItemFactory(int sizeThreshold, File repository) this.sizeThreshold = sizeThresho
25、ld; this.repository = repository; public File getRepository() return repository; public void setRepository(File repository) this.repository = repository; public int getSizeThreshold() return sizeThreshold; public void setSizeThreshold(int sizeThreshold) this.sizeThreshold = sizeThreshold; public Fil
26、eItem createItem(String fieldName, String contentType, boolean isFormField, String fileName) DiskFileItem result = new DiskFileItem(fieldName, contentType, isFormField, fileName, sizeThreshold, repository); FileCleaningTracker tracker = getFileCleaningTracker(); if (tracker != null) tracker.track(re
27、sult.getTempFile(), result); return result; public FileCleaningTracker getFileCleaningTracker() return fileCleaningTracker; public void setFileCleaningTracker(FileCleaningTracker pTracker) fileCleaningTracker = pTracker; DiskFileItemFactory類作為FileItemFactory類的子類,是一種具體策略類,實(shí)現(xiàn)了抽象策略類中的方法。3.3 迭代器模式在FileU
28、pload組建中的應(yīng)用3.3.1 迭代器模式定義迭代器模式(Iterator pattern)定義:提供一種方法來訪問聚合對(duì)象,而不用暴露這個(gè)對(duì)象的內(nèi)部表示,其別名為游標(biāo)(Cursor)。迭代器模式是一種對(duì)象行為型模式。3.3.2 迭代器模式結(jié)構(gòu)迭代器模式包含如下角色:1. Iterator(抽象迭代器)抽象迭代器定義了訪問和遍歷元素的接口,一般聲明如下方法:用于獲取第一個(gè)元素的first(),用于訪問下一個(gè)元素的next(),用于判斷是否還有下一個(gè)元素的 hasNext( ),用于獲取當(dāng)前元素的。urrentltemO,在其子類中將實(shí)現(xiàn)這些方法。2. Concretelterator(具體迭
29、代器)具體迭代器實(shí)現(xiàn)了抽象迭代器接口,完成對(duì)聚合對(duì)象的遍歷,同時(shí)在對(duì)聚合進(jìn)行遍歷時(shí)跟蹤其當(dāng)前位置。3. Aggregate(抽象聚合類)抽象聚合類用于存儲(chǔ)對(duì)象,并定義創(chuàng)建相應(yīng)迭代器對(duì)象的接口,聲明一個(gè)createIterator()方法用于創(chuàng)建一個(gè)迭代器對(duì)象。4.ConcreteAggregate(具體聚合類)具體聚合類實(shí)現(xiàn)了創(chuàng)建相應(yīng)迭代器的接口,實(shí)現(xiàn)了在聚合類中聲明的createlterator( )方法,該方法返回一個(gè)與該具體聚合對(duì)應(yīng)的具體迭代器Concretelterator實(shí)例。3.3.3 迭代器模式分析根據(jù)“單一職責(zé)原則”,在面向?qū)ο笤O(shè)計(jì)時(shí),對(duì)象承擔(dān)的職責(zé)越少,則該對(duì)象的穩(wěn)定性就很好
30、,受到的約束也就越少,復(fù)用也就越方便。職責(zé)分離可以最大限度地減少彼此之間的耦合程度,從而建立一個(gè)松散藕合的對(duì)象網(wǎng)絡(luò),職責(zé)分離的要點(diǎn)是對(duì)被分離的職責(zé)進(jìn)行封裝,以抽象的方式建立起彼此之間的關(guān)系。以聚合對(duì)象為例,聚合是一個(gè)管理和組織數(shù)據(jù)對(duì)象的數(shù)據(jù)結(jié)構(gòu)。這就表明聚合首先應(yīng)備一個(gè)基本功能,即存儲(chǔ)數(shù)據(jù),這其中包含存儲(chǔ)數(shù)據(jù)的類型、存儲(chǔ)空間的大小、存儲(chǔ)空間的配,以及存儲(chǔ)的方式和順序。如果不具備這些特點(diǎn),則該對(duì)象就不能稱為聚合對(duì)象。也就,存儲(chǔ)數(shù)據(jù)是聚合對(duì)象最基本的職責(zé)。然而,聚合對(duì)象除了能夠存儲(chǔ)數(shù)據(jù)外,還必須提前遍歷訪問其內(nèi)部數(shù)據(jù)的方式,同時(shí)這些遍歷方式可能會(huì)根據(jù)不同的情形提供不同的實(shí)現(xiàn)正向遍歷或逆向遍歷等。因
31、此,聚合對(duì)象主要擁有兩個(gè)職責(zé):一是存儲(chǔ)內(nèi)部數(shù)據(jù);二是遍歷內(nèi)部數(shù)據(jù)。但是前者是聚合對(duì)象的基木功能,而后者是可以分離的。因此,我們將遍歷聚合對(duì)象中數(shù)據(jù)的行為提取出來,封裝到一個(gè)迭代器中,通過專門的迭代器來遍歷聚合對(duì)象內(nèi)部數(shù)據(jù),這就是迭代器模式的本質(zhì)。迭代器模式是“單一職責(zé)原則”的完美體現(xiàn)。經(jīng)分析可知,迭代器模式在FileUpload組件中的應(yīng)用情況如下:FileItemIterator(抽象迭代器):public interface FileItemIterator boolean hasNext() throws FileUploadException, IOException; FileIte
32、mStream next() throws FileUploadException, IOException;Next方法用于訪問下一個(gè)元素,hasNext方法用于判斷是否還有下一個(gè)元素。FileItemIteratorImpl(具體迭代器):private class FileItemIteratorImpl implements FileItemIterator FileItemIteratorImpl(RequestContext ctx) throws FileUploadException, IOException if (ctx = null) throw new NullPoin
33、terException("ctx parameter"); String contentType = ctx.getContentType(); if (null = contentType) | (!contentType.toLowerCase(Locale.ENGLISH).startsWith(MULTIPART) throw new FileUploadBase.InvalidContentTypeException( format("the request doesn't contain a %s or %s stream, content
34、type header is %s", contentType); .(此處省略若干行) public boolean hasNext() throws FileUploadException, IOException if (eof) return false; if (itemValid) return true; try return findNextItem(); catch (FileUploadIOException e) / unwrap encapsulated SizeException throw (FileUploadException) e.getCause(
35、); public FileItemStream next() throws FileUploadException, IOException if (eof | (!itemValid && !hasNext() throw new NoSuchElementException(); itemValid = false; return currentItem; 抽象聚合類(FileItemStream)public interface FileItemStream extends FileItemHeadersSupport public static class ItemS
36、kippedException extends IOException private static final long serialVersionUID = -7280778431581963740L; InputStream openStream() throws IOException; String getContentType(); String getName(); String getFieldName(); boolean isFormField();具體聚合類(FileItemStreamImpl)public class FileItemStreamImpl implem
37、ents FileItemStream private final String contentType; private final String fieldName; private final String name; private final boolean formField; private final InputStream stream; private boolean opened; private FileItemHeaders headers; FileItemStreamImpl(String pName, String pFieldName, String pCon
38、tentType, boolean pFormField, long pContentLength) throws IOException name = pName; fieldName = pFieldName; contentType = pContentType; formField = pFormField; .(省略若干行)public String getContentType() return contentType; public String getFieldName() return fieldName; public String getName() return Str
39、eams.checkFileName(name); public boolean isFormField() return formField; public InputStream openStream() throws IOException if (opened) throw new IllegalStateException( "The stream was already opened."); if (Closeable) stream).isClosed() throw new FileItemStream.ItemSkippedException(); ret
40、urn stream; void close() throws IOException stream.close(); public FileItemHeaders getHeaders() return headers; public void setHeaders(FileItemHeaders pHeaders) headers = pHeaders; 3.4 FileUpload組件中的重要類圖3.4.1所有類匯總圖:3.4.2重要類之間的類圖:FileItem類 FileItem類用來封裝單個(gè)表單字段元素的數(shù)據(jù),一個(gè)表單字段元素對(duì)應(yīng)一個(gè)FileItem對(duì)象,通過調(diào)用FileItem對(duì)
41、象的方法可以獲得相關(guān)表單字 段元素的數(shù)據(jù)。FileItem是一個(gè)接口,在應(yīng)用程序中使用的實(shí)際上是該接口一個(gè)實(shí)現(xiàn)類,該實(shí)現(xiàn)類的名稱并不重要,程序可以采用FileItem接口類型來對(duì)它進(jìn)行引用和訪問,為了便于講解,這里將FileItem實(shí)現(xiàn)類稱之為FileItem類。FileItem類還實(shí)現(xiàn)了Serializable接口,以支持序列化操作。其中的重要方法為:isFormField方法用于判斷FileItem類對(duì)象封裝的數(shù)據(jù)是否屬于一個(gè)普通表單字段,還是屬于一個(gè)文件表單字段,如果是普通表單字段則返回true,否則返回false。該方法的完整語法定義如下: public boolean isFormF
42、ield() ;getName方法用于獲得文件上傳字段中的文件名。getName方法的完整語法定義如下: public String getName() ;write方法用于將FileItem對(duì)象中保存的主體內(nèi)容保存到某個(gè)指定的文件中。其完整語法定義如下: public void write(File file) ;getString方法用于將FileItem對(duì)象中保存的主體內(nèi)容作為一個(gè)字符串返回,它有兩個(gè)重載的定義形式: public java.lang.String getString() public java.lang.String getString(java.lang.String
43、 encoding) throws java.io.UnsupportedEncodingException ;getContentType 方法用于獲得上傳文件的類型,getContentType 方法的完整語法定義如下: public String getContentType() ;isInMemory方法用來判斷FileItem類對(duì)象封裝的主體內(nèi)容是存儲(chǔ)在內(nèi)存中,還是存儲(chǔ)在臨時(shí)文件中,如果存儲(chǔ)在內(nèi)存中則返回true,否則返回 false。其完整語法定義如下: public boolean isInMemory() ;FileUploadExcept
44、ion類在文件上傳過程中,可能發(fā)生各種各樣的異常,例如網(wǎng)絡(luò)中斷、數(shù)據(jù)丟失等等。為了對(duì)不同異常進(jìn)行合適的處理,Apache文件上傳組件還開發(fā)了四個(gè)異常類,其中FileUploadException是其他異常類的父類,其他幾個(gè)類只是被間接調(diào)用的底層類,對(duì)于Apache組件調(diào)用人員來說,只需對(duì)FileUploadException異常類進(jìn)行捕獲和處理即可。MultipartStream類用來對(duì)上傳的請(qǐng)求輸入流進(jìn)行解析,它是整個(gè)Apache上傳組件中最復(fù)雜的類。DiskFileUpload類是文件上傳組件的核心類,它是一個(gè)總的控制類,首先由Apache文件上傳組件的使用者直接調(diào)用DiskFileUpload類的方法,DiskFileUpload類再調(diào)用和協(xié)調(diào)更底層的類來完成具體的功能。解析類MultipartStream和工廠類DefaultFileItemFactory就是DiskFileUpload 類調(diào)用的兩個(gè)的底層類。MultipartStream類用于對(duì)請(qǐng)求消息中的實(shí)體數(shù)據(jù)進(jìn)行具體解析,DefaultFileItemFactory類對(duì)MultipartStream類解析出來的數(shù)據(jù)進(jìn)行封裝,它將每個(gè)表單字段數(shù)據(jù)封裝成一個(gè)個(gè)的F
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位員工招聘合同范本
- 獸醫(yī)聘用勞務(wù)合同范本
- 光催化課題申報(bào)書
- 會(huì)所物資出售合同范本
- 廚具采買合同范本寫
- 吊裝合同范例簡(jiǎn)易版本
- 醫(yī)院雇傭合同范本
- 企業(yè)各類合同范本
- 吊車及場(chǎng)地合作合同范本
- 合同范例結(jié)構(gòu)特征有
- 年產(chǎn)2萬噸馬來酸二乙酯技改建設(shè)項(xiàng)目環(huán)評(píng)報(bào)告書
- 中國(guó)古代文論教程完整版課件
- 中班美工區(qū)角活動(dòng)教案10篇
- SJG 103-2021 無障礙設(shè)計(jì)標(biāo)準(zhǔn)-高清現(xiàn)行
- 皇冠假日酒店智能化系統(tǒng)安裝工程施工合同范本
- 路面工程重點(diǎn)、關(guān)鍵、和難點(diǎn)工程的施工方案(技術(shù)標(biāo))
- 合肥市城市大腦·數(shù)字底座白皮書2020
- 機(jī)電預(yù)留預(yù)埋工程施工組織設(shè)計(jì)方案
- 2022年三八婦女節(jié)婦女權(quán)益保障法律知識(shí)競(jìng)賽題庫及答案(共290題)
- 引水罐的設(shè)計(jì)計(jì)算
- Of studies原文譯文及賞析
評(píng)論
0/150
提交評(píng)論