Javadream

A long way and a dream.

关于文件上传的问题:
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层的功能.

(后话:看来学习设计模式还是很有用处的)


只有注册用户登录后才能发表评论。


网站导航: