配置Struts 2檔案上傳的Action與配置普通Action并沒有太大的不同,一樣是指定該Action的name,以及該Action的實作類。當然,還應該為該Action配置<result .../>元素。與之前的Action配置存在的一個小小差別是,該Action還配置了一個<param .../>元素,該元素用于為該Action的屬性動态配置設定屬性值。
下面是該應用的struts.xml配置檔案代碼。
程式清單:codes\04\4.3\simpleUpload\WEB-INF\src\struts.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="mess"/>
<!-- 設定該應用使用的解碼集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<!-- 配置處理檔案上傳的Action -->
<action name="uploadPro" class="org.crazyit.app.action.UploadAction">
<!-- 動态設定Action的屬性值 -->
<param name="savePath">/upload</param>
<!-- 配置Struts 2預設的視圖頁面 -->
<result>/WEB-INF/content/succ.jsp</result>
</action>
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</package>
</struts>
上面的配置檔案除了使用<param .../>元素設定了uploadAction的savePath屬性值外,與前面的Action幾乎完全一樣——這再次展現了Struts 2的簡單設計。
配置了該Web應用後,如果我們在如圖4.32所示的頁面中輸入檔案标題,并浏覽到需要上傳的檔案,然後單擊“上傳”按鈕,該上傳請求将被UploadAction處理,處理結束後轉入succ.jsp頁面,該頁面使用了簡單的Struts 2标簽來顯示上傳的圖檔。succ.jsp頁面的代碼如下。
程式清單:codes\04\4.3\simpleUpload\WEB-INF\content\succ.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@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>上傳成功</title>
</head>
<body>
上傳成功!<br/>
檔案标題:<s:property value=" + title"/><br/>
檔案為:<img src="<s:property value="'uploadFiles/'
+ uploadFileName"/>"/><br/>
</body>
</html>
如果上傳成功,将看到如圖4.23所示的頁面。注意:
上面我們上傳時把檔案儲存到伺服器時該檔案的檔案名依然沒有發生改變,這在實際項目中需要改進,因為多個使用者并發上傳時可能發生檔案名相同的情形,是以建議使用java.util.UUID工具類來生成唯一的檔案名。
<a href="http://blog.51cto.com/attachment/201206/092954953.jpg" target="_blank"></a>
通過上面的開發過程,不難發現通過Struts 2實作檔案上傳确實是一件簡單的事情。隻要我們将檔案域與Action中一個類型為File的屬性關聯,就可以輕松通路到上傳檔案的檔案内容——至于Struts 2使用何種Multipart解析器,對開發者完全透明。
提示:Struts 2實作檔案上傳的程式設計關鍵,就是使用了三個屬性來封裝檔案域,其中一個用于封裝該檔案的檔案名,一個用于封裝該檔案的檔案類型,一個用于封裝該檔案的檔案内容。