structs架构讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上传Action类UploadAction
private static String getExtention(String fileName) { int pos = stIndexOf("."); return fileName.substring(pos); } public String execute() { imageFileName = new Date().getTime() + getExtention(fileName); File imageFile = new File(ServletActionContext.getServletContext().getRealPath("/upload") + "/" + imageFileName); copy(myFile, imageFile); return SUCCESS; } }
web.xml
在原有文件中增加
<filter> <filter-name>struts-cleanup</filter-name> <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filterclass> </filter> <filter-mapping> <filter-name>struts-cleanup</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
下载Common-FileUplaod框架地址: /commons/fileupload/ 下载commons-fileupload-1.2-bin.zip文件 解压后得到commons-fileupload-1.2.jar /commons/io/ 下载commons-io-1.3.2-bin.zip文件 解压后得到commons-io-1.3.2.jar
第八章:Struts 2文件上传
房栋
本章内容
Struts2单文件上传 Struts2多文件上传
表单enctype属性
application/x-www-form-urlencoded: 默认值,只要是能输出网页的服务器 端环境都可以 multipart/form-data: 上传二进制数据,只有使用multipart/form-data ,才 能完整的传递文件数据,进行上传操作
在UploadAction中我分别写了setMyFileContentType、 setMyFileFileName、setMyFile和setCaption四个Setter方法,后两者很容 易明白,分别对应FileUpload.jsp中的<s:file/>和<s:textfield/>标志。但是前 两者并没有显式地与任何的页面标志绑定,那么它们的值又是从何而来的 呢?其实,<s:file/>标志不仅仅是绑定到myFile,还有myFileContentType (上传文件的MIME类型)和myFileFileName(上传文件的文件名,该文 件名不包括文件的路径)。因此,<s:file name="xxx" />对应Action类里面 的xxx、xxxContentType和xxxFileName三个属性。 UploadAction作用是将浏览器上传的文件拷贝到WEB应用程序的 UploadImages文件夹下,新文件的名称是由系统时间与上传文件的后缀组 成,该名称将被赋给imageFileName属性,以便上传成功的跳转页面使用 。
my.properties和struts.properties
错误处理
上述例子实现的图片上传的功能,所以应该阻止用户上传非图片类型的文 件。在Struts 2中如何实现这点呢?其实这也很简单,对上述例子作如下修 改即可。 首先修改upload.jsp,在<body>与<s:form>之间加入“<s:fielderror />”, 用于在页面上输出错误信息。 然后修改struts.xml文件,将Action fileUpload的定义改为如下所示: < action name ="fileUpload" class =“com.action. UploadAction" > < interceptor-ref name ="fileUpload" > < param name ="allowedTypes" > image/bmp,image/png,image/gif,image/jpeg </ param > </ interceptor-ref > < interceptor-ref name ="defaultStack" /> < result name ="input"> /upload.jsp </ result > < result name ="success"> /success.jsp </ result > </ action >
上传Action类UploadActionva.io.*; import java.util.Date; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class UploadAction extends ActionSupport { private static final int BUFFER_SIZE = 16 * 1024000; private File myFile; private String contentType; private String fileName; private String imageFileName; private String caption; 省略setter and getter…… }
基于表单的文件上传
注意:上面是基于表单的上传,在form标签中有一个必须的属性值设置:enctype. 如果要做文件上传功能必须将enctype值设为multipart/form-data.
此外,文件上传还需要二个JAR文件支持:
文件上传页面upload.jsp
<%@ page contentType="text/html;charset=gb2312" %> <%@ taglib prefix="s" uri="/struts-tags" %> <body> <s:fielderror /> <s:form action="fileUpload" method="POST" enctype="multipart/formdata"> <s:file name="myFile" label="上传图片" /> <s:textfield name="caption" label="图片标题" /> <s:submit value="提交" /> </s:form> </body>
两个上传框架
Common-FileUplaod:apache的开源项目,由jakarta项目组开发。 功能强大,简单易用,可以实现一次上传一个或多个文件,并可限制文件大小。 COS:O„Reilly公司开发的开源框架 会不定期的增加一些新功能。
下载Common-FileUplaod框架
错误处理
上面的出错提示是Struts 2默认的,大多数情况下,我们都需要自定义和国 际化这些信息。通过在全局的国际资源文件中加入 “struts.messages.error.content.type.not.allowed=上传文件类型不允许” ,可以实现以上提及的需求 还应该在UploadAction的return SUCCESS前加入: if(hasErrors()) return INPUT;
上传Action类UploadAction
private static void copy(File src, File dst) { try { InputStream in = null ; OutputStream out = null ; try { in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE); out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE); byte [] buffer = new byte [BUFFER_SIZE]; while (in.read(buffer) > 0 ) { out.write(buffer); } } finally { if ( null != in) { in.close(); } if ( null != out) { out.close(); } } } catch (Exception e) { e.printStackTrace(); } }
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "/dtds/struts-2.0.dtd"> <struts> <package name ="file" extends ="struts-default"> <action name ="fileUpload" class ="com.action.UploadAction"> <result name="success" >/success.jsp</result> <result name="input">/upload.jsp</result> </action> </package> </struts>
在运行上述例子,如果您留心一点的话,应该会发现服务器控制台有如下 输出: Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.dispatcher.Dispatcher getSaveDir INFO: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.interceptor.FileUploadInterceptor intercept INFO: Removing file myFile C:\Program Files\Tomcat 5.5 \work\Catalina\localhost\Struts2_Fileupload\upload_251447c2_1116e355 841__7ff7_00000006.tmp 服务器控制台输出 上述信息告诉我们,struts.multipart.saveDir没有配置。 struts.multipart.saveDir用于指定存放临时文件的文件夹,该配置写在 struts.properties文件中。例如,如果在struts.properties文件加入如下代码 : struts.multipart.saveDir = tmp 如果此文件夹不存在,Struts 2会自动创建一个。