Struts2讲义十(转载)
Struts2讲义10(转载)Struts2文件上传功能开发 技术要点 本节代码详细说明文件上传功能的开发流程,介绍知识
Struts2讲义10(转载)
Struts2文件上传功能开发
技术要点
本节代码详细说明文件上传功能的开发流程,介绍知识点如下:
? 文件上传页面和显示上传成功页面代码内容。
? UploadAction类中实现上传功能方法和上传文件属性介绍。
? struts.xml中UploadAction配置,以及字符编码、文件临时存放路径配置。
? 上传后所处路径和最终上传成功后效果展示。
演示代码
上传文件页面,这里笔者定义的是多个文件上传。
<!---------------------文件名:upload.jsp-----------------><%@taglib prefix="s" uri="/struts-tags"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>上传文件</title></head><body><!-- 上传文件表单定义 --><s:form action="upload" method="post" enctype="multipart/form-data"><tr><!-- 上传文件标签定义 --><td>上传文件:<s:file name="file"></s:file></td></tr><tr><td>再次上传文件:<s:file name="file"></s:file></td></tr><tr><td align="left"><s:submit name="submit" value="提交"></s:submit></td></tr></s:form></body></html>
上传文件成功后结果页面
<!-------------------文件名:result.jsp -----------------><%@taglib prefix="s" uri="/struts-tags"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>上传结果</title></head><body>上传文件:<!-- 显示上传成功文件名 --><s:property value="fileFileName" /></body></html>
UploadAction类代码
<!------------------文件名:UploadAction.java ------------------>import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.List;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;//文件上传Actionpublic class UploadAction extends ActionSupport {//上传文件存放路径private final static String UPLOADDIR = "/upload";//上传文件集合private List<File> file;//上传文件名集合private List<String> fileFileName;//上传文件内容类型集合private List<String> fileContentType;public List<File> getFile() {return file;}public void setFile(List<File> file) {this.file = file;}public List<String> getFileFileName() {return fileFileName;}public void setFileFileName(List<String> fileFileName) {this.fileFileName = fileFileName;}public List<String> getFileContentType() {return fileContentType;}public void setFileContentType(List<String> fileContentType) {this.fileContentType = fileContentType;}public String execute() throws Exception {for (int i = 0; i < file.size(); i++) {//循环上传每个文件uploadFile(i);}return "success";}//执行上传功能private void uploadFile(int i) throws FileNotFoundException, IOException {try {InputStream in = new FileInputStream(file.get(i));String dir = ServletActionContext.getRequest().getRealPath(UPLOADDIR);File uploadFile = new File(dir, this.getFileFileName().get(i));OutputStream out = new FileOutputStream(uploadFile);byte[] buffer = new byte[1024 * 1024];int length;while ((length = in.read(buffer)) > 0) {out.write(buffer, 0, length);}in.close();out.close();} catch (FileNotFoundException ex) {ex.printStackTrace();} catch (IOException ex) {ex.printStackTrace();}}}
struts.xml配置文件中有关文件上传的配置:
<!--------------------文件名:struts.xml-------------------><struts><!-- 系统常量定义,定义上传文件字符集编码 --><constant name="struts.i18n.encoding" value="gb2312"></constant><!-- 系统常量定义,定义上传文件临时存放路径 --><constant name="struts.multipart.saveDir" value="c:"></constant><!-- Action所在包定义 --><package name="C04.4" extends="struts-default"><!-- Action名字,类以及导航页面定义 --><!-- 通过Action类处理才导航的的Action定义 --><action name="upload" src="/img/2012/10/16/1631207714.gif"> <!--------------------文件名:default.properties---------------->### This can be used to set your default locale and encoding scheme# struts.locale=en_USstruts.i18n.encoding=UTF-8### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data# struts.multipart.parser=cos# struts.multipart.parser=pellstruts.multipart.parser=jakarta# uses javax.servlet.context.tempdir by defaultstruts.multipart.saveDir=
如果不在struts.xml文件中定义,则Web项目会缺省使用default.properties文件中这两个常量属性的定义。一个将使字符编码集变为“UTF-8”,另一个干脆没有任何文件路径指定。而笔者开发的该Web项目缺省支持的字符编码集是“gb2312”,而且需要指定临时上传文件存放路径。(当然如果读者开发的Web项目缺省编码集就是“UTF-8”,而且也并不需要指定临时路径时候,就没必要在struts.xml中定义这两个<constant>),因此有必要定义这两个属性符合项目开发要求。
注意:也可以如第3章那样,把这两个属性定义在自定义的struts.properties文件中,具体代码可以如下:
<!------------------------文件名:struts.properties------------------>struts.i18n.encoding =gb2312struts.multipart.saveDir= c:\
笔者个人认为比在struts.xml中定义更加好,毕竟Struts2自己也是定义在properties属性文件中,而不是定义在自己的xml配置文件中。(Struts2自带的xml配置文件为struts-default.xml,在4.1小节中已记述)。这里是为了让读者知道struts.xml配置文件也可以配置这些属性,因此写在struts.xml配置文件中。从3.2小节笔者说明struts.xml配置文件时并没有介绍<constant>标签这点也可以知道笔者个人其实是不赞同这样的配置手段即在struts.xml中配置<constant>标签。
在<Action>标签中配置“result”,和第3章类似,将这两个JSP文件的导航流程配置好即可。
(4)开始进行文件上传功能展示,按照如上记述的步骤执行即可。笔者在桌面上新建了两个文本文件,将它们上传到JBoss已部署的Web项目中展示文件上传的upload文件夹下。如图4.11所示。
其实还可以指定上传文件的格式,让它只上传特定类型的文件。比如只能上传文本和xml文件,则在struts.xml需要显示配置“uploadFile”拦截器。如下代码:
<!-----------------------文件名:struts.xml------------------><struts><!-- Action所在包定义 --><package name="C04.4" extends="struts-default"><!-- Action名字,类以及导航页面定义 --><!-- 通过Action类处理才导航的的Action定义 --><action name="upload" class="action.UploadAction"><result name="input">/jsp/upload.jsp</result><result name="success">/jsp/result.jsp</result></action><!—显示配置文件上传拦截器 --><interceptor-ref name=”fileUpload”><!—指定特定类型的上传文件 --><param name =”allowedTypes”>text/plain,application/xml</param></ interceptor-ref ><interceptor-ref name=”defaultStack”></ interceptor-ref ></package></struts>
定义了一个名为“allowedTypes”的参数,其中在<param></param>之间的是文件类型,也可以用“,”间隔,表示允许上传多个文件类型。这里允许上传文件类型为txt、xml格式的文件。如果读者不知道各个文件类型的定义,可在自己的JBoss安装目录中的server\default\deploy\jboss-web.deployer\conf\下的web.xml文件中找到(搜索<mime-mapping>即可)。
注意:如果显示配置Struts2自己的缺省拦截器一定要写在“defaultStack”前,否则“fileUpload”拦截器不会执行拦截。因为Struts2中如果某个拦截器执行拦截时候发现自己已经执行过,第二个乃至之后同名的拦截器都不会执行。这里因为“defaultStack”拦截器栈中包含了“fileUpload”拦截器,而“fileUpload”拦截器已经执行拦截了,则不会再执行拦截。如果把“defaultStack”拦截器栈放在“fileUpload”拦截器前配置,则只执行“defaultStack”拦截器栈中的“fileUpload”拦截器,这里是没有定义“allowedTypes”的,Struts2缺省默认的是支持所有文件类型。因此它会支持所有文件类型的文件上传。因此再设定“allowedTypes”就没有任何意义了。