论文部分内容阅读
[摘 要]: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年
[关键词]: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年