【原創】Struts1.x系列教程(15):使用DownloadAction類統計檔案下載次數
本文為原創,如需轉載,請註明作者和出處,謝謝!
除了標準的org.apache.struts.action.Action類外,在Struts中還提供了另外7個Action類來完成特殊的工作。本文及後面的文章中將介紹這些Action類的用法。
一、DownloadAction類簡介
可能有時需要在Web程式中加入下載功能。如果要下載的是靜態檔案,可以直接交給Web伺服器處理,但如果要對下載的檔案做額外的功能,如統計檔案的下載次數。就需要在下載檔案之前先要呼叫相應的程式進行處理。
雖然我們可以直接在Action子類中來處理下載檔案,但是如果這樣的程式比較多時,就會寫很多重複的程式碼。為了簡化這個工作。Struts提供了一個新的Action類:DownloadAction。所有繼承了DownloadAction類的Struts動作都可以非常容易地完成下載檔案的工作。
DownloadAction類有一個抽象方法getStreamInfo。這個方法的定義如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> protected abstract StreamInfo getStreamInfo(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception;
getStreamInfo方法返回一個StreamInfo物件。StreamInfo介面是DownloadAction類的一個內部介面,這個介面的定義如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public static interface StreamInfo
{
public abstract String getContentType();
public abstract InputStream getInputStream() throws IOException;
}
從上面的程式碼可以看出,StreamInfo介面有兩個方法。其中getInputStream方法返回了服務端要下載的檔案的InputStream物件。getContenttType方法返回了HTTP響應訊息頭欄位Content-Type的資訊。在getStreamInfo方法中只要返回了實現這兩個方法的StreamInfo物件,就可以自動完成下載工作。
為了方便起見,DownloadAction類中還提供了兩個實現StreamInfo的內類:FileStreamInfo和ResourceStreamInfo。這兩個類的構造方法的定義如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> public FileStreamInfo(String contentType, File file);
public ResourceStreamInfo(String contentType, ServletContext context, String path);
我們可以使用FileStreamInfo類來下載靜態的檔案。如果要下載的檔案在Web根目錄,可以使用ResourceStreamInfo類。其中path參數列示檔案相對於Web根目錄的路徑,必須以“/”開頭,表示從Web根目錄開始。
二、例項:統計檔案的下載次數
在本節中將使用DownloadAction類實現一個統計檔案下載次數的Web程式。這個程式的基本原理是當一個檔案下載完成後,加這個檔案在資料庫中的下載次數加1,如果某個檔案是第一次下載,則在資料庫中新增一條新記錄,下載次數為1。
為了實現這個Web程式,需要如下幾步:
【第1步】建立用於儲存檔案下載次數的資料表
在本例中我們使用名為struts資料庫,並且在struts資料庫中建立一個t_dcount表,程式碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> CREATE TABLE struts.t_dcount(
id INT NOT NULL,
count INT NOT NULL,
filename VARCHAR( 256 ) NOT NULL,
PRIMARY KEY (id)
) ENGINE = InnoDB DEFAULT CHARSET=gbk;
【第2步】編寫Struts動作類
這個Struts動作類負責完成檔案的下載工作。如果在訪問Struts動作類時不加file引數,會將指定目錄下的所有檔案(不包括隱藏檔案)和已經下載的次數傳送到客戶端瀏覽器。如果通過file引數指定了下載檔案,這個Struts動作就會下載這個檔案。
在
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> package chapter6.action;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.actions.*;
import java.io.*;
import java.sql.*;
public class FileDownloadAction extends DownloadAction
{
private Connection conn;
private String path;
private String filename;
// 獲得了Connection物件
private void openConnection() throws Exception
{
if (conn == null)
{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost/struts?characterEncoding=GBK",
"root", "1234");
}
}
// 獲得某個檔案的下載次數,其中id是檔名的hashcode
private int getDownloadCount(int id) throws Exception
{
openConnection();
PreparedStatement pstmt = conn
.prepareStatement("SELECT count FROM t_dcount WHERE id = " + String.valueOf(id));
ResultSet rs = pstmt.executeQuery();
while (rs.next())
{
return rs.getInt(1);
}
return 0;
}
// 在檔案完成下載後,將該檔案的下載次數加1
private void incDownloadCount() throws Exception
{
openConnection();
int id = filename.hashCode();
PreparedStatement pstmt = conn
.prepareStatement("UPDATE t_dcount SET count = count + 1 WHERE id = "
+ String.valueOf(id));
if (pstmt.executeUpdate() == 0)
{
pstmt.executeUpdate("INSERT INTO t_dcount(id, count, filename) values("
+ String.valueOf(id) + ",1,'" + filename + "')");
}
}
// 下載檔案時呼叫getStreamInfo方法
protected StreamInfo getStreamInfo(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception
{
final FileInputStream fis = new FileInputStream(path + filename);
final String contentType = "application/file";
// 建議設定content-disposition響應資訊頭,否則Web瀏覽器在下載檔案時
// 無法在儲存檔案對話方塊中顯示正確的檔名
response.setHeader("content-disposition", "attachment; filename="
+ filename);
incDownloadCount();
return new DownloadAction.StreamInfo() // 使用隱式的方法實現了StreamInfo介面
{
public String getContentType()
{
return contentType;
}
public InputStream getInputStream() throws IOException
{
return fis;
}
};
}
// 如果Struts動作不加file請求引數,則通過execute方法將指定目錄中檔案列表輸出到客戶端
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception
{
path = this.getServlet().getInitParameter("downloadPath");
filename = request.getParameter("file");
if (filename == null)
{
File file = new File(path);
File[] files = file.listFiles();
response.setCharacterEncoding("GBK");
PrintWriter out = response.getWriter();
out.println("
for (File f : files) // 開始向客戶端瀏覽器輸出檔案列表
{
if (f.isFile() && !f.isHidden())
{
out.println("
+ ".do?file=" + f.getName() + "'>" + f.getName()
+ " 下載次數:
+ String.valueOf(getDownloadCount(f.getName().hashCode()))
+ "");
}
}
out.println("");
return null;
}
else
{
// 當file引數存在時,則呼叫DownloadAction中的execute方法
// 實際上,在DownloadAction類中的execute方法呼叫了getStreamInfo方法
// 這條語句就相當於呼叫了getStreamInfo方法
return super.execute(mapping, form, request, response);
}
}
}
【第3步】配置Struts動作類
在struts-config.xml檔案中的
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><action path="/download" scope="request" type="action.FileDownloadAction" />
【第4步】配置下載路徑
在web.xml中找到一個叫action的Servlet,並在
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> <init-param>
<param-name>downloadPathparam-name>
<param-value>D:\download\param-value>
init-param>
讀取可以設定自已的下載目錄,但下載目錄必須以“"”結尾。
啟動Tomcat後,在IE中輸入如下的URL來測試程式:
http://localhost:8080/samples/download.do
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-561422/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【原創】Struts1.x系列教程(8):上傳單個檔案
- 【原創】Struts1.x系列教程(18):使用DispatchAction類呼叫多個Action方法
- 【原創】Struts1.x系列教程(14):動態FormORM
- 【原創】Struts1.x系列教程(6):Bean標籤庫Bean
- PHP+Mysql統計檔案下載次數例項PHPMySql
- 【原創】Struts1.x系列教程(7):Logic標籤庫
- 【原創】Struts1.x系列教程(2):簡單的資料驗證
- 【原創】Struts1.x系列教程(4):標籤庫概述與安裝
- 【原創】Struts1.x系列教程(17):包含和轉入Web資源Web
- SecureCRT上傳下載檔案教程(Zmodem使用教程)Securecrt
- 【原創】Struts1.x系列教程(1)-B:用MyEclipse開發第一個Struts程式Eclipse
- 【原創】Struts1.x系列教程(12):Validator驗證框架的內建標準驗證框架
- mac使用系列之scp下載遠端檔案Mac
- 統計檔案中出現的單詞次數
- centos下對檔案某些特定字串分組統計出現次數CentOS字串
- 下載檔案的15種方法
- 15種下載檔案的方法
- 檔案下載統計php程式設計 (轉)PHP程式設計
- 【Electron Playground 系列】檔案下載篇
- 檔案程式設計、檔案下載程式設計
- Android掃描檔案並統計各類檔案數目Android
- 使用PHP下載檔案PHP
- java 上傳 下載檔案工具類Java
- ADNI的fMRI檔案下載教程
- 【Shell】統計檔案裡面特定字串出現次數字串
- 【原創】ASM下的資料檔案轉換為普通檔案ASM
- 使用readfile()下載檔案
- 【sqlserver】 統計索引使用次數SQLServer索引
- 【原創】使用普通檔案建立ASM例項ASM
- powerDesigner使用教程【原創】
- 統計檔案數目
- PowerShell實現檔案下載(類wget)wget
- 【原創】開源Math.NET基礎數學類庫使用(15)C#計算矩陣行列式C#矩陣
- oracle統計表的所有行數(原創)Oracle
- 使用redis統計ip的使用次數Redis
- Linux下計算字元在檔案裡出現的次數Linux字元
- 如何使用curl命令下載檔案
- 使用 header 頭下載檔案Header