struts2文件上传struts2文件上传
照尚学堂的OA视频用SSH2做毕业设计,做到文件上传时,发现Struts2的上传机制跟Struts1的截然不同。于是,又花了一个晚上的时间来琢磨,现在终于可以用SSH2实现文件上传了,总算有点成就感,于是想把步骤和思路在这里记下来。
总体步聚主要是以下几点:
1jsp文件表单元素 中除了有一个action属性名,至少还要有method和enctype属性,值分别为“post”和“multipart/form-data”,这一点很重要,否则文件无法上传。还有,from中应有一个子元素 其type属性...
struts2文件上传
照尚学堂的OA视频用SSH2做毕业设计,做到文件上传时,发现Struts2的上传机制跟Struts1的截然不同。于是,又花了一个晚上的时间来琢磨,现在终于可以用SSH2实现文件上传了,总算有点成就感,于是想把步骤和思路在这里记下来。
总体步聚主要是以下几点:
1jsp文件表单元素 中除了有一个action属性名,至少还要有method和enctype属性,值分别为“post”和“multipart/form-data”,这一点很重要,否则文件无法上传。还有,from中应有一个子元素 其type属性为“file”,以便让用户选择一个文件上传(如果要同时上传多个文件,则可以多增加一些这样的元素,但务必让其name属性都保持一致。)
2web.xml配置文件中除了要有Struts2的核心过虑器之外,还要有一个用来延长action中属性生命周期的过虑器:ActionContextCleanUp,倒底为什么要用这个过虑器我猜这也许跟下文action中的属性设值有关吧,但我还没不知道怎么验证,这个过虑器具体配置可以在下面的代码中找到。
3shruts.xml配置文件中相应的action元素中应加入用来控制文件上传的fileUploadStack拦截器栈。
4action类中私有成员除了有接收表单中文件成员(类型)外,还可以有用来接收文件名称,和名件类型的两个字符型,但最为关键的一点就是在生成其getter和setter方法切记要修改其表示名称和类型的两个set方法。(具体怎么改在下文的代码中有提到)这一点非常重要,我就是因为开始乎略了的set方法才调试了很久,现在想想,也许之所以要这样是因为,从表单过来的仅仅是一个,ile对象,而并没有单独把文件名称和类型传送过来,所以我们不得
不通过那个,ile对象去获取其名称和类型这个两个属性,这就要求我们不能通过他本来的set方法获取吧,这只是我的猜想,不知道对不对。
5action类中的罗辑代码,再通过相应的配置把它交给spring容器就,,了。
我这里做的系统跟尚学堂的那个有点不相同,首先我用到了跟struts1截然不同的struts2,另外我通过dao模式把对数据库的操作从业务罗辑层中分离出来做为独立的一层。我的文件上传模块主要代码如下:
!―jsp上传文件添加 表单--
s:form method "post" name "uploadForm" action "upJbpm"
enctype "multipart/form-data"
选择文件: input type "file" name "uploadFile" /
文件资源描述: input type "text" name "caption" size
"35" /
s:submit value "上传" / s:reset value "重置" /
/s:form
!―注意这里用到了sturs的核心标签库,应在文件的最上面声名--
!-- web.xml文件增加ActionContextCleanUp过滤器 --
filter-name struts-cleanup /filter-name
filter-class
onContextCleanUp
/filter-class
filter-mapping
ilter-name struts-cleanup /filter-name
url-pattern /* /url-pattern
/filter-mapping
!―struts.xml文件中action的配置,注意配置其中的fileUploadStack
拦截器栈 --
action name "upJbpm" class "upJbpmAction"
interceptor-ref name "fileUploadStack"/
result name "success" /UploadSuccess.jsp
另外应该注意的是我这里把struts与spring集成起来了,action中的
class属性为spring容器中的一个bean。Spring中的配置如下:
!-- applicateionContext.xml文件中bean的配置 --
bean id "upJbpmAction" class "on.UpJbpmAction" scope "prototype"
!―注入业务罗辑层对象--
property name "upJbpmManager" ref "upJbpmManager"
bean id "upJbpmManager" class "pmManagerImpl"
!―注入dao层对象--
property name "upJbpmDao" ref "upJbpmDao"
bean id "upJbpmDao" class ".impl.UpJbpmDaoImpl" scope "prototype"
!―注入sessionFactory --
property name "sessionFactory" ref "sessionFactory"
!―配置sessionFactory --
bean id "sessionFactory" class
"org.springframernate3.LocalSessionFactoryBean"
property name "configLocation"
classpath:hiber
!-- upJbpmAction 类的核心代码--
public class UpJbpmAction extends ActionSupport
//待上传文件
private File uploadFile;
//文件类型
private String contentType; //文件名称
private String uploadFilename; //文件描述
private String caption;
public String getCaption
return caption;
public void setCaption String caption
this.caption caption;
public String getContentType
return contentType;
//设置文件类型,注意这里的命名
,切记
public void setUploadFileContentType String contentType
this.contentType contentType;
public File getUploadFile
return uploadFile;
public void setUploadFile File uploadFile
this.uploadFile uploadFile;
public String getUploadFilename
return uploadFilename;
//设置文件名称,注意这里的命名规范,切记
public void setUploadFileFileName String uploadFilename
this.uploadFilename uploadFilename;
//成员函数,用于把待上传的文件复制到服务器
private static void copy File src, File dst
try
//定义文件流
InputStream in null;
OutputStream out null;
try
in new BufferedInputStream new FileInputStream src ;
out new BufferedOutputStream new FileOutputStream dst ;
byte[] buffer new byte[16 * 1024];
//循环按字节读取并复制
while in.read buffer 0
out.write buffer ;
finally
if null ! in
in.close ;
if null ! out
out.close ;
catch Exception e
e.printStackTrace ;
// execute函数,执行时文件被复制到服务器根目录的file文件夹下,同
时文件信息被持久化
public String execute
//定义文件实体类,用于被hibernate执久化
UpJbpm upJbpm new UpJbpm ;
File imageFile new File
ServletActionContext.getServletContext
.getRealPath "/"
+ "file/" +uploadFilename ;
//复制文件
copy uploadFile, imageFile ;
upJbpm.setCaption caption ;
upJbpm.setContentType contentType ;
upJbpm.setUploadFilename uploadFilename ;
//持久化upJbpm对象
upJbpmManager.addFile upJbpm ;
//上传成功,返回
return SUCCESS;
以上是最主要的配置和代码,致于文件信息如何被持久化到数据库中的这里就不贴代码了。另外值得一提的就是我本来想把这个action中的那些关于文件信息的属性都封装到一个VO(值对象)中,但是发现如果被封到值对象以后,关于文件的名称和文件类型这两个属性就无法取到了。我也不知道为什么,我这里的做法是让该action现实一个叫ModelDriven的接口,然后现实该接口的getModel方法,代码像下面那样:
public Object getModel
?return upJbpmVo;
但是我发现一个问题就是这样做了之后upJbmvo对象并没有得到正确的实例,依旧为Null,我也不知道为什么,不知道这是struts2上传文件的action本身不允许这样做还是哪里配置有误。总觉得这样再分离出一个vo比较适合面向象的编程。
本文档为【struts2文件上传】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。