浅谈在JSP中实现文件下载以及统计下载次数

来源 :轻音乐 | 被引量 : 0次 | 上传用户:zyr2007
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  [摘 要]:Java不依赖平台的特点使得它受到了广泛的关注,许多和java相关的优秀技术不断出现,JSP(Java Server Page)就是其中之一。我们应用JSP能够开发出动态的、高性能的、安全的跨平台的网站。在网站中实现文件的上传、下载的技术也非常普遍。
  [关键词]:OutoutStream(输出流) InputStream(输入流) JavaBeans response MIME(Multipurpose Internet Mail Extensions,多目的Internet邮件扩展)
  引言
  当今利用JSP语言制做网站的技术备受青睐。因此我们的毕业设计也就选择了应用JSP开发了我们的“软件开发小组辅助交流系统”。我在这里简单地就文件下载以及如何统计下载次数谈论一下自己的想法。
  1 介绍一下Java中的InputStream(输入流)和OutputStream(输出流)
  java.io包提供大流量的流类。Java的I/O流提供一条通道程序,可以使用这条通道把源中的数据传送到目的地。我们把输入流的指向称作源,程序从指向源的输入流中读取源中的数据。而输出流的指向是数据要去的一个目的地,程序通过向输出流中写入数据把信息传送到目的地。请看下面的输入流和输出流工作示意图:
  2 阐述JSP中实现文件下载可以使用的几种方法:
  通过对JSP的学习和在此次毕业设计过程中的经验,我发现在JSP中实现文件的下载可以使用下面的3种办法。
  2.1使用超级链接直接连接到文件的物理地址
  利用这种办法实现对文件的下载很简单,我们可以从数据库中读出每一个文件的相关信息以列表的形式输出到网页上。然后我们可以选择其中的一项信息做成超级链接直接连接到这个文件所在的物理地址。程序代码如下:
  其中(String)rs.getString(“file_name”)是我们要下载的文件的名字。而<%=filename%>就是输出到网页中的一个变量名,这里是文件名。就是它直接超级链接到这个物理文件所在的路径(这里用的是相对路径)。那么当我们点击这个超级链接时便可以对该文件进行下载了。这种办法很简单,但是它存在一些缺陷,通常情况下当我们左键点击该超级链接时就会直接打开该文件,因为我们访问的是远端的服务器上的文件,所以速度特别慢。还有,这种下载文件的方法我们不容易统计下载次数。所以,我们没有采用这种办法做文件下载。
  2.2使用http://www.jspsmart.com网站提供的SmartUpload组件实现文件下载
  这种方法也非常简单,我们只要登陆这个站点下载这个SmartUpload组件,因为我们是利用JSP开发我们的系统,而且这个组件是一个编译好的JavaBeans,所以我们必须把这个组件放在我们建好的web站点下的虚拟目录下的WEB-INF文件夹下的classes文件夹下,然后我们只要用文本编辑器编写以下几行代码就可以轻松实现文件下载。
  <%@ page contentType="text/html;charset=gb2312" import="com.jspsmart.upload.*" %>
  <%
  // 新建一个SmartUpload对象
  SmartUpload su = new SmartUpload();
  // 初始化
  su.initialize(pageContext);
  // 设定contentDisposition为null以禁止浏览器自动打开文件,
  //若不设定,扩展名为doc时,浏览器将自动用word打开它。
  //若不设定,扩展名为pdf时,浏览器将用acrobat打开。
  su.setContentDisposition(null);
  // 下载文件
  su.downloadFile("/upload/被下载的文件.doc");
  %>
  我们利用这个JavaBeans组件可以很轻松地实现文件的上传和下载。
  2.3使用Java中的OutputStream(输出流)对文件进行下载
  JSP内置对象response调用方法getOutputStream()可以获取一个指向客户的输出流,服务器将文件写入这个流,客户端就可以下载这个文件了。当JSP页面提供下载功能时,应当使用response对象向客户端发送HTTP头信息,说明文件的MIME(Multipurpose Internet Mail Extensions,多目的Internet邮件扩展)类型,这样客户端的浏览器就会调用相应的外部程序打开下载的文件。例如,Ms-Word文件的MIME类型是application/msword, pdf文件的MIME类型是application/pdf。还有几点特别要注意的是,执行下载的页面,在JSP代码范围之外(即<% ... %>之外),不能包含任何HTML代码、空格、回车或换行等字符,如果有的话将不能正确下载。因为它影响了返回给浏览器的数据流,导致解析出错。我在一开始编写下载这部分代码时,就出现了这种错误。当我在浏览器里打开这个JSP页就提示有这种OutputStream错误,后来我还是通过上网查找资料找到了问题的症结所在,我把所有的HTML代码都删除,最后问题终于解决了。
  例如下面的程序(loadfiles.jsp)就是用这种办法实现文件下载的。
  <%@ page contentType="text/html;charset=gb2312" %>
  <%@ page import="java.io.*"%>   <%@ page import="java.sql.*"%>
  
  <%
  /****** 特别注意:本程序之前不能有任何空格或换行符!! 整个JSP中不能使用任何html标记!! ******/
  String name="";
  int newloadtimes=0;
  String id=request.getParameter("fname");
  String sql1="select file_name,load_times from file where file_name='"+id+"'";
  ResultSet rs=conn.executeQuery(sql1);
  if(rs.next())
  {
  name=rs.getString("file_name");
  newloadtimes = Integer.parseInt(rs.getString("load_times"))+1;
  }
  //修改下载次数
  out.print(id);
  String sql2="update file set load_times="+newloadtimes+" where file_name='"+id+"'";
  conn.executeUpdate(sql2);
  OutputStream o = response.getOutputStream();
  Byte[] temp = name.getBytes("ISO-8859-1");
  name = new String(temp,"utf-8");
  String filedir="E:/system/FILES/";
  //提示客户端保存还是打开文件的对话框如果取消下面这一句代码客户端浏览器将调用相应的外部程序,在当前位置直接打开文件
  response.setHeader("Content-Disposition", "attachment;filename=" + new String(name.getBytes(),"ISO-8859-1"));
  response.setContentType("text/html;charset=utf-8");
  FileInputStream in = new FileInputStream(filedir+name);
  int bytesRead;
  //输出文件用的字节数组,每次发送4k字节到输出流
  Byte[] buf = new byte[4 * 1024];
  while ( (bytesRead = in.read(buf))!= -1)
  {
  o.write(buf, 0, bytesRead);
  }
  in.close();
  o.close();
  %>
  我在此次毕业设计中就是应用这种方法实现文件下载的。我个人认为这种方法较前两种方法比较合适。通过对这种方法的学习和应用,我理解了Java中InputStream(输入流)和OutputStream(输出流)这两个类以及InputStream从源中读取数据的方法和OutputStream向输出流写入数据的方法。
  3 实现统计文件的下载次数
  我们为了知道用户对哪些文件感兴趣,用户经常频繁地下载哪些文件,因此我们要统计文件的下载次数,这样我们就可以了解用户的需求,以便可以更好地为用户服务。例如上面的代码不但实现了文件的下载,而且还可以统计文件被下载的次数。上面的程序(loadfiles.jsp)里的以下几行代码就实现了统计文件下载的次数。
  String name="";//下载的文件的名字
  int newloadtimes=0;//文件下载次数,初值为0
  String id=request.getParameter("fname");//上一页传过来的值(文件名)
  //下面的SQL语句提取出下载的文件的文件名以及下载次数
  String sql1="select file_name,load_times from file where file_name='"+id+"'";
  ResultSet rs=conn.executeQuery(sql1);//执行查询
  if(rs.next())
  {
  name=rs.getString("file_name");
  newloadtimes = Integer.parseInt(rs.getString("load_times"))+1;//把下载次数加1
  }
  //修改下载次数
  out.print(id);//输出上一页传过来的文件名,进行测试
  String sql2="update file set load_times="+newloadtimes+" where file_name='"+id+"'";
  //更新表把新的下载次数写入数据表
  conn.executeUpdate(sql2);//执行更新
  4总结
  通过此次毕业设计的锻炼,我掌握了怎样实现文件的下载和如何统计下载次数的方法,同时我还学到了很多JSP的其它知识,基本上掌握了利用JSP开发网站的编程思想。领会到了JSP中最核心的内容之一--JavaBeans的优点。JavaBeans可以实现代码的重复利用;易编写、易维护、易使用;能够运行在任何已经安装了Java的平台,而且不用重新编译。例如我们开发这个“辅助交流系统”时访问数据库的各项操作就做成了一个JavaBeans。应用起来非常方便。
  致谢:在此次毕业设计过程中和毕业论文的写作过程中,马季骕和苏贵斌老师给予了精心的指导并且提出了宝贵的意见,为我提供了极大的帮助,在这里向二位老师表示衷心的感谢!
  参考文献:
  [1]耿祥义、张跃平.《JSP使用教程》清华大学出版社2003年
  [2]孙一林、彭波.《Java数据库编程实例》清华大学出版社2003年
  [3]林邦杰《JSP交互网站实务精典》北京中国青年出版社2001年
其他文献
[摘 要]:现代社会是一个信息为王的时代,对于信息的获取、筛选、鉴别、加工及处理,成为人们能力的进一步延伸,科学掌握,受益终身。  [关键词]:信息技术 教学 浅谈 优化  学校是信息技术教育的主阵地,特别是中小学校阶段,由于这一阶段学生仍处在信息技术的启蒙及成长阶段。因此,如何加快这一群体信息技术教育的普及率,实现信息技术教育的提升,就成为了教育信息技术化实现的关键环节。任务驱动是一种基于构建主
期刊
[摘 要]:随着素质教育的不断深入,羽毛球作为一门选修课,受到了学生们的广泛喜爱。其相应的教学方法与形式是多种多样的。但是,在实际教学过程中,还存在着一些问题,影响了学生的学习热情与兴趣。我们一定要予以高度的重视,解决相关的问题,促进羽毛球教学质量与效率的提高。本文主要对在羽毛球教学中存在的问题进行分析,进而提出有效的解决建议。  [关键词]:羽毛球教学 问题 建议  羽毛球是一项非常有魅力的体育
期刊
[摘 要]:随着时代的发展和科技的进步,计算机科学已经越来越普及,计算机技术也被应用的越来越广泛。小学教育又处于启蒙教育阶段,对学生以后的发展有着至关重要的作用。种种情况都已经说明在小学阶段开设计算机课是很有必要的。然而对于如何具体实施教学工作一直都在不停的讨论和改革之中。本文就试从小学计算机教学的意义以及对策两个角度来探讨小学计算机教学工作中的具体策略。  [关键词]:小学计算机 教学 意义 对
期刊
[摘 要]:随着信息技术在各领域的渗透,计算机已成为人们在工作和学习中必不可少的工具,在这样的时代背景下,加强学生的信息技术素质成为当前教育的一大重任。本文从新时代初中信息技术教育的重要性出发,结合初中信息技术课程的教学原则,阐述了信息技术课的教学方法。  [关键词]:新时代 初中 信息技术教育  一、初中信息技术教育的重要性  为了适应时代发展的要求,现在我国很多中学都以开设信息技术课程取代了传
期刊
[摘 要]:初中思想品德课的内容来源于生活,同时高于生活,最终应回归生活。本文简要论述了思想品德课创建生活化教学模式的方法和心得,主要从捕捉生活化素材、创设生活化情境、增辟生活化活动等三个方面进行简述。目的在于进一步提高课程质量,帮助学生完善自身发展。  [关键词]:生活 初中 思想品德课 迸发生机  著名教育家陶行知先生曾提出“生活教育”的观点:生活就是教育,社会就是学校,教与学应做到统一。从中
期刊
[摘 要]:本文从要掌握教育规律、树立起班主任的威信,建立科学的班级管理目标,科学组建、管理班委会,发挥其能动作用,分工要明确、责任要到人,师生间要建立情感纽带等四个方面探讨了班级科学管理的艺术。  [关键词]:班级科学管理 艺术  班级是学校的细胞,它既是学校实施素质教育的基本单位,也是学生学习活动的基层集体,班不好带,管理学生难,已成为眼下许多教师的普遍的心声,究其根源,一方面,由于信息载体的
期刊
[摘 要]:经济技术的发展带来了社会的全面发展,就体育运动而言,体育项目朝着多样化的方向发展,体育运动员的综合体能不断提升,其体能训练也有了新的要求和发展。皮划艇是我国体育运动的一个重要项目,它对于运动员的体能有着较高的要求,因此,皮划艇运动员体能锻炼也变成了我们谈及皮划艇这一项目时所要关注的要点之一。本文从皮划艇项目对于运动员的体能要求出发,分析皮划艇运动员体能训练的特点及其在日常训练中所应注意
期刊
[摘 要]:在新课标的改革下,大多数学校加强了初中语文情境化教学的措施,情景化教学激发学生的学习兴趣,提高学生的想象力和创造力,促进学生在语文教学中的情感体验及审美意识。本文主要浅谈情景化教学在初中语文教学中的作用。  [关键词]:新课标 初中语文教学 情境化 情感体验  初中语文新课标着重在阅读学习方面提出了新的要求,鉴赏文学作品,领悟文学的内涵,有自己的情感体会,从而启发对自然、人生、社会的认
期刊
[摘 要]:民间游戏是深受儿童喜爱的游戏形式,它不仅具有很强的趣味性,同时它也十分灵活并且易于开展。儿童在民间游戏中通常会扮演着不同的角色,而这些角色后儿童对于民间游戏的兴趣也在不断发生着转变,本文将具体谈谈民间游戏中儿童角色视角的转化与实践。首先会简要介绍民间游戏,然后会分析儿童角色在民间游戏中扮演的重要性,最后会对儿童角色视角下兴趣的层次变化展开探讨。  [关键词]:民间游戏 儿童 角色 转化
期刊
[摘 要]:幼儿园班级,是幼儿园进行保教活动的基本单位,班级在管理中的作用直接关系着幼儿的成长,因此幼儿园班级的管理十分重要。班主任是幼儿园管理的重要人物,因此班主任的基本素质、教育理念以及对班级管理的专业水平直接的关系着儿童们的发展,同样直接关系着教育的质量。  [关键词]:幼儿园 班主任 基本素质  在教育系统中,班主任是热爱教育事业的核心人物,在幼儿教育事业中,班主任应该有着很强的责任心,在
期刊