Posted on 2006-04-27 22:41
oxl 閱讀(1276)
評論(0) 編輯 收藏 所屬分類:
Java Web技術
關于文件上傳的問題:
Java Servlet沒有從根本上支持網絡文件上傳,這是一個極不好的也極不爽的事情.
從而就延生了commonsUpload和cos這些東東類庫,呵.....還算好,也好用,不過沒仔細去研究他們的實現代碼,用起來總是心大心小的.
也正因為這樣多的第三方類庫,大家的接口都不同,從而也就出現了讓Service層無所適從的感覺.因為不論是從Struts還是從WebWork或者從最簡單的cos這些類庫得到的接口都是一種具體實現,沒有統一的接口,如果Service層與某一種具體實現相關聯,則必然與這種具體實現的框架或者類庫硬編碼綁定,以后就不好用其它類庫了,這是不好的設計,真的,一點靈活度都沒有.
能不能這樣呢?在Service定義一個UploadFile接口,所有Service層接受的只是UploadFile的實現類的實例,從而統一了所有Service的調用,而且也使Service可以在各種MVC或者第三方類庫中遷移.
這里用到了一個設計模式:適配器模式.
代碼如下:
package
org.springstudy.ch03;
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);
}
比如這里有一個具體實現:
package
?org.springstudy.ch03.uploadimpl;
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的實現,Service接受的參數是UploadFile接口的,所以你必須實現UploadFile接口才能使用Service層的功能.
(后話:看來學習設計模式還是很有用處的)