实现文件上传的Action

 

假设有如图4.22所示的文件上传页面,其中包含两个表单域:文件标题和文件域——当然,为了能完成文件上传,我们应该将这两个表单域所在表单的enctype属性设置为“multipart/form-data”。该页面的代码如下。

程序清单:codes\04\4.3\simpleUpload\WEB-INF\content\upload.jsp

 
 
  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>  
  2. <%@taglib prefix="s" uri="/struts-tags"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  4.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  5. <html xmlns="http://www.w3.org/1999/xhtml">  
  6. <head>  
  7.     <title>简单的文件上传</title>  
  8. </head>  
  9. <body>  
  10. <s:form action="uploadPro" 
  11.     enctype="multipart/form-data">  
  12.     <s:textfield name="title" label="文件标题"/><br />  
  13.     <s:file name="upload" label="选择文件"/><br />  
  14.     <s:submit value="上传"/>  
  15. </s:form>  
  16. </body>  
  17. </html>  

 

上面的页面使用了Struts 2的标签库来生成上传文件的表单,其中<s:file…/>用于生成一个文件上传域。当该页面提交请求时,请求发送到uploadPro.action,这是Struts 2的一个Action

Struts 2Action无须负责处理HttpServletRequest请求,正如前面介绍的,Struts 2Action已经与Servlet API彻底分离了,Struts 2框架负责解析HttpServletRequest请求中的参数,包括文件域,Struts 2使用File类型来封装文件域。下面是处理上传请求的Action类代码。

程序清单:codes\04\4.3\simpleUpload\WEB-INF\src\org\crazyit\app\action\UploadAction.java

 
 
  1. public class UploadAction extends ActionSupport  
  2. {  
  3.     //封装文件标题请求参数的属性  
 
 
  1.  
  2.     private String title;  
  3.     //封装上传文件域的属性  
  4.     private File upload;  
  5.     //封装上传文件类型的属性  
  6.     private String uploadContentType;  
  7.     //封装上传文件名的属性  
  8.     private String uploadFileName;  
  9.     //直接在struts.xml文件中配置的属性  
  10.     private String savePath;  
  11.     //接受struts.xml文件配置值的方法  
  12.     public void setSavePath(String value)  
  13.     {  
  14.         this.savePath = value;  
  15.     }  
  16.     //返回上传文件的保存位置  
  17.     private String getSavePath() throws Exception   
  18.     {  
  19.         return ServletActionContext.getServletContext()  
  20.             .getRealPath("/WEB-INF/" + savePath);  
  21.     }  
  22.     //文件标题的setter和getter方法  
  23.     public void setTitle(String title)   
  24.     {  
  25.         this.title = title;   
  26.     }  
  27.     public String getTitle()  
  28.     {  
  29.         return (this.title);   
  30.     }  
  31.     //上传文件对应文件内容的setter和getter方法  
  32.     public void setUpload(File upload)   
  33.     {  
  34.         this.upload = upload;   
  35.     }  
  36.     public File getUpload()   
  37.     {  
  38.         return (this.upload);   
  39.     }  
  40.     //上传文件的文件类型的setter和getter方法  
  41.     public void setUploadContentType(String uploadContentType)   
  42.     {  
  43.         this.uploadContentType = uploadContentType;   
  44.     }  
  45.     public String getUploadContentType()  
  46.     {  
  47.         return (this.uploadContentType);   
  48.     }  
  49.     //上传文件的文件名的setter和getter方法  
  50.     public void setUploadFileName(String uploadFileName)   
  51.     {  
  52.         this.uploadFileName = uploadFileName;   
  53.     }  
  54.     public String getUploadFileName()   
  55.     {  
  56.         return (this.uploadFileName);   
  57.     }     
  58.     @Override 
  59.     public String execute() throws Exception  
  60.     {  
  61.         //以服务器的文件保存地址和原文件名建立上传文件输出流  
  62.         FileOutputStream fos = new FileOutputStream(getSavePath()  
  63.             + "\\" + getUploadFileName());  
  64.         FileInputStream fis = new FileInputStream(getUpload());  
  65.         byte[] buffer = new byte[1024];  
  66.         int len = 0;  
  67.         while ((len = fis.read(buffer)) > 0)  
  68.         {  
  69.             fos.write(buffer , 0 , len);  
  70.         }  
  71.         return SUCCESS;  
  72.     }  
  73. }  

 

上面的Action与普通的Action并没有太大的不同,一样提供了uploadtitle两个属性,这两个属性分别对应前面的两个表单域的name属性,用于封装两个表单域的请求参数。

值得注意的是,上面的Action还包含了两个属性:uploadFileNameuploadContentType(如上粗体字代码所示),这两个属性分别用于封装上传文件的文件名、上传文件的文件类型。这两个属性,体现了Struts 2设计的灵巧、简化之处,Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性无法获取上传文件的文件名和文件类型,所以Struts 2直接将文件域中包含的上传文件名和文件类型的信息封装到uploadFileNameuploadContentType属性中。可以认为:如果表单中包含一个name属性为xxx的文件域,则对应Action需要使用三个属性来封装该文件域的信息。

Ø  类型为Filexxx属性封装了该文件域对应的文件内容。

Ø  类型为StringxxxFileName属性封装了该文件域对应的文件的文件名。

Ø  类型为StringxxxContentType属性封装了该文件域对应的文件的文件类型。

通过上面的3个属性,可以更简单地实现文件上传,所以在execute方法中,可以直接通过调用getXxx()方法来获取上传文件的文件名、文件类型和文件内容。

除此之外,上面的Action中还包含了一个savePath属性,该属性的值通过配置文件来设置,从而允许动态设置该属性的值。

 

 

 

Struts 2Action中的属性,功能非常丰富,除了可以用于封装HTTP请求参数外,也可以封装Action的处理结果。不仅如此,Action的属性还可通过在Struts 2配置文件中进行配置,接收Struts 2框架的注入,允许在配置文件中为该属性动态指定值。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值