Java资源网

| JAVA基础 | 环境配置 | JDBC | 线程技术 | Socket编程 | JavaMail | JAVA与XML | 设计模式 | 技术新闻 | Java认证 | 程序人生 软件下载
| JSP&Servlet | Spring | Struts | Hibernate | JBuilder | Eclipse | WebService | EJB技术 | J2ME开发 | 应用服务器 | JXTA | Ajax
Articles search文章搜索
   关键字:
   类 别:
       
New download 最新下载
· [组件]HTML Parser 1.5
· [教程]WebSphere Studio应用教程
· [组件]JDom 1.0
· [工具]Junit3.8.1
· [教程]EJB编程及J2EE系统架构和设计
· [教程]EJB教程
· [教程]J2EE Tutorial中文版
· [教程]Java编程思想2(英文)
· [教程]java编程思想(完整版)
· [教程]Java网络编程
New articles 最新文章
· 设计移动 Web 服务
· 解析XML的时候完全忽略DTD
· 理解XML Schema XML Schema 初步
· 标签库的深入研究
· 提升JSP应用程序的七大绝招
· 如何使用JDOM对XML文件进行操作
· 处理XML字符串中特殊字符
· 利用Digester把XML转换成为Java对象
· 使用WebService 和RMI远程协作
· 使用Axis开发Web Service程序
Articles top 热门文章
· Eclipse基础--plugin插件安装(6644)
· eclipse+tomcat+lomboz的安装配置说明(4774)
· Java程序员就业前景(4584)
· Windows下JAVA环境变量的设置祥解(3788)
· Tomcat下JSP、Servlet和JavaBean环境的配置(3716)
· 使用links方式安装Eclipse插件(3698)
· 一个老程序员的心理话(3533)
· linux下jdk的安装与配置(3459)
· 初学者入门:Structs中基本配置入门(3334)
· Eclipse 运行命令行参数大全(3084)
您的位置:首页>>Struts>>在Struts 2中实现文件上传
在Struts 2中实现文件上传
2007-04-17   来源:Java资源网  作者:Java资源网

     Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。
                                                                                    
具体实现

    前段时间Apache发布了Struts 2.0.6 GA,所以本文的实现是以该版本的Struts作为框架的。以下是例子所依赖类包的列表:依赖类包的列表 
清单1 依赖类包的列表

首先,创建文件上传页面FileUpload.jsp,内容如下:
<% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %>
<% @ taglib prefix = " s " uri = " /struts-tags " %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
   
< title > Struts 2 File Upload </ title >
</ head >
< body >
   
< s:form action ="fileUpload" method ="POST" enctype ="multipart/form-data" >
       
< s:file name ="myFile" label ="Image File" />
       
< s:textfield name ="caption" label ="Caption" />        
       
< s:submit />
   
</ s:form >
</ body >
</ html >

清单2 FileUpload.jsp

在FileUpload.jsp中,先将表单的提交方式设为POST,然后将enctype设为multipart/form-data,这并没有什么特别之处。接下来,<s:file/>标志将文件上传控件绑定到Action的myFile属性。

其次是FileUploadAction.java代码:

package tutorial;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport {
   
private static final long serialVersionUID = 572146812454l ;
   
private static final int BUFFER_SIZE = 16 * 1024 ;
   
   
private File myFile;
   
private String contentType;
   
private String fileName;
   
private String imageFileName;
   
private String caption;
   
   
public void setMyFileContentType(String contentType) {
       
this .contentType = contentType;
   }

   
   
public void setMyFileFileName(String fileName) {
       
this .fileName = fileName;
   }

       
   
public void setMyFile(File myFile) {
       
this .myFile = myFile;
   }

   
   
public String getImageFileName() {
       
return imageFileName;
   }

   
   
public String getCaption() {
       
return caption;
   }


   
public void setCaption(String caption) {
       
this .caption = caption;
   }

   
   
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();
       }

   }

   
   
private static String getExtention(String fileName) {
       
int pos = fileName.lastIndexOf( " . " );
       
return fileName.substring(pos);
   }


   @Override
   
public String execute()     {        
       imageFileName
= new Date().getTime() + getExtention(fileName);
       File imageFile
= new File(ServletActionContext.getServletContext().getRealPath( " /UploadImages " ) + " / " + imageFileName);
       copy(myFile, imageFile);
       
return SUCCESS;
   }

   
}
清单3 tutorial/FileUploadAction.java

 

在FileUploadAction中我分别写了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三个属性。

FileUploadAction作用是将浏览器上传的文件拷贝到WEB应用程序的UploadImages文件夹下,新文件的名称是由系统时间与上传文件的后缀组成,该名称将被赋给imageFileName属性,以便上传成功的跳转页面使用。

下面我们就来看看上传成功的页面:

<% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %>
<% @ taglib prefix = " s " uri = " /struts-tags " %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
   
< title > Struts 2 File Upload </ title >
</ head >
< body >
   
< div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" >
       
< img src ='UploadImages/<s:property value ="imageFileName" /> ' />
       
< br />
       
< s:property value ="caption" />
   
</ div >
</ body >
</ html >

 

错误处理

上述例子实现的图片上传的功能,所以应该阻止用户上传非图片类型的文件。在Struts 2中如何实现这点呢?其实这也很简单,对上述例子作如下修改即可。

首先修改FileUpload.jsp,在<body>与<s:form>之间加入“<s:fielderror />”,用于在页面上输出错误信息。

然后修改struts.xml文件,将Action fileUpload的定义改为如下所示:

        < action name ="fileUpload" class ="tutorial.FileUploadAction" >
           
< 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" > /FileUpload.jsp </ result >
           
< result name ="success" > /ShowUpload.jsp </ result >
       
</ action >
  --相关文章--
· 用标签库提高开发速度 (2007-04-17)
· 用Struts实现管理大型复杂的网站 (2007-04-17)
· 我的struts分页算法的实现 (2007-04-17)
· 在Struts和Hibernate之间搭起桥梁 (2007-04-17)
· 在Struts 2中实现文件上传 (2007-04-17)
· 创建struts1.2 + Hibernate3.0 Web工程 (2007-04-17)

版权所有©2005-2006 JAVA资源网 渝ICP备05007591号 虚拟主机 | 关于我们 | 联系方式 | 广告业务 | 网站地图 | 友情链接