为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

struts2文件上传

2018-04-28 8页 doc 23KB 9阅读

用户头像

is_212655

暂无简介

举报
struts2文件上传struts2文件上传 照尚学堂的OA视频用SSH2做毕业设计,做到文件上传时,发现Struts2的上传机制跟Struts1的截然不同。于是,又花了一个晚上的时间来琢磨,现在终于可以用SSH2实现文件上传了,总算有点成就感,于是想把步骤和思路在这里记下来。 总体步聚主要是以下几点: ,jsp文件表单元素中除了有一个action属性名,至少还要有 1 method和enctype属性,值分别为“post”和“multipart/form-data”,这一点很重要,否则文件无法上传。还有,from中应有一个子元素其type属...
struts2文件上传
struts2文件上传 照尚学堂的OA视频用SSH2做毕业设计,做到文件上传时,发现Struts2的上传机制跟Struts1的截然不同。于是,又花了一个晚上的时间来琢磨,现在终于可以用SSH2实现文件上传了,总算有点成就感,于是想把步骤和思路在这里记下来。 总体步聚主要是以下几点: ,jsp文件表单元素中除了有一个action属性名,至少还要有 1 method和enctype属性,值分别为“post”和“multipart/form-data”,这一点很重要,否则文件无法上传。还有,from中应有一个子元素其type属性为“file”,以便让用户选择一个文件上传(如果要同时上传多个文件,则可以多增加一些这样的元素,但务必让其name属性都保持一致。) 2,web.xml配置文件中除了要有Struts2的核心过虑器之外,还要有一个用来延长action中属性生命周期的过虑器:ActionContextCleanUp,倒底为什么要用这个过虑器我猜这也许跟下文action中的属性设值有关吧,但我还没不知道怎么验证,这个过虑器具体配置可以在下面的代码中找到。 3,shruts.xml配置文件中相应的action元素中应加入用来控制文件上传的fileUploadStack拦截器栈。 4,相应的action类中私有成员除了有接收表单中文件成员(java.io.File类型)外,还可以有用来接收文件名称,和名件类型的两个字符型,但最为关键的一点就是在生成其getter和setter方法切记要修改其表示名称和类型的两个set方法。(具体怎么改在下文的代码中有提到)这一点非常重要,我就是因为开始乎略了的set方法才调试了很久,现在想想,也许之所以要这样是因为,从表单过来的仅仅是一个,ile对象,而并没有单独把文件名称和类型传送过来,所以我们不得不通过那个,ile对象去获取其名称和类型这个两个属性,这就要求我们不能通过他本来的set方法获取吧,这只是我的猜想,不知道对不对。 5,写上述action类中的罗辑代码,再通过相应的配置把它交给spring容器就,,了。 我这里做的系统跟尚学堂的那个有点不相同,首先我用到了跟struts1截然不同的struts2,另外我通过dao模式把对数据库的操作从业务罗辑层中分离出来做为独立的一层。我的文件上传模块主要代码如下: 表单--> 选择文件:
文件资源描述:
struts-cleanup org.apache.struts2.dispatcher.ActionContextCleanUp struts-cleanup /* struts.xml文件中action的配置,注意配置其中的fileUploadStack拦截器 /UploadSuccess.jsp 另外应该注意的是我这里把struts与spring集成起来了,action中的class属性为spring容器中的一个bean。Spring中的配置如下: 注入dao层对象--> classpath:hibernate.cfg.xml 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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索