隨筆 - 63  文章 - 0  trackbacks - 0
          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          Struts2文件下載功能開發(fā)
          技術(shù)要點
          本節(jié)代碼詳細說明文件下載功能的開發(fā)流程,介紹知識點如下:
          ? 上傳成功頁面重修改后支持文件下載代碼內(nèi)容。
          ? DownloadAction文件下載功能開發(fā)。
          ? struts.xml中DownloadAction配置,以及支持文件名為中文字符的文件下載。
          ? 下載文件流程展示。

          演示代碼
          上傳成功頁面,這里筆者讓其在每個上傳文件后提供“下載”鏈接。
          Java代碼
          1. <!------------------------文件名:result.jsp------------------->   
          2. <%@taglib prefix="s" uri="/struts-tags"%>   
          3.     <body>   
          4.         上傳文件:   
          5.         <table>   
          6.         <!-- 循環(huán)顯示上傳成功文件名 -->   
          7.         <s:iterator value="fileFileName" status="fn">   
          8.         <tr>   
          9.         <td>   
          10.         <!-- 上傳成功文件名 -->   
          11.         <s:property />           
          12.         </td>   
          13.         <td>   
          14.         <!-- 下載文件鏈接內(nèi)容為定義的下載Action -->   
          15.         <!-- 下載文件名作為鏈接參數(shù)fileName值,用OGNL表達式表達 -->     
          16.         <a href="<s:url value='download.action'>                  
          17.                     <s:param name='fileName'  
          18.  value='fileFileName[#fn.getIndex()]'/>     
          19.                  </s:url>">下載</a>   
          20.         </td>   
          21.         </tr>   
          22.         </s:iterator>        
          23.         </table>         
          24.     </body>  

          DownLoadAction類代碼
          Java代碼
          1. <!------------文件名:DownLoadAction.java ------------------>   
          2. import java.io.InputStream;   
          3. import java.io.UnsupportedEncodingException;   
          4.   
          5. import org.apache.struts2.ServletActionContext;   
          6. import com.opensymphony.xwork2.ActionSupport;   
          7.   
          8. public class DownLoadAction extends ActionSupport {   
          9.     //下載文件原始存放路徑   
          10.     private final static String DOWNLOADFILEPATH="/upload/";   
          11.     //文件名參數(shù)變量   
          12.     private String fileName;   
          13.   
          14.     public String getFileName() {   
          15.         return fileName;   
          16.     }   
          17.   
          18.     public void setFileName(String fileName) {   
          19.         this.fileName = fileName;   
          20.     }   
          21.   
          22.     //從下載文件原始存放路徑讀取得到文件輸出流   
          23.     public InputStream getDownloadFile() {   
          24.         return    
          25. ServletActionContext.getServletContext().getResourceAsStream(DOWNLOADFILEPATH+fileName);   
          26.     }   
          27.     //如果下載文件名為中文,進行字符編碼轉(zhuǎn)換   
          28.     public String getDownloadChineseFileName() {   
          29.         String downloadChineseFileName = fileName;   
          30.   
          31.         try {   
          32.             downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1");   
          33.         } catch (UnsupportedEncodingException e) {   
          34.             e.printStackTrace();   
          35.         }   
          36.   
          37.         return downloadChineseFileName;   
          38.     }   
          39.   
          40.     public String execute() {   
          41.         return SUCCESS;   
          42.     }   
          43. }  

          struts.xml配置文件中有關(guān)文件下載的配置:
          Java代碼
          1. <!------------------文件名:struts.xml----------------->   
          2. <struts>   
          3.     <!-- 下載文件的Action定義 -->   
          4.         <action name="download" class="action.DownLoadAction">   
          5.             <!-- 設(shè)置文件名參數(shù),由頁面上傳入 -->   
          6.             <param name="fileName"></param>   
          7.             <result name="success" type="stream">   
          8.                 <!-- 下載文件類型定義 -->   
          9.                 <param name="contentType">text/plain</param>   
          10.                 <!-- 下載文件處理方法 -->   
          11.                 <param name="contentDisposition">   
          12.                     attachment;filename="${downloadChineseFileName}"  
          13.                 </param>   
          14.                 <!-- 下載文件輸出流定義 -->   
          15.                 <param name="inputName">downloadFile</param>   
          16.             </result>   
          17.         </action>   
          18. </struts>   

          (1):文件開始下載頁面如圖4.12所示。

          圖4.12  文件下載
          (2):單擊“下載”鏈接,比如點“下載文件1.txt”文件右邊“下載”鏈接,出現(xiàn)對話框如圖4.13所示。

          圖4.13  下載文件處理方式
          (3):單擊“保存”按鈕后選擇下載文件存放路徑,如圖4.14所示。

          圖4.14  下載文件選擇存放路徑
          代碼解釋
          (1)在result.jsp中通過iterator標簽和url標簽定義了“fileFileName”的循環(huán)顯示以及鏈接。其中有關(guān)“status”和OGNL表達式筆者會在之后章節(jié)里具體介紹,這里只是讓讀者知道是如何使用標簽顯示圖4.12顯示的內(nèi)容。特別指出<param>標簽為downloadAction定義了一個參數(shù),該參數(shù)名為“fileName”,因為在4.4.1小節(jié)中筆者定義的“fileFileName”是個List類型的數(shù)據(jù)集合,因此利用OGNL表達式將文件名作為“fileName”參數(shù)值傳入downloadAction中。
          (2)DownLoadAction文件中先定義了常量DOWNLOADFILEPATH,它是下載文件在服務(wù)器存放的路徑名,也就是4.4.1小節(jié)中上傳文件在服務(wù)器存放的路徑名。
          定義好DOWNLOADFILEPATH后,在定義DownLoadAction的屬性變量。因為在result.jsp中定義了參數(shù)“fileName”,則它作為DownLoadAction的屬性變量,需要定義相應(yīng)的getter、setter方法。
          然后定義了getDownloadFile方法,它返回的是一個文件流,表明將被下載文件轉(zhuǎn)換為輸出流,方便下載。利用Struts2自帶的“ServletActionContext”類的API把下載文件存放路徑作為方法參數(shù),讀取下載文件,將其轉(zhuǎn)換為文件流。
          還有一個getDownloadChineseFileName方法,該方法主要作用是將文件名為中文字符的文件進行文件名的字符編碼集合轉(zhuǎn)換。因為在Web系統(tǒng)中由JSP等視圖頁面?zhèn)魅氲淖兞恐担貏e是中文字符的變量。缺省的字符編碼集合都是“ISO8859-1”,因此利用Java的字符串類的API,將字符編碼轉(zhuǎn)成開發(fā)需要的字符編碼集。防止中文字符亂碼問題發(fā)生。
          (3)struts.xml中定義了名為“download”的Action。其中它自己的參數(shù)“fileName”因為在這里它的值會從JSP頁面上傳入,所以這里只是定義,沒有具體給它賦任何值
          在<result>標簽中定義了type屬性,值為“stream”。如果是下載文件功能開發(fā),DownLoadAction一定要設(shè)置type屬性,而且值為“stream”。這是因為在Struts2自帶的xml配置文件為struts-default.xml中有關(guān)于“stream”的result返回類型的定義,代碼如下:
          Java代碼
          1. <!-------------------文件名:struts-default.xml-------------->   
          2. <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>  

          這里Struts2定義了result返回類型為“stream”,這個result類型主要是處理文件的輸入和輸出流時候需要使用的。因為下載文件就是把文件轉(zhuǎn)換成輸入輸出流,將其從一個文件路徑放到另外一個文件路徑中去。所以肯定要設(shè)置這個result類型的。
          “contentType”、“contentDisposition”、“inputName”都是這個result的屬性。“contentType”就是文件類型。這里因為下載的文件是文本文件,因此設(shè)定的值為文本文件類型,具體各個文件類型如何定義,4.4.1小節(jié)已經(jīng)介紹過,這里不再做說明。“contentDisposition”是指定下載文件處理方式,如圖4.13就是處理方式的效果。特別指出如果“contentDisposition”定義的值把前面的“attachment”去掉,則下載方式不是以附件方式下載,如果單擊“下載”鏈接,則會把下載文件的內(nèi)容顯示在瀏覽器中。讀者可以去試驗一下。這里有個“${downloadChineseFileName}”,這就是在DownLoadAction中定義getDownloadChineseFileName方法的目的,${downloadChineseFileName}是OGNL的表達式,它顯示了“downloadChineseFileName”變量的具體值,因為在DownLoadAction中定義getDownloadChineseFileName方法,則把已經(jīng)轉(zhuǎn)換成符合需要字符編碼集的下載文件名作為下載文件方式對話框中顯示的名稱,不會造成任何亂碼問題。“inputName”是最關(guān)鍵的一個屬性,也是一定要定義的屬性,“inputName”參數(shù)中定義的值“downloadFile”就是DownLoadAction中g(shù)etDownloadFile方法返回的文件流名字。在Struts2中Acion用前綴名為get的方法得到各種屬性的值,這些屬性有些是在Action中定義,有些就像本示例在配置文件中利用OGNL表達式或直接定義。
          (4)開始進行文件下載功能展示,按照如上記述的步驟執(zhí)行即可。筆者將兩個文本文件上傳上去,然后在上傳成功頁面對具體的文件進行下載。在圖4.13中單擊“保存”按鈕就顯示圖4.14,選擇在本機上存放下載文件的路徑即可完成下載文件功能。
          posted on 2009-04-13 15:30 lanxin1020 閱讀(774) 評論(0)  編輯  收藏 所屬分類: struts2
          主站蜘蛛池模板: 新津县| 台北县| 澜沧| 大名县| 尉犁县| 常宁市| 来宾市| 英吉沙县| 梁山县| 专栏| 唐河县| 营山县| 威宁| 陈巴尔虎旗| 睢宁县| 绥棱县| 保德县| 临沧市| 灵川县| 开封市| 资溪县| 辛集市| 巧家县| 舞钢市| 井陉县| 稻城县| 舒兰市| 博湖县| 商都县| 元谋县| 河东区| 龙岩市| 合阳县| 汉沽区| 大名县| 和田县| 合江县| 永城市| 华安县| 连平县| 张家界市|