關(guān)于文件上傳的問題,利用適配器模式統(tǒng)一調(diào)用接口.
Posted on 2006-04-27 22:41 oxl 閱讀(1285) 評論(0) 編輯 收藏 所屬分類: Java Web技術(shù)
關(guān)于文件上傳的問題:
Java Servlet沒有從根本上支持網(wǎng)絡(luò)文件上傳,這是一個(gè)極不好的也極不爽的事情.
從而就延生了commonsUpload和cos這些東東類庫,呵.....還算好,也好用,不過沒仔細(xì)去研究他們的實(shí)現(xiàn)代碼,用起來總是心大心小的.
也正因?yàn)檫@樣多的第三方類庫,大家的接口都不同,從而也就出現(xiàn)了讓Service層無所適從的感覺.因?yàn)椴徽撌菑腟truts還是從WebWork或者從最簡單的cos這些類庫得到的接口都是一種具體實(shí)現(xiàn),沒有統(tǒng)一的接口,如果Service層與某一種具體實(shí)現(xiàn)相關(guān)聯(lián),則必然與這種具體實(shí)現(xiàn)的框架或者類庫硬編碼綁定,以后就不好用其它類庫了,這是不好的設(shè)計(jì),真的,一點(diǎn)靈活度都沒有.
能不能這樣呢?在Service定義一個(gè)UploadFile接口,所有Service層接受的只是UploadFile的實(shí)現(xiàn)類的實(shí)例,從而統(tǒng)一了所有Service的調(diào)用,而且也使Service可以在各種MVC或者第三方類庫中遷移.
這里用到了一個(gè)設(shè)計(jì)模式:適配器模式.
代碼如下:
import java.io.InputStream;
import java.io.File;
public interface UploadFile?{
???? public byte []?getBytes();
???? public String?getContentType();
???? public InputStream?getInputStream();
???? public String?getName();
???? public String?getOriginalFilename();
???? public?long getSize();
???? public?boolean isEmpty();
???? public?void transferTo(File?dest);
}
比如這里有一個(gè)具體實(shí)現(xiàn):
import ?java.io.InputStream;
import ?java.io.File;
import ?org.springframework.web.multipart.MultipartFile;
import ?org.springstudy.ch03.UploadFile;
public?classUploadFileSpringImpl?implements ?UploadFile?{
???? private MultipartFile?multipartFile;
????
???? public UploadFileSpringImpl(MultipartFile?multipartFile)?{
???????? this .multipartFile = ?multipartFile;
????}
????
???? public?byte []?getBytes()?{
???????? return?this .multipartFile.getBytes();
????}
????
???? public String?getContentType()?{
???????? return?this .multipartFile.getContentType();
????}
????
???? public InputStream?getInputStream()?{
???????? return?this .multipartFile.getInputStream();
????}
????
???? public String?getName()?{
???????? return?this .multipartFile.getName();
????}
????
???? public String?getOriginalFilename()?{
???????? return?this .multipartFile.getOriginalFilename();
????}
????
???? public?long getSize()?{
???????? return?this .multipartFile.getSize();
????}
????
???? public?boolean isEmpty()?{
???????? return?this .multipartFile.isEmpty();
????}
????
???? public?void transferTo(File?dest)?{
???????? this .multipartFile.transferTo(dest);
????}
}
你也可以寫commonsupload或者cos的實(shí)現(xiàn),Service接受的參數(shù)是UploadFile接口的,所以你必須實(shí)現(xiàn)UploadFile接口才能使用Service層的功能.
(后話:看來學(xué)習(xí)設(shè)計(jì)模式還是很有用處的)