struts2多文件上传上传下载

下次自动登录
现在的位置:
& 综合 & 正文
【SSH2(实践篇)】–Struts2文件上传下载实例
上篇又一次回顾了Struts2的运行机制,对它的运行步骤做了一步步的解析,这个解析不但再一次理清了Struts2的使用方法,而且对它的映射机制进行了深入的解析,并在最后通过一个实例来介绍了Struts2的一种使用方法,这里将做一个有关文件上传下载的实例。
一、文件上传
Struts2并没有提供文件上传的组件,所以想要实现上传的功能就必须通过第三方组件来实现,在Struts2引用的jar中包含了文件上传的组件,它是通过commons-fileupload.jar和commons-io.jar来实现的。这其中的处理细节不需要太懂,在使用中慢慢思考就可以做到灵活运用。
1、首先编写Action类
该类名称为downloadAction.java,必须在该类中引入java.io,文件上传的核心实现使用的还是java的数据流io操作。
package com.
import java.io.F
import java.io.FileInputS
import java.io.FileOutputS
import org.apache.struts2.ServletActionC
import com.opensymphony.xwork2.ActionS
public class uploadAction extends ActionSupport {
public File getFile() {
public void setFile(File file) {
this.file =
public String getFileFileName() {
return fileFileN
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileN
public String getFileContentType() {
return fileContentT
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentT
//文件名称
private String fileFileN
//文件类型
private String fileContentT
//注意:文件名称和文件类型的名称前缀必须相同,
public String execute() throws Exception{
//获取需要上传文件的文件路径
File uploadFile=new File(ServletActionContext.getServletContext().getRealPath("uploadFile"));
//判断文件是否上传,如果上传的话将会创建该目录
if(!uploadFile.exists()){
uploadFile.mkdir(); //创建该目录
//第一种文件上传的方法
//声明文件输入流,为输入流指定文件路径
FileInputStream input=new FileInputStream(file);
//获取输出流,获取文件的文件地址及名称
FileOutputStream out=new FileOutputStream(uploadFile + "\\" +fileFileName);
byte[] b=new byte[1024];//每次写入的大小
while((i=input.read(b))&0){
out.write(b,0,i);
}catch(Exception e){
e.printStackTrace();
input.close();
out.close();
//第二种文件上传的方法
//FileUtils.copyFile(upload,new File(uploadFile+"\\"+uploadFileName));
//FileUtils.copyFile(upload,new File(uploadFile,uploadFileName));
//第三种方法
BufferedReader bReader=new BufferedReader(new InputStreamReader(new FileInputStream(upload)));
BufferedWriter bWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(uploadFile+"\\"+uploadFileName)));
char[] str=new char[1024];
while((i=bReader.read(str))&0){
bWriter.write(str,0,i);
}catch(Exception e){
e.printStackTrace();
bReader.close();
bWriter.close();
uploadFile.delete();
return "success";
Action类中需要注意的是文件名和文件类型的命名都是有要求的,文件名和文件类型的前缀必须是文件变量,并且要和jsp页面中添加的文件名称一致,如上例中的jsp标签为:&input type='File' name='file'&,在Action类中的文件名称和文件类型必须相应为fileXXX和fileXXX。另外也可以在该Action类中配置其它上传属性,如:可以通过maximumSize指定上传文件的大小,allowedTypes执行上传文件的类型。
上面的Action类指定了三种上传方法,它们操作的核心还是java.io,通过数据流的读入和写出来实现文件的上传。其中第一种和第三种采用的是java.io流操作,而第二种采用的是common.io流操作。
2、struts2.xml相应的action配置
action类编写完成后,接下来要把它配置到相应的action标签中,这样在执行action时会根据注册类执行内部的方法。具体配置方法如下实例。
&package name="upload" namespace="/file" extends="struts-default"&
&action name="upload" class="uploadAction"&
&result name="success"&/success.jsp&/result&
&result name="error"&/error.jsp&/result&
&result name="input"&/index.jsp&/result&
&param name="savePath"&/upload&/param&
&/package&
3、最后配置相应的jsp页面
在配置时需要注意的是文件的编码格式,需要改成multipart/form-data类型,是指把文件及文件的内容都提交,另外enctype还有两个属性值分别是text/plain,指定了表单是以文本的方式进行提交;application/x-www-form-urlencoded这是默认的编码方式,提交时,只提交表单域的value属性值。
&form action="file/upload" method="post" enctype="multipart/form-data"&
&input type="file" name="upload"&
&input type="submit" name="btnUpload" value="上传"&
最后提交,查看提交结果,提交后的文件默认存放在.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\项目名称\uploadFile下,所以在编写action类时需要获取文件上传的路径使用的是getRealPath("uploadFile")。
二、文件下载
相较上传,文件的下载编写起来相交就简单多了,首先也需要添加下载的action类,然后配置struts.xml中的action,最后在jsp中添加链接标签。
1、添加下载action类
添加的action类指定要注意获取文件的输出路径,通过获取输出流来获取文件的路径。
package com.
import java.io.InputS
import org.apache.struts2.ServletActionC
import com.opensymphony.xwork2.ActionS
public class downloadAction extends ActionSupport {
private InputStream fileI
private String fileN
public String getFileName() {
return fileN
public void setFileName(String fileName) {
this.fileName = fileN
public InputStream getFileInput() {
return ServletActionContext.getServletContext().getResourceAsStream("upload\\"+fileName);
public void setFileInput(InputStream fileInput) {
this.fileInput = fileI
public String execute() throws Exception{
fileInput=ServletActionContext.getServletContext().getResourceAsStream("upload\\"+fileName);
return "success";
2、配置struts.xml标签
在配置时结果类型要指定type类型,将它赋值为stream,并添加属性下面的属性,该属性同样可以配置到拦截器中,在拦截器中指定配置的文件。
&action name="download" class="com.action.downloadAction"&
&result name="success" type="stream"&
&param name="inputName"&fileInput&/param&
&param name="contentDispostion"&filename="$(fileName)"&/param&
3、jsp页面
jsp代码就很简单了,不多说看代码。
&a href="file/download"&123.txt&/a&
通过使用文件的上传下载功能来熟悉Struts2的使用方法,并了解Servlet请求的基本用法,为以后深入学习Servlet打下基础。struts的文件上传和下载使用的是io流操作完成的,可以使用java.io流,同样可以使用第三方的common.io流实现,有关多文件上传的问题将会在下篇文章中讨论。
&&&&推荐文章:
【上篇】【下篇】trackbacks-0
前言:好久没有发新随笔了,不是没有在学习,而是这个月BRAS用得太猛了,后面几天都没网上了!好了,言归正传,用一个小工程总结一下最近学习Struts2的心得体会。
开发环境:jdk1.6 + tomcat6.0.14 + Myeclipse6.0 + Struts2.0.14 + commons-fileupload-1.2.1 + commons-io-1.4
学习教程:风中叶 浪曦_Struts2应用开发系列
小项目需求分析或实现的功能:
(1).用户只有输入正确的邀请码之后才能进行注册,否则填写注册信息之后提交没有反应,还会停留在注册页面。
(2).用户注册之后可以上传文件,也可以下载其中的文件。
分析:struts2并没有实现文件的上传和下载,我们需要到apache网站去下载commons-fileupload-1.2.1&和 commons-io-1.4 ,并把其中的核心jar包导入到工程。我们可以使用拦截器来实现功能(1)。
具体步骤:
1.新建web项目 命名为struts2demo
2.向工程中导入所需要的jar包 必要的jar包有七个
3.在web.xml文件中注册struts2
&?xml&version="1.0"&encoding="UTF-8"?&
&web-app&version="2.4"&
&&&&xmlns="/xml/ns/j2ee"&
&&&&xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&
&&&&xsi:schemaLocation="/xml/ns/j2ee&
&&&&/xml/ns/j2ee/web-app_2_4.xsd"&
&&&filter&
&&&&&&filter-name&struts2&/filter-name&
&&&&&&filter-class&org.apache.struts2.dispatcher.FilterDispatcher&/filter-class&&
&&&/filter&
&&&filter-mapping&
&&&&&&filter-name&struts2&/filter-name&
&&&&&&url-pattern&/*&/url-pattern&
&&&/filter-mapping&
&/web-app&
4.编写输入邀请码的JSP页面invite.jsp
&%@&page&language="java"&contentType="text/&charset=GBK"
&&&&pageEncoding="GBK"%&
&%@&taglib&prefix="s"&uri="/struts-tags"&%&&&&
&!DOCTYPE&html&PUBLIC&"-//W3C//DTD&HTML&4.01&Transitional//EN"&"http://www.w3.org/TR/html4/loose.dtd"&
&head&&title&验证码校验&/title&&/head&
&&&&&table&align="center"&width="60%"&&tr&&td&style="color:red"&&s:fielderror/&&/td&&/tr&&/table&&&&
&&&&&form&action="invite.action"&method="post"&
&&&&&&&&请输入您的验证码:&br&
&&&&&&&&input&type="text"&name="invitedcode"&&br&
&&&&&&&&input&type="submit"&value="提交验证码"&
&&&&&&&&input&type="reset"&value="重新输入"&&&&
&&&&&/form&&&&
5.在Tomcat的server.xml中加入工程
6.启动Tomcat服务器 测试当前所做是否有错误
以上表明当前设置没有错误!
7.在src下新建com.demo.action包,并在其中新建InviteAction类,此类要继承ActionSupport类
package&com.demo.
import&java.util.M
import&com.opensymphony.xwork2.ActionC
import&com.opensymphony.xwork2.ActionS
public&class&InviteAction&extends&ActionSupport&{
&&&&private&String&
&&&&public&String&getInvitedcode()&{
&&&&&&&&return&
&&&&public&void&setInvitedcode(String&invitedcode)&{
&&&&&&&&this.invitedcode&=&
&&&&@Override
&&&&public&String&execute()&throws&Exception&{
&&&&&&&&if("<span style="color: #0081078".equals(this.getInvitedcode())){&&&&&&&
&&&&&&&&&&&&return&SUCCESS;
&&&&&&&&else{
&&&&&&&&&&&&this.addFieldError("invitedcode",&"输入的邀请码不正确!请再次输入!");
&&&&&&&&&&&&return&INPUT;
类中规定只有输入的验证码为,才能进入到注册页面,否则会出现错误的提示信息并回到原页面继续输入。
8.在src下新建struts.xml文件,在struts.xml文件中对InviteAction进行注册
&?xml&version="1.0"&encoding="UTF-8"&?&
&!DOCTYPE&struts&PUBLIC
&&&&"-//Apache&Software&Foundation//DTD&Struts&Configuration&2.0//EN"
&&&&"http://struts.apache.org/dtds/struts-2.0.dtd"&
&&&&&package&name="struts2demo"&extends="struts-default"&
&&&&&&&&&action&name="invite"&class="com.demo.action.InviteAction"&&&&&&&&&&&&
&&&&&&&&&&&&&result&name="input"&/invite.jsp&/result&
&&&&&&&&&&&&&result&name="success"&/register.jsp&/result&
&&&&&&&&&/action&&&&&
&&&&&/package&
9.新建register.jsp页面,并加入如下代码
&%&#64;&page&language="java"&import="java.util.*"&pageEncoding="GBK"%&
&%&#64;&taglib&prefix="s"&uri="/struts-tags"&%&
String&path&=&request.getContextPath();
String&basePath&=&request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
&!DOCTYPE&HTML&PUBLIC&"-//W3C//DTD&HTML&4.01&Transitional//EN"&
&&&&title&注册页面&/title&
&&&&&script&type="text/javascript"&
&&&&&&&&function&validate(){
&&&&&&&&&&&var&usernameValue&=&document.getElementById("usernameId").
&&&&&&&&&&&var&passwordValue&=&document.getElementById("passwordId").
&&&&&&&&&&&var&repasswordValue&=&document.getElementById("repasswordId").
&&&&&&&&&&&
&&&&&&&&&&&if(usernameValue.length&==&0){
&&&&&&&&&&&&&&&alert("用户名不能为空!");
&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&}
&&&&&&&&&&&else&if(usernameValue.length&&&6&||&usernameValue.length&&&16){
&&&&&&&&&&&&&&&alert("用户名只能由6-16位字母和数字组成!");
&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&}
&&&&&&&&&&&
&&&&&&&&&&&if(passwordValue.length&==&0){
&&&&&&&&&&&&&&&alert("密码不能为空!");
&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&}
&&&&&&&&&&&else&if(passwordValue.length&&&6&||&passwordValue.length&&&16){
&&&&&&&&&&&&&&&alert("用户名只能由6-16位字母和数字组成!");
&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&}
&&&&&&&&&&&
&&&&&&&&&&&if(passwordValue&!=&repasswordValue){
&&&&&&&&&&&&&&&alert("两次输入的密码不一致!");
&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&}
&&&&&&&&&&&
&&&&&&&&&&&return&true;
&&&&&/script&
&&&&&&&table&align="center"&width="60%"&&tr&&td&style="color:green"&&s:fielderror/&&/td&&/tr&&/table&
&&&&&&&s:form&action="register"&theme="simple"&method="post"&
&&&&&&&table&align="center"&width="40%"&border="2"&
&&&&&&&&&&tr&&td&*用户名:&/td&&td&&&s:textfield&name="username"&id="usernameId"&&/s:textfield&&&/td&&/tr&
&&&&&&&&&&tr&&td&*密码:&/td&&td&&&s:password&name="password"&id="passwordId"&&/s:password&&&/td&&/tr&
&&&&&&&&&&tr&&td&*重复密码:&/td&&td&&&s:password&name="repassword"&id="repasswordId"&&/s:password&&&/td&&/tr&
&&&&&&&&&&tr&&td&年龄:&/td&&td&&&s:textfield&name="age"&&/s:textfield&&&/td&&/tr&
&&&&&&&&&&tr&&td&生日:&/td&&td&&&s:textfield&name="birthday"&&/s:textfield&&&/td&&/tr&
&&&&&&&&&&tr&&td&&&s:submit&value="注册"&onclick="validate()"&&/s:submit&&/td&&td&&s:reset&value="重填"&&/s:reset&&&/td&&/tr&
&&&&&&&&&&&&&&&
&&&&&&&/table&
&&&&&&&/s:form&
其中脚本validate()方法对输入进行客户端的验证,如果没有输入必填项(用户名和密码)或输入的长度超过限制,都会提示相应的错误信息。
10.对以上所做工作进行测试
如果输入错误的邀请码 如 则显示结果如下
如果输入正确的邀请码 如 则转入到注册页面 测试成功!
11.在action包中创建RegisterAction类 并编写如下代码
package&com.demo.
import&java.util.C
import&java.util.D
import&com.opensymphony.xwork2.ActionS
public&class&RegisterAction&extends&ActionSupport&{
&&&&private&String&
&&&&private&String&
&&&&private&String&
&&&&private&int&
&&&&private&Date&
&&&&public&String&getUsername()&{
&&&&&&&&return&
&&&&public&void&setUsername(String&username)&{
&&&&&&&&this.username&=&
&&&&public&String&getPassword()&{
&&&&&&&&return&
&&&&public&void&setPassword(String&password)&{
&&&&&&&&this.password&=&
&&&&public&String&getRepassword()&{
&&&&&&&&return&
&&&&public&void&setRepassword(String&repassword)&{
&&&&&&&&this.repassword&=&
&&&&public&int&getAge()&{
&&&&&&&&return&
&&&&public&void&setAge(int&age)&{
&&&&&&&&this.age&=&
&&&&public&Date&getBirthday()&{
&&&&&&&&return&
&&&&public&void&setBirthday(Date&birthday)&{
&&&&&&&&this.birthday&=&
&&&&&#64;Override
&&&&public&String&execute()&throws&Exception&{
&&&&&&&&return&SUCCESS;
&&&&&#64;Override
&&&&public&void&validate()&{
&&&&&&&&if(null&==&username&||&username.length()&<span style="color: #&||&username.length()&<span style="color: #){
&&&&&&&&&&&&this.addActionError("用户名应该由6-10位字母和数字组成");
&&&&&&&&&&}
&&&&&&&&if(null&==&password&||&password.length()&<span style="color: #&||&password.length()&<span style="color: #){
&&&&&&&&&&&&&&&&this.addActionError("密码应该由6-10位字母和数字组成");
&&&&&&&&&&}
&&&&&&&&else&if(!(repassword.equals(password))){
&&&&&&&&&&&&&&&&this.addActionError("两次输入密码不一致!");
&&&&&&&&&&}
&&&&&&&&if(age&<span style="color: #&||&age&<span style="color: #0){
&&&&&&&&&&&&&&&&this.addActionError("年龄应该在0-150之间!");
&&&&&&&&&&}
&其中validate()方法对输入进行服务器端的验证,以提高安全性。
12.在struts.xml文件中对RegisterAction进行注册 在package下加入如下代码
&action&name="register"&class="com.demo.action.RegisterAction"&&&&&&&&&&&&
&&&&&&&&&&&&&result&name="input"&/register.jsp&/result&
&&&&&&&&&&&&&result&name="success"&/registersuccess.jsp&/result&
&&&&&&&&&/action&
13.编写registersuccess.jsp页面
&%&#64;&page&language="java"&contentType="text/&charset=GBK"
&&&&pageEncoding="GBK"%&
&!DOCTYPE&html&PUBLIC&"-//W3C//DTD&HTML&4.01&Transitional//EN"&"http://www.w3.org/TR/html4/loose.dtd"&
&title&注册成功&/title&
&&&&恭喜您已经注册成功!&br&
&&&&一下是您的注册信息:&br&
&&&&用户名:${requestScope.username}&br&
&&&&密码:${requestScope.password}&br&
&&&&年龄:${requestScope.age}&br&
&&&&生日:${requestScope.birthday}&br&
&&&&&a&href="upload.jsp"&开始上传文件&/a&
14.对上述工作进行测试
如果进行不合法的注册 如没有填入必填项或者输入长度不合法 会出现相关错误提示信息
如果输入合法注册信息,将转到注册成功页面。
15.编写文件上传页面upload.jsp代码
&%&#64;&page&language="java"&contentType="text/&charset=GBK"
&&&&pageEncoding="GBK"%&
&%&#64;&taglib&prefix="s"&uri="/struts-tags"%&
&!DOCTYPE&html&PUBLIC&"-//W3C//DTD&HTML&4.01&Transitional//EN"&"http://www.w3.org/TR/html4/loose.dtd"&
&meta&http-equiv="Content-Type"&content="text/&charset=ISO-8859-1"&
&title&上传文件页面&/title&
&&&&script&type="text/javascript"&
&&&&&&function&addMore(){
&&&&&&&&&var&td&=&document.getElementById("more");
&&&&&&&&&var&br&=&document.createElement("br");
&&&&&&&&&var&input&=&document.createElement("input");
&&&&&&&&&var&button&=&document.createElement("input");
&&&&&&&&&input.type&=&"file";
&&&&&&&&&input.name&=&"file";
&&&&&&&&&button.type="button";
&&&&&&&&&button.value="Remove";
&&&&&&&&&button.onclick&=&function(){
&&&&&&&&&&&&td.removeChild(br);
&&&&&&&&&&&&td.removeChild(input);
&&&&&&&&&&&&td.removeChild(button);
&&&&&&&&&}
&&&&&&&&&td.appendChild(br);
&&&&&&&&&td.appendChild(input);
&&&&&&&&&td.appendChild(button);
&&&&/script&
&&&&&&table&align="center"&width="60%"&&tr&&td&style="color:green"&&s:fielderror/&&/td&&/tr&&/table&
&&&&&&s:form&action="upload"&theme="simple"&enctype="multipart/form-data"&method="post"&
&&&&&&&table&align="center"&width="50%"&border="2"&
&&&&&&&&&&tr&&td&用户名:&/td&&td&&&s:textfield&name="username"&&/s:textfield&&&/td&&/tr&
&&&&&&&&&&tr&&td&密码:&/td&&td&&&s:password&name="password"&&/s:password&&&/td&&/tr&
&&&&&&&&&&tr&&td&选择文件:&/td&&&&td&id="more"&&s:file&name="file"&&/s:file&&input&type="button"&value="上传更多"&onclick="addMore()"&&/td&&&/tr&
&&&&&&&&&&tr&&td&&s:submit&value="&全部上传&"&&/s:submit&&/td&&/tr&
&&&&&&&&&&&&&&&
&&&&&&&/table&
&&&&&&&/s:form&
& 该页面允许用户上传足够多的文件。点击&#8220;上传更多...&#8221;按钮一次会添加一个上传文件textfield,点击&#8216;Remove&#8217;按钮可以消去该行。
16.编写UploadAction类代码 将文件上传到upload文件夹
package&com.demo.
import&java.io.F
import&java.io.FileInputS
import&java.io.FileOutputS
import&java.io.InputS
import&java.io.OutputS
import&java.util.L
import&org.apache.struts2.ServletActionC
import&com.opensymphony.xwork2.ActionS
public&class&UploadAction&extends&ActionSupport&{
&&&&private&String&
&&&&private&String&
&&&&private&List&File&&
&&&&private&List&String&&fileFileN
&&&&private&List&String&&fileContentT
&&&&public&String&getUsername()&{
&&&&&&&&return&
&&&&public&void&setUsername(String&username)&{
&&&&&&&&this.username&=&
&&&&public&String&getPassword()&{
&&&&&&&&return&
&&&&public&void&setPassword(String&password)&{
&&&&&&&&this.password&=&
&&&&public&List&File&&getFile()&{
&&&&&&&&return&
&&&&public&void&setFile(List&File&&file)&{
&&&&&&&&this.file&=&
&&&&public&List&String&&getFileFileName()&{
&&&&&&&&return&fileFileN
&&&&public&void&setFileFileName(List&String&&fileFileName)&{
&&&&&&&&this.fileFileName&=&fileFileN
&&&&public&List&String&&getFileContentType()&{
&&&&&&&&return&fileContentT
&&&&public&void&setFileContentType(List&String&&fileContentType)&{
&&&&&&&&this.fileContentType&=&fileContentT
&&&&&#64;Override
&&&&public&String&execute()&throws&Exception&{
&&&&&&&&for(int&i&=&<span style="color: #;i&file.size();i++){
&&&&&&&&&&&&InputStream&is&=&new&FileInputStream(file.get(i));
&&&&&&&&&&&&
&&&&&&&&&&&&String&root&=&ServletActionContext.getRequest().getRealPath("/upload");
&&&&&&&&&&&&
&&&&&&&&&&&&File&destFile&=&new&File(root,this.getFileFileName().get(i));
&&&&&&&&&&&&
&&&&&&&&&&&&OutputStream&os&=&new&FileOutputStream(destFile);
&&&&&&&&&&&&
&&&&&&&&&&&&byte[]&buffer&=&new&byte[<span style="color: #0];
&&&&&&&&&&&&int&length&=&<span style="color: #&;
&&&&&&&&&&&&while((length&=&is.read(buffer))&&&<span style="color: #){
&&&&&&&&&&&&&&&&os.write(buffer,&<span style="color: #,&length);
&&&&&&&&&&&&}
&&&&&&&&&&&&
&&&&&&&&&&&&is.close();
&&&&&&&&&&&&os.close();
&&&&&&&&return&SUCCESS;
17.在struts.xml文件中对UploadAction进行注册
&&&&&&action&name="upload"&class="com.demo.action.UploadAction"&
&&&&&&&&&&&&&result&name="success"&/uploadsuccess.jsp&/result&
&&&&&&&&&&&&&result&name="input"&/upload.jsp&/result&
&&&&&&&&&&&&&interceptor-ref&name="fileUpload"&
&&&&&&&&&&&&&&&&&param&name="maximumSize"&<span style="color: #96000&/param&
&&&&&&&&&&&&&&&&&param&name="allowedTypes"&application/vnd.ms-powerpoint&/param&
&&&&&&&&&&&&&/interceptor-ref&&
&&&&&&&&&&&&&interceptor-ref&name="defaultStack"&&/interceptor-ref&
&&&&&&&&&/action&
&上传文件时会用到内部的fileUpload拦截器 其中对上传文件的大小和类型进行了限制 如上也许上传最大文件为4000K,文件类型只能为ppt类型。
18.对上传文件是的错误信息进行改进,系统提供的错误信息(如文件大小或类型不合法)可读性很差。
&&& 在struts.xml中加入如下语句&
&constant&name="struts.custom.i18n.resources"&value="message"&&/constant&
&&&&&constant&name="struts.i18n.encoding"&value="gbk"&&/constant&
&& 第一句是配置错误信息message.properties,第二句是对上传文件过程中的中文乱码进行更正。
&& 在src目录下新建文件message.properties ,文件内容为
struts.messages.error.content.type.not.allowed=\u4e0a\u4f20\u\u4ef6\u7c7b\u578b\u4e0d\u&\u8bf7\u91cd\u8bd5
struts.messages.error.file.too.large=\u4e0a\u4f20\u\u\u5c0f\u8d85\u8fc7\u
& 右边的编码可以通过Java提供的native2ascii进行转换。
19.编写download.jsp页面
&%&#64;&page&language="java"&contentType="text/&charset=GBK"
&&&&pageEncoding="GBK"%&
&%&#64;&taglib&prefix="s"&uri="/struts-tags"&%&
&!DOCTYPE&html&PUBLIC&"-//W3C//DTD&HTML&4.01&Transitional//EN"&"http://www.w3.org/TR/html4/loose.dtd"&
&title&文件下载&/title&
&&&&欢迎来到下载页面!&br&
&&&&s:a&href="/struts2/download.action"&点击下载&/s:a&
&&20.编写DownloadAction类代码 假设我们要下载的是upload文件夹下的Struts2.ppt文件
package&com.demo.
import&java.io.InputS
import&org.apache.struts2.ServletActionC
import&com.opensymphony.xwork2.ActionS
public&class&DownloadAction&extends&ActionSupport&{
&&&&public&InputStream&getDownloadFile(){
&&&&&&&&return&ServletActionContext.getServletContext().getResourceAsStream("/upload/Struts2.ppt");
&&&&&#64;Override
&&&&public&String&execute()&throws&Exception&{
&&&&&&&&return&SUCCESS;
21.在struts.xml文件中对DownloadAction进行注册 要注意其中的参数名称
&&action&name="download"&class="com.demo.action.DownloadAction"&&
&&&&&&&&&&&&&result&name="success"&type="stream"&
&&&&&&&&&&&&&&&&param&name="contentType"&application/vnd.ms-powerpoint&/param&
&&&&&&&&&&&&&&&&param&name="contentDisposition"&filename="Struts2.ppt"&/param&
&&&&&&&&&&&&&&&&param&name="inputName"&downloadFile&/param&
&&&&&&&&&&&&&/result&
&&&&&&&&&/action&
&22.对以上步骤进行测试
上传文件类型不合法
上传合法内容,如我们上传三个ppt文件 则能成功
点击到下载页面下载文件
23.实现邀请码功能 以上并没有实现邀请码的功能,即用户可以直接进入到注册页面进行注册。我们需要编写一个拦截器实现该功能。
(1)编写InviteInterceptor拦截器代码
package&com.demo.
import&java.util.M
import&com.opensymphony.xwork2.A
import&com.opensymphony.xwork2.ActionI
import&com.opensymphony.xwork2.interceptor.AbstractI
public&class&InviteInterceptor&extends&AbstractInterceptor&{
&&&&&#64;Override
&&&&public&String&intercept(ActionInvocation&invocation)&throws&Exception&{
&&&&&&&&Map&map&=&invocation.getInvocationContext().getSession();
&&&&&&&&if(map.get("invitedcode")&==&null){
&&&&&&&&&&&&return&Action.INPUT;
&&&&&&&&}else{
&&&&&&&&&&&&return&invocation.invoke();
(2)改写InviteAction的execute()方法 加入如下语句
(3)在struts.xml中注册拦截器 并在register的action中加入拦截器
&& 最终struts.xml的代码
&?xml&version="1.0"&encoding="UTF-8"&?&
&!DOCTYPE&struts&PUBLIC
&&&&"-//Apache&Software&Foundation//DTD&Struts&Configuration&2.0//EN"
&&&&"http://struts.apache.org/dtds/struts-2.0.dtd"&
&&&&&constant&name="struts.custom.i18n.resources"&value="message"&&/constant&
&&&&&constant&name="struts.i18n.encoding"&value="gbk"&&/constant&
&&&&&constant&name="struts.multipart.saveDir"&value="/upload"&&/constant&
&&&&&package&name="struts2demo"&extends="struts-default"&
&&&&&&&&&interceptors&&&&&&&&&&&&&
&&&&&&&&&&&&interceptor&name="invite"&class="com.demo.interceptor.InviteInterceptor"&&/interceptor&
&&&&&&&&&/interceptors&&&&&
&&&&&&&&&action&name="invite"&class="com.demo.action.InviteAction"&&&&&&&&&&&&
&&&&&&&&&&&&&result&name="input"&/invite.jsp&/result&
&&&&&&&&&&&&&result&name="success"&/register.jsp&/result&
&&&&&&&&&/action&&&&&
&&&&&&&&&action&name="register"&class="com.demo.action.RegisterAction"&&&&&&&&&&&&
&&&&&&&&&&&&&result&name="input"&/register.jsp&/result&
&&&&&&&&&&&&&result&name="success"&/registersuccess.jsp&/result&
&&&&&&&&&&&&
&&&&&&&&&&&&&interceptor-ref&name="invite"&&/interceptor-ref&
&&&&&&&&&&&&&interceptor-ref&name="defaultStack"&&/interceptor-ref&
&&&&&&&&&/action&
&&&&&&&&&action&name="upload"&class="com.demo.action.UploadAction"&
&&&&&&&&&&&&&result&name="success"&/uploadsuccess.jsp&/result&
&&&&&&&&&&&&&result&name="input"&/upload.jsp&/result&
&&&&&&&&&&&&&interceptor-ref&name="fileUpload"&
&&&&&&&&&&&&&&&&&param&name="maximumSize"&<span style="color: #96000&/param&
&&&&&&&&&&&&&&&&&param&name="allowedTypes"&application/vnd.ms-powerpoint&/param&
&&&&&&&&&&&&&/interceptor-ref&&
&&&&&&&&&&&&&interceptor-ref&name="defaultStack"&&/interceptor-ref&
&&&&&&&&&/action&
&&&&&&&&&&action&name="download"&class="com.demo.action.DownloadAction"&&
&&&&&&&&&&&&&result&name="success"&type="stream"&
&&&&&&&&&&&&&&&&param&name="contentType"&application/vnd.ms-powerpoint&/param&
&&&&&&&&&&&&&&&&param&name="contentDisposition"&filename="Struts2.ppt"&/param&
&&&&&&&&&&&&&&&&param&name="inputName"&downloadFile&/param&
&&&&&&&&&&&&&/result&
&&&&&&&&&/action&
&&&&&/package&
24.最后的测试
如果没有进行邀请码的验证 直接进入到注册页面进行注册 将不成功。达到项目需求。
总结:这是最近三天学习的结果,很喜欢风中叶老师的讲解。他没有给我们代码,却每一步都讲得很仔细,还带着我们一步步地看相关的帮助文档,会继续支持风中叶老师的!开发还是要自己多看看各种文档,这样才能学习到正宗的知识!
由于随笔附件大小有限制 上传的代码中删除了struts2的5个jar包 可自行加入
本随笔代码
阅读(15650)
&re: struts2实现文件上传的下载
兄弟,赞一个。&&&&&&
&re: struts2实现文件上传的下载[未登录]
大哥,什么叫做文件上传的下载?&&&&&&
&re: struts2实现文件上传的下载
就一个上传下载文件,竟然让你搞了这么一大堆垃圾代码,拦截器都是现成的,一个action ,5,6行代码足以,洋洋撒萨!&&&&&&
&re: struts2实现文件上传的下载
&#64;事发当时
本人菜鸟而已 只是把最近的学习内容串联在一起 复习一下 没有别的&&&&&&
&re: struts2实现文件上传的下载
谢谢楼主分享,很详细适合我这种初学者,希望多多发此类帖子哟,我会常来看的,有个问题,使用拦截器后还是可以不通过验证页面直接进入register.jsp页可提交成功,不知道为何&&&&&&
&re: struts2实现文件上传的下载
&#64;gyl868
可能我配置的时候错误了 我有空再看看&&&&&&
&re: struts2实现文件上传的下载[未登录]
这些截图真的是由这些代码产生的吗?有些地方是错的,如RegisterAction里面的validate方法中addActionError,但在相应的jsp中却用的是fielderror...&&&&&&
&re: struts2实现文件上传的下载[未登录]
撒旦法撒旦法&&&&&&
&re: struts2实现文件上传的下载
NB的人都滚一边去,人家分享个东西,看把TM你给牛的!
看不懂什么意思还不如去。。。
真2.。。&&&&&&
&re: struts2实现文件上传的下载
NB的人都滚一边去,人家分享个东西,看把TM你给牛的!
看不懂什么意思还不如去死!。。。&&&&&&
&re: struts2实现文件上传的下载
写的不错,基本上跟着楼主做出来了,谢谢&&&&&&
&re: struts2实现文件上传和下载
谢谢楼主 学习了&&&&&&
&re: struts2实现文件上传和下载[未登录]
很好!&&&&&&
&re: struts2实现文件上传和下载[未登录]
我是菜鸟,按你的步骤走 由错误 提示我找不到系统指定的路径&&&&&&
&re: struts2实现文件上传和下载
不错 学习了&&&&&&
&re: struts2实现文件上传和下载
fsdfdsfdsfs&&&&&&
&re: struts2实现文件上传和下载
下载功能不行&&&&&&
&re: struts2实现文件上传和下载[未登录]
&#64;事发当时
可以把你说的方法给我看看么??
javajacob&#先谢过。&&&&&&
&re: struts2实现文件上传和下载
你是北京圣思园的吧,一点新意没有&&&&&&
&re: struts2实现文件上传和下载
步骤不全啊~uploadsuccess.jsp就没有说怎么建啊&&&&&&
&re: struts2实现文件上传和下载
dssf&&&&&&
&re: struts2实现文件上传和下载[未登录]
我运行下载页面时出错啊!怎么改?&&&&&&
&re: struts2实现文件上传和下载
大侠 ……怎么实现点一个文件下载一个文件,而不是固定的文件?&&&&&&
&re: struts2实现文件上传和下载
配置的文件 有关键字, 把action 中的name
换下就可以了 &#64;陈&&&&&&
&re: struts2实现文件上传和下载
怎么将上传的东西在页面上显示出来啊&&&&&&
&re: struts2实现文件上传和下载
你这代码量有点多,STRUTS2封装好了,顶多15行搞定&&&&&&
&re: struts2实现文件上传和下载[未登录]
下载做来直接就在页面把文件打开了。。&&&&&&
2015年11月
2526272829303112345678910111213141516171819202122232425262728293012345
阅读排行榜
评论排行榜

我要回帖

更多关于 struts2上传 的文章

 

随机推荐