Posted on 2006-04-27 22:41
oxl 阅读(1268)
评论(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层的功能.
(后话:看来学习设计模式还是很有用处的)