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

struts2文件上传

2018-04-28 7页 doc 23KB 7阅读

用户头像

is_562397

暂无简介

举报
struts2文件上传struts2文件上传 照尚学堂的OA视频用SSH2做毕业设计,做到文件上传时,发现Struts2的上传机制跟Struts1的截然不同。于是,又花了一个晚上的时间来琢磨,现在终于可以用SSH2实现文件上传了,总算有点成就感,于是想把步骤和思路在这里记下来。 总体步聚主要是以下几点: 1jsp文件表单元素 中除了有一个action属性名,至少还要有method和enctype属性,值分别为“post”和“multipart/form-data”,这一点很重要,否则文件无法上传。还有,from中应有一个子元素 其type属性...
struts2文件上传
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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索