知识大全 使用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>&nbsp;&nbsp;<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怎样统计几个工作表中某一人名出现的次数

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

知识大全 .net出现80080005错误的解决办法

  前段时间在公司做一个文件统计的页面时需要将word文件的页面数量做一个统计但是在程序写好后运行总是报错  检索类工厂中CLSID为AC的组件时失败原因是出现以下错误:  尝试了很久总算发现了问题所

知识大全 如何实现将统计表格保存成excel文件

  javajspjavascript中如何实现将统计表格保存成excel文件?&ltSCRIPTLANGUAGE=JavaScript&gtfunctionAutomateExcel

知识大全 统计学属于金融经济类还是财务会计类?

统计学属于金融经济类还是财务会计类?定义——统计学统计学是通过搜寻、整理、分析资料等手段,以达到推断所测物件的本质,甚至预测物件未来的一门综合性科学。其中用到了大量的数学及其它学科的专业知识,它的使用

知识大全 运筹学和统计学哪个适合经管类学习

运筹学和统计学哪个适合经管类学习?请说明原因!谢谢!个人认为对管理来说,运筹学更重要,主要是在最优化方面;对经济来说的话,两者都重要的,建议都学。如果拿两者的基础知识部分比较的话,运筹学的稍微难一点,

单元机组的那些考核统计指标,规程要求借助计算机程序自动进行实时统计?

单元机组的那些考核统计指标,规程要求借助计算机程序自动进行实时统计?参考答案:1、模拟量数据采集系统完好率2、模拟量控制系统可用率3、保护系统投入率4、保护系统动作次数