知识大全 使用DownloadAction类统计文件下载次数
Posted 文件
篇首语:上下观古今,起伏千万途。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用DownloadAction类统计文件下载次数相关的知识,希望对你有一定的参考价值。
Struts1.x系列教程(15):使用DownloadAction类统计文件下载次数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
除了标准的 apache struts action Action类外 在Struts中还提供了另外 个Action类来完成特殊的工作 本文及后面的文章中将介绍这些Action类的用法
一 DownloadAction类简介
可能有时需要在Web程序中加入下载功能 如果要下载的是静态文件 可以直接交给Web服务器处理 但如果要对下载的文件做额外的功能 如统计文件的下载次数 就需要在下载文件之前先要调用相应的程序进行处理
虽然我们可以直接在Action子类中来处理下载文件 但是如果这样的程序比较多时 就会写很多重复的代码 为了简化这个工作 Struts提供了一个新的Action类 DownloadAction 所有继承了DownloadAction类的Struts动作都可以非常容易地完成下载文件的工作
DownloadAction类有一个抽象方法getStreamInfo 这个方法的定义如下
protected abstract StreamInfo getStreamInfo(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response) throws Exception;
getStreamInfo方法返回一个StreamInfo对象 StreamInfo接口是DownloadAction类的一个内部接口 这个接口的定义如下
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 这两个类的构造方法的定义如下
public FileStreamInfo(String contentType File file); public ResourceStreamInfo(String contentType ServletContext context String path);
我们可以使用FileStreamInfo类来下载静态的文件 如果要下载的文件在Web根目录 可以使用ResourceStreamInfo类 其中path参数表示文件相对于Web根目录的路径 必须以 / 开头 表示从Web根目录开始
二 实例 统计文件的下载次数
在本节中将使用DownloadAction类实现一个统计文件下载次数的Web程序 这个程序的基本原理是当一个文件下载完成后 加这个文件在数据库中的下载次数加 如果某个文件是第一次下载 则在数据库中添加一条新记录 下载次数为
为了实现这个Web程序 需要如下几步
【第 步】建立用于保存文件下载次数的数据表
在本例中我们使用名为struts数据库 并且在struts数据库中建立一个t_dcount表 代码如下
CREATE TABLE struts t_dcount( id INT NOT NULL count INT NOT NULL filename VARCHAR( ) NOT NULL PRIMARY KEY (id) ) ENGINE = InnoDB DEFAULT CHARSET=gbk;
【第 步】编写Struts动作类
这个Struts动作类负责完成文件的下载工作 如果在访问Struts动作类时不加file参数 会将指定目录下的所有文件(不包括隐藏文件)和已经下载的次数发送到客户端浏览器 如果通过file参数指定了下载文件 这个Struts动作就会下载这个文件
在<samples工程目录>\\src\\action目录中建立一个FileDownloadAction java文件 代码如下
package chapter action; import javax servlet *; import apache struts action *; import 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( mysql jdbc Driver ); conn = DriverManager getConnection( jdbc:mysql://localhost/struts?characterEncoding=GBK root ); // 获得某个文件的下载次数 其中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( ); return ; // 在文件完成下载后 将该文件的下载次数加 private void incDownloadCount() throws Exception openConnection(); int id = filename hashCode(); PreparedStatement pstmt = conn prepareStatement( UPDATE t_dcount SET count = count + WHERE id = + String valueOf(id)); if (pstmt executeUpdate() == ) pstmt executeUpdate( INSERT INTO t_dcount(id count filename) values( + String valueOf(id) + + 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( <ul> ); for (File f : files) // 开始向客户端浏览器输出文件列表 if (f isFile() && !f isHidden()) out println( <li><a + request getContextPath() + mapping getPath()+ do?file= + f getName() + > + f getName() + </a> <font color= blue >下载次数 + String valueOf(getDownloadCount(f getName() hashCode())) + </color></li> ); out println( </ul> ); return null; else // 当file参数存在时 则调用DownloadAction中的execute方法 // 实际上 在DownloadAction类中的execute方法调用了getStreamInfo方法 // 这条语句就相当于调用了getStreamInfo方法 return super execute(mapping form request response);
【第 步】配置Struts动作类
在struts config xml文件中的<action mappings>标签中加入了如下内容
<action path= /download scope= request type= action FileDownloadAction />
【第 步】配置下载路径
在web xml中找到一个叫action的Servlet 并在<servlet>标签中添加如下内容
<init param> <param name>downloadPath</param name> <param value>D:\\download\\</param value></init param>
读取可以设置自已的下载目录 但下载目录必须以 结尾
启动Tomcat后 在IE中输入如下的URL来测试程序
cha138/Article/program/Java/ky/201311/28413相关参考
Excel怎样统计几个工作表中某一人名出现的次数? 以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Ex
知识大全 EXCEL中如何统计一列单元格中同时出现两个数字的次数
EXCEL中如何统计一列单元格中同时出现两个数字的次数? 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
知识大全 EXCEL中两列数据,a列随机出现0和1,b列随机出现甲和乙,如何统计b列中甲行出现0的次数?
EXCEL中两列数据,a列随机出现0和1,b列随机出现甲和乙,如何统计b列中甲行出现0的次数? 以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理
随机误差,单次测量表现为随机性,但随着测量次数的增加,它呈现一定的统计规律,这种规律可用一条正态分布曲线来表示,可归纳为
随机误差,单次测量表现为随机性,但随着测量次数的增加,它呈现一定的统计规律,这种规律可用一条正态分布曲线来表示,可归纳为()A、对称性B、有界性C、多变性D、单峰性参考答案:ABD
随机误差,单次测量表现为随机性,但随着测量次数的增加,它呈现一定的统计规律,这种规律可用一条正态分布曲线来表示,可归纳为
随机误差,单次测量表现为随机性,但随着测量次数的增加,它呈现一定的统计规律,这种规律可用一条正态分布曲线来表示,可归纳为()A、对称性B、有界性C、多变性D、单峰性参考答案:ABD
前段时间在公司做一个文件统计的页面时需要将word文件的页面数量做一个统计但是在程序写好后运行总是报错 检索类工厂中CLSID为AC的组件时失败原因是出现以下错误: 尝试了很久总算发现了问题所
javajspjavascript中如何实现将统计表格保存成excel文件?<SCRIPTLANGUAGE=JavaScript>functionAutomateExcel
统计学属于金融经济类还是财务会计类?定义——统计学统计学是通过搜寻、整理、分析资料等手段,以达到推断所测物件的本质,甚至预测物件未来的一门综合性科学。其中用到了大量的数学及其它学科的专业知识,它的使用
运筹学和统计学哪个适合经管类学习?请说明原因!谢谢!个人认为对管理来说,运筹学更重要,主要是在最优化方面;对经济来说的话,两者都重要的,建议都学。如果拿两者的基础知识部分比较的话,运筹学的稍微难一点,
单元机组的那些考核统计指标,规程要求借助计算机程序自动进行实时统计?
单元机组的那些考核统计指标,规程要求借助计算机程序自动进行实时统计?参考答案:1、模拟量数据采集系统完好率2、模拟量控制系统可用率3、保护系统投入率4、保护系统动作次数