配置Struts 2文件上传的Action与配置普通Action并没有太大的不同,一样是指定该Actionname,以及该Action的实现类。当然,还应该为该Action配置元素。与之前的Action配置存在的一个小小区别是,该Action还配置了一个元素,该元素用于为该Action的属性动态分配属性值。

下面是该应用的struts.xml配置文件代码。

程序清单:codes\04\4.3\simpleUpload\WEB-INF\src\struts.xml

   
   
   
   
  1. "1.0" encoding="GBK"?>  
  2.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 
  3.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">     
  4.  
  5.     "struts.custom.i18n.resources" value="mess"/>  
  6.       
  7.     "struts.i18n.encoding" value="GBK"/>  
  8.     <package name="lee" extends="struts-default">  
  9.           
  10.         "uploadPro" class="org.crazyit.app.action.UploadAction">  
  11.               
  12.             "savePath">/upload  
  13.               
  14.             /WEB-INF/content/succ.jsp    
  15.           
  16.         "*">  
  17.             /WEB-INF/content/{1}.jsp     
  18.           
  19.     package>  
  20.  

上面的配置文件除了使用元素设置了uploadActionsavePath属性值外,与前面的Action几乎完全一样——这再次体现了Struts 2的简单设计。

配置了该Web应用后,如果我们在如图4.32所示的页面中输入文件标题,并浏览到需要上传的文件,然后单击“上传”按钮,该上传请求将被UploadAction处理,处理结束后转入succ.jsp页面,该页面使用了简单的Struts 2标签来显示上传的图片。succ.jsp页面的代码如下。

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

   
   
   
   
  1. <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>  
  2. <%@taglib prefix="s" uri="/struts-tags"%>  
  3. "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  4.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  5. "http://www.w3.org/1999/xhtml">  
  6.  
  7.     上传成功  
  8.  
  9.  
  10.     上传成功!
     
  11.     文件标题:" + title"/>
     
  12.     文件为:"'uploadFiles/'   
  13.         + uploadFileName"/>"/>
     
  14.  
  15.  

如果上传成功,将看到如图4.23所示的页面。注意:

上面我们上传时把文件保存到服务器时该文件的文件名依然没有发生改变,这在实际项目中需要改进,因为多个用户并发上传时可能发生文件名相同的情形,因此建议使用java.util.UUID工具类来生成唯一的文件名。

配置文件上传的Action_第1张图片

 

         通过上面的开发过程,不难发现通过Struts 2实现文件上传确实是一件简单的事情。只要我们将文件域与Action中一个类型为File的属性关联,就可以轻松访问到上传文件的文件内容——至于Struts 2使用何种Multipart解析器,对开发者完全透明。

提示:Struts 2实现文件上传的编程关键,就是使用了三个属性来封装文件域,其中一个用于封装该文件的文件名,一个用于封装该文件的文件类型,一个用于封装该文件的文件内容。