web bjsp19周五-课件第10章_第1页
web bjsp19周五-课件第10章_第2页
web bjsp19周五-课件第10章_第3页
web bjsp19周五-课件第10章_第4页
web bjsp19周五-课件第10章_第5页
免费预览已结束,剩余104页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

10.1File类10.2基本输入/输出流类10.3字节文件输入/输出流的读/写10.4字符文件输入/输出流的读/写10.5文件的随机输入/输出流的读/写10.6文件的上传和下载习题10第10章JSP中的文件操作

在计算机系统中,需要长期保留的数据是以文件的形式存放在磁盘、磁带等外部存储设备中的。程序运行时常常要从文件中读取数据,同时也要把需要长期保留的数据写入文件中。所以,文件操作是计算机程序中不可缺少的一部分。而目录是管理文件的特殊机制,同类文件保存在同一目录下可以简化文件的管理,提高工作效率。

Java语言的java.io包中的File类是专门用来管理磁盘文件和目录的。每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息,例如文件或目录的名称、文件的长度、目录中所含文件的个数等。调用File类的方法则可以完成对文件或目录的日常管理工作,例如创建文件或目录、删除文件或目录、查看文件的有关信息等。10.1File类

java.io.File类的父类是java.lang.Object。用于创建File类对象的构造方法有三个,它们分别是:

publicFile(Stringpath); //使用指定路径构造一个File对象

publicFile(Stringpath,Stringname); //使用指定路径和字符串构造一个File对象

publicFile(Filedir,Stringname,); //使用指定文件目录和字符串构造一个File对象10.1.1获取文件属性的成员方法

使用File类提供的成员方法可以获得文件本身的一些信息。

File类的常用成员方法如表10.1所示。

表10.1File类的常用成员方法续表10.1.2应用举例

1.获取文件的属性

【示例程序c10_1.jsp】获取文件的文件名、长度、大小等特性。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<%@pageimport="java.util.*"%>

<HTML><HEAD><TITLE>获取文件的属性</TITLE></HEAD>

<BODY>

获取文件的属性

<%

StringPath="F:\\xiti\\ch3\\WebContent";

Filef=newFile(Path,"c3_1.jsp");

out.println("<BR>"+"路径:"+f.getParent());

out.println("<BR>"+"文件名:"+f.getName());

out.println("<BR>"+"绝对路径:"+f.getAbsolutePath());

out.println("<BR>"+"文件大小:"+f.length());

out.println("<BR>"+"是否为文件:"+(f.isFile()?"是":"否"));

out.println("<BR>"+"是否为目录:"+(f.isDirectory()?"是":"否"));

out.println("<BR>"+"是否为隐藏:"+(f.isHidden()?"是":"否"));

out.println("<BR>"+"是否可读取:"+(f.canRead()?"是":"否"));

out.println("<BR>"+"是否可写入:"+(f.canWrite()?"是":"否"));

out.println("<BR>"+"最后修改时间:"+newDate(f.lastModified()));

%>

</BODY>

</HTML>

该JSP程序的运行结果如图10.1所示。

图10.1c10_1.jsp的运行结果

2.创建目录

【示例程序c10_2.jsp】在ch10目录下创建一个名为abc的目录。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<HTML>

<HEAD><TITLE>创建目录</TITLE></HEAD>

<BODY>

创建目录

<%

图10.2c10_2.jsp的运行结果

StringPath=“F:\\xiti\\ch10\\WebContent”;

Filedir=newFile(Path,“abc”);

dir.mkdir();

out.println(“<BR>”+“目录名:"+dir.getName();)

out.println("<BR>"+"是否为目录:"+(dir.isDirectory()?"是":"否"));

%>

</BODY></HTML>

该JSP程序的运行结果如图10.2所示。

3.删除目录和文件

【示例程序c10_3.jsp】将ch10目录下的abc目录及t.txt文件删除。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<HTML>

<HEAD><TITLE>删除文件和目录</TITLE></HEAD>

<BODY>

删除文件和目录

<%

StringPath="F:\\xiti\\ch10\\WebContent";

Filedir=newFile(Path,"abc");

Filef=newFile(Path,"t.txt");

dir.delete();//删除abc目录

out.println("<BR>"+"abc目录已被删除");

f.delete();//删除t.txt文件

out.println("<BR>"+"文件t.txt已被删除");

%>

</BODY>

</HTML>

该JSP程序的运行结果如图10.3所示。

图10.3c10_3.jsp的运行结果

当服务器需要将客户提交的信息保存到文件或根据客户的要求将服务器的文件内容显示到客户端时,JSP就通过Java的输入/输出流来实现文件的读/写操作。在Java语言中,输入/输出操作是使用流来实现的。流(stream)是指数据在计算机各部件之间的流动,它包括输入流与输出流。10.2基本输入/输出流类输入流(InputStream)表示从外部设备(键盘、鼠标、文件等)到计算机的数据流动;输出流(OutputStream)表示从计算机到外部设备(显示器、打印机、磁盘文件等)的数据流动。Java的输入/输出类库java.io包提供了若干输入流和输出流类。利用输入流类可以建立输入流对象,利用输入流类提供的成员方法可以从输入设备上将数据读入到程序中;利用输出流类可以建立输出流对象,利用输出流类提供的成员方法可以将程序中产生的数据写到输出设备上。流是数据的有序序列,它既可以是未加工的原始二进制数据,也可以是经过一定编码处理后的符合某种规定格式的特定数据,如字节流序列、字符流序列等。数据的性质、格式不同,则对流的处理方法也不同,因此,Java的输入/输出类库中有不同的流类来对应不同性质的输入/输出流。在java.io包中基本输入/输出流类可按读/写数据的不同类型分为两种:字节流和字符流。

字节流用于读/写字节类型的数据(包括ASCII表中的字符)。字节流类可分为表示输入流的InputStream类及其子类和表示输出流的OutputStream类及其子类。

字符流用于读/写Unicode字符。它包括表示输入流的Reader类及其子类和表示输出流的Writer类及其子类。10.2.1InputStream类

InputStream类是用于读取字节型数据的输入流类,该类的继承结构如下:

java.lang.Object

java.io.InputStream

java.io.FileInputStream

java.io.FilterInputStream

java.io.DataInputStream

java.io.BufferedInputStream

…10.2.2OutputStream类

OutputStream类是用于输出字节型数据的输出流类,该类的继承结构如下:

java.lang.Object

java.io.OutputStream

java.io.FileOutputStream

java.io.FilterOutputStream

java.io.PrintStream

java.io.DataOutputStream

java.io.BufferedOutputStream10.2.3Reade类

Reader类是用于读Unicode字符的字符流类,该类的继承结构如下:

java.lang.Object

java.io.Reader

java.io.InputStreamReader

java.io.FileReader

java.io.BufferedReader

java.io.LineNumberReader

…10.2.4Writer类

Writer类是用于读Unicode字符的字符流类,该类的继承结构如下:

java.lang.Object

java.io.Writer

java.io.OutputStreamWriter

java.io.FileWriter

java.io.BufferedWriter

10.3.1FileInputStream类和FileOutputStream类

在网页中,经常会用到文件的读/写操作。例如,从已经存在的数据文件中读入数据,或者将程序中产生的大量数据写入磁盘文件中。这时就需要使用文件输入/输出流类。Java系统提供的FileInputStream类是用于读取文件中的字节数据的字节文件输入流类;FileOutputStream类是用于向文件写入字节数据的字节文件输出流类。表10.2列出了FileInputStream类和FileOutputStream类的构造方法,表10.3列出了这两个类的常用成员方法。10.3字节文件输入/输出流的读/写

表10.2FileInputStream类和FileOutputStream类的构造方法表10.3FileInputStream类和FileOutputStream类的常用成员方法10.3.2字节文件的读/写

利用字节文件输入/输出流完成磁盘文件的读/写,首先要利用文件名字符串或File对象创建输入/输出流对象,其次是从文件输入/输出流中读/写数据。从文件输入/输出流中读/写数据有以下两种方式。

1.用文件输入/输出类自身的读/写功能完成文件的读/写操作

FileInputStream类和FileOutputStream类自身的读/写功能是直接从父类InputStream和OutputStream那里继承来的,并未做任何功能的扩充。如表10.3中的read(

)、write(

)等方法,都只能完成以字节为单位的原始二进制数据的读/写。

【示例程序c10_4.jsp】直接利用FileInputStream类和FileOutputStream类完成从数组中读入数据并写入文件中,再从写入的文件中读出数据,输出到显示器上。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<HTML><HEAD><TITLE>字节流读写文件</TITLE></HEAD>

<BODY>

<H3>字节流读写文件</H3><HR>

<%

byteb[]="将此字符串输入temp目录的d1.txt到文件中<BR>thisisaString".getBytes();

FilefilePath=newFile(“F:/xiti/ch10/WebContent/temp”); //在当前目录下建目录,也可用绝对

//目录

if(!filePath.exists())filePath.mkdir(); //若目录不存在,则建立

Filefl=newFile(filePath,"d1.txt"); //在指定目录下建文件类对象d1.txt

try{

FileOutputStreamfout=newFileOutputStream(fl);

fout.write(b);//将字符串写入d1.txt

fout.close();

out.println("<BR>"+"\n打印从磁盘读入的数据"+"<BR>");

FileInputStreamfin=newFileInputStream(fl);

intn=0;

bytec[]=newbyte[80];

while((n=fin.read(c))!=-1)//磁盘文件读入程序

{Stringstr=newString(c,0,n);

out.print(str);

}

fin.close();

}//try结束

catch(IOExceptione)

{out.println("<BR>"+"IOException");}

%>

</BODY></HTML>

该示例程序的运行结果如图10.4所示。

图10.4c10_4.jsp的运行结果

2.配合其它功能较强的输入/输出流完成文件的读/写操作

为了提高读/写的效率及读/写功能,以FileInputStream和FileOutputStream为数据源,完成与磁盘文件的映射连接后,再创建其它流类的对象,如DataInputStream类和DataOutputStream类,或BufferedInputStream类和BufferedOutputStream类,这样就可以配合其它功能较强的输入/输出流完成文件的读/写操作。其使用方式如下。

(1)字节读文件操作。

Filef1=newFile("TextFile1");

DataInputStreamdin=newDataInputStream(newFileInputStream(f1));

BufferedInputStreambin=newBufferedInputStream(newFileInputStream(f1));

(2)字节写文件操作。

Filef2=newFile("TextFile2");

DataOutputStreamdout=newDataOutputStream(newFileOutputStream(f2));

BufferedOutputStreambout=newBufferedOutputStream(newFileOutputStream(f2));

DataInputStream类提供的常用成员方法如表10.4所示。

表10.4DataInputStream类的常用成员方法续表

DataOutputStream类提供的常用成员方法如表10.5所示。

表10.5DataOutputStream类的常用成员方法【示例程序c10_5.jsp】用FileInputStream和FileOutputStream类输入/输出流,再套接上DataInputStream类和DataOutputStream类输入/输出流完成文件的读/写操作。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<HTML>

<HEAD><TITLE>字节流读写文件</TITLE></HEAD>

<BODY>

<H3>字节流读写文件</H3><HR><%

booleanlo=true;shortsi=-32768;

inti=65534;longl=134567;

floatf=(float)1.4567;doubled=3.;

Stringstr1="ABCD";Stringstr2="Java语言教学";

FilefilePath=newFile("F:/xiti/ch10/WebContent");

Filefl=newFile(filePath,"t1.txt");//在指定目录下建文件类对象

try{

FileOutputStreamfout=newFileOutputStream(fl);

DataOutputStreamdataout=newDataOutputStream(fout);//文件输出流对象为参数

dataout.writeBoolean(lo);dataout.writeShort(si);dataout.writeByte(i);

dataout.writeInt(i);dataout.writeLong(l);dataout.writeFloat(f);

dataout.writeDouble(d);dataout.writeBytes(str1);dataout.writeUTF(str2);

dataout.close();

out.println("<BR>"+"\n打印从磁盘读入的数据"+"<BR>");

FileInputStreamfin=newFileInputStream(fl);

DataInputStreamin=newDataInputStream(fin);

out.println("<BR>"+"Blooeanlo="+in.readBoolean());

out.println("<BR>"+"Shortsi="+in.readShort());

out.println("<BR>"+"Bytei="+in.readByte());

out.println("<BR>"+"Inti="+in.readInt());

out.println("<BR>"+"Longl="+in.readLong());

out.println("<BR>"+"Floatf="+in.readFloat());

out.println("<BR>"+"Doubled="+in.readDouble());

byteb[]=newbyte[4];

in.readFully(b);

System.out.print("str1=");

for(intj=0;j<4;j++)System.out.print((char)b[j]);

out.println();

out.println("<BR>"+"str2="+in.readUTF());

fin.close();

}//try结束

catch(IOExceptione){out.println("<BR>"+"IOException");}

%>

</BODY></HTML>

该示例程序的运行结果如图10.5所示。

图10.5c10_5.jsp的运行结果

10.4.1FileReader类和FileWriter类

FileReader类和FileWriter类用于读取文件和向文件写入字符数据。表10.6列出了FileReader类和FileWriter类的构造方法。FileReader类和Filewriter类的常用成员方法是直接从父类Reader类和Writer类继承的,请参阅表10.7和表10.8。10.4字符文件输入/输出流的读/写

表10.6FileReader类和FileWriter类的构造方法表10.7Reader类的常用成员方法表10.8Writer类的常用成员方法10.4.2字符文件的读/写

利用字符文件输入/输出流完成磁盘文件的读/写,首先要利用文件名字符串或File对象创建输入/输出流对象,其次是从文件输入/输出流中读/写数据。

FileReader类是Reader派生的对象,该类的所有成员方法都从Reader类继承,FileWriter类是Writer派生的对象,该类的所有成员方法都从Writer类继承,因此,字符文件的读/写方法是由Reader和Writer类提供的成员方法来完成。为了提高读/写的效率及读/写功能,使用FileReader类输入流套接BufferedReader类缓冲区输入流、FileWriter类输出流套接BufferedWriter类缓冲区输出流的策略,可以加快复制文件的速度。其使用方式如下。

(1)字节读文件操作。

Filef1=newFile("TextFile1");

BufferedReaderbin=newBufferedReader(newFileReader(f1));

(2)字节写文件操作。

Filef2=newFile("TextFile2");

BufferedWriterbout=newBufferedWriter(newFileWriter(f2));下面通过例子来说明其应用。

【示例程序c10_6.jsp】将data1.txt复制到data2.txt文件中。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<HTML><HEAD><TITLE>字符文件的复制</TITLE></HEAD>

<BODY>

<H3>字符文件读写</H3><HR>

<%

FilefilePath=newFile("F:/xiti/ch10/WebContent");

FilesourceFile=newFile(filePath,"data1.txt"); //在指定目录下建文件类对象

FiletargetFile=newFile(filePath,"data2.txt"); //在指定目录下建文件类对象

Stringtemp;

try

{

BufferedReadersource=newBufferedReader(newFileReader(sourceFile));

BufferedWritertarget=newBufferedWriter(newFileWriter(targetFile));

while((temp=source.readLine())!=null)

{target.write(temp);

target.newLine();

target.flush();

}

out.println("<BR>"+"复制文件完成!!!");

source.close();

target.close();

}

catch(IOExceptionE){out.println("<BR>"+"I/O错误!");}

%>

</BODY></HTML>

该示例程序的运行结果如图10.6所示。

图10.6c10_6.jsp的运行结果

前面介绍的文件存取方式属于顺序存取,即只能从文件的起始位置向后顺序读/写。java.io包提供的RandomAccessFile类是随机文件访问类,该类的对象可以引用与文件位置指针有关的成员方法,读/写任意位置的数据,实现对文件的随机读/写操作。文件的随机存取要比顺序存取更加灵活。10.5文件的随机输入/输出流的读/写10.5.1RandomAccessFile类

java.io.RandomAccessFile类的构造方法有两个:

(1)

RandomAccessFile(Stringname,Stringmode)。使用指定的字符串和模式参数创建一个RandomAccessFile类对象。

(2)

RandomAccessFile(Filef,Stringmode)。使用指定的文件对象和模式参数创建一个RandomAccessFile类对象。在RandomAccessFile类的构造方法中,除了指定文件的路径外,还必须指定文件的存取模式。存取模式有读模式和读/写模式两种:“r”代表以只读方式打开文件;“rw”代表以读/写方式打开文件,这时用一个对象就可以同时实现读/写两种操作。需要注意的是,创建RandomAccessFile对象时,可能产生两种异常:当指定的文件不存在时,系统将抛出FileNotFoundException异常;若试图用读/写方式打开具有只读属性的文件或出现了其它输入/输出错误时,则会抛出IOException异常。10.5.2RandomAccessFile类中的常用成员方法

RandomAccessFile类中的常用成员方法见表10.9。

表10.9RandomAccessFile类中的常用成员方法续表续表10.5.3文件位置指针的操作

RandomAccessFile类的对象可以引用与文件位置指针有关的各种成员方法,在任意位置实现数据读/写。RandomAccessFile类对象的文件位置指针遵循以下规律。

(1)新建RandomAccessFile类对象时,文件位置指针位于文件的开头处。

(2)每次读/写操作之后,文件位置指针都后移相应个读/写的字节数。

(3)利用seek()方法可以移动文件位置指针到一个新的位置。

(4)利用getPointer()方法可获得本文件当前的文件指针位置。

(5)利用length()方法可得到文件的字节长度,利用getPointer()方法和length()方法可以判断读取的文件是否到文件尾部。下面通过实现网上提交作业的例子来说明其应用方法。

下面的例子中,首先显示一个如图10.7所示的网上交作业的JSP页面,在这个页面上学生们提交学号、名字和作业,然后单击“确定”按钮。提交后,JSP页面访问Servlet,Servlet将学生的作业送入文本文件(zuoye.txt),并且再从文件中读出该学生提交的内容显示到页面中。

图10.7jiaoZuoYe.jsp的运行结果

【示例程序jiaoZuoYe.jsp】网上提交作业的JSP页面。

<%@pagecontentType="text/html;charset=GBK"%>

<HTML><HEAD><TITLE>交作业</TITLE></HEAD>

<BODY>

<CENTER>交Java程序作业</CENTER><HR>

<FORMMETHOD="post"ACTION="ZuoYe_Servlet">

<P>学号:<INPUTTYPE="no"NAME="myNo"></P>

<P>姓名:<INPUTTYPE="name"NAME="myName"SIZE=25></P>

<P><TEXTAREAname="zuoye"ROWS="12"COLS="80"WRAP="physical"></TEXTAREA></P>

<P><INPUTTYPE="submit"VALUE="确定">

<INPUTTYPE="reset"value="清除"></P>

</FORM>

</BODY>

</HTML>

【示例程序ZuoYe_Servlet.java】这个Servlet从JSP页面读取学生提交的作业数据,将这些数据写入文本文件(zuoye.txt)。然后,再从文件中读出该学生提交的内容显示到页面中。

importjava.io.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassZuoYe_ServletextendsHttpServlet

{

//响应POST请求

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException

{

longfp;

Strings1,s2,s3;

response.setContentType(“text/html;charset=GB2312”); //设置响应的MIME类型

PrintWriterout=response.getWriter(); //获得向客户发送数据的输出流

out.println("<HTML><BODY>");

Stringuse="yes"; byteno[]=(request.getParameter("myNo")).getBytes("ISO-8859-1");

bytename[]=request.getParameter("myName").getBytes("ISO-8859-1");

bytecontent[]=request.getParameter("zuoye").getBytes("ISO-8859-1");

Filefl=newFile("F:/xiti/ch10/WebContent","zuoye.

txt");

//文件的操作放入同步块中,通知其他用户

if(use.startsWith("yes"))

{synchronized(fl)

{use="mang";

try{

RandomAccessFilefrw=newRandomAccessFile(fl,"rw");

fp=frw.length();

frw.seek(fp); //定位到文件尾

frw.write(no); //将字符串写入zuoye.txt

frw.write(name);

frw.write(content);

frw.seek(0); //文件指针定位到文件尾

frw.seek(fp); //文件指针定位到fp处

frw.read(no);

s1=newString(no);

frw.read(name);

s2=newString(name);

frw.read(content);

s3=newString(content);

frw.close();

use="yes";

out.println("已交的作业是:<P>"+s1+"<BR>"+s2+"<BR>"+s3+"<P>");

}//try结束

catch(IOExceptione){out.println("交作业失败<BR>");}

}

}

else

out.println("作业在交,请等待<BR>");

out.println("</BODY></HTML>");

}

//处理GET请求

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException

{doPost(request,response); }

}

该示例程序的运行结果如图10.8所示。

图10.8ZuoYe_Servlet.java的运行结果

在进行Web开发时,很多时候都离不开与用户的文件交流。例如,把软件上传到下载网站中,或者从某个网站下载文件。本节介绍基于JSP+Servlet技术的文件上传和下载程序的开发。

10.6.1文件上传

基于JSP+Servlet技术的文件上传程序由两个程序文件组成:一个是供用户选择上传文件的JSP界面程序,另一个是实施文件上传功能的Servlet程序。10.6文件的上传和下载

1.客户端上传文件给服务器的JSP程序SelectFile.jsp

<%@pagecontentType="text/html;charset=GBK"%>

<HTML>

<HEAD><TITLE>fileupload</TITLE></HEAD>

<BODY>

<CENTER><H1><B>文件上传</B></H1></CENTER><BR>

<FORMname="selectfile"enctype="multipart/form-data"method="post"action="Upload">

<P>文件名称:

<INPUTtype="file"name="ulfile"size="20"maxlength="80">

</P><P>

<INPUTtype="submit"value="上传"><INPUTtype="reset"value="清除"></P>

</FORM>

</BODY></HTML>

说明:利用JSP页面上传文件给Servlet时,必须在该JSP页面的<FORM>标记中将“enctype”属性的值设成“multipart/form-data”;其次,表单中必须含有type=file类型的<INPUT>标记。

2.将文件上传的Servlet程序Upload.java

importjava.io.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassUploadextendsHttpServlet

{

//响应POST请求

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException

{

response.setContentType("text/html;charset=GB2312"); //设置响应的MIME类型

PrintWriterout=response.getWriter(); //获得向客户发送数据的输出流

try{

InputStreamsource=request.getInputStream(); //获得客户上传的输入流

//将上传的文件存入F:/xiti/ch10/WebContent/text2.txt中

StringPh="F:/xiti/ch10/WebContent";

Filef=newFile(Ph,"text2.txt"); //创建text2.txt文件

FileOutputStreamtarget=newFileOutputStream(f);

bytebuff[]=newbyte[1024];

inttemp;

while((temp=source.read(buff))!=-1)//读输入流的信息存放到buff中,长度赋给temp

{target.write(buff,0,temp);}//将buff[]从0位置开始,长度为temp写入text2.txt文件

source.close();

target.close();

out.println("<HTML><HEAD><TITLE>文件上传</TITLE></HEAD><BODY>");

out.println("文件已上传<BR>");

}

catch(Exceptione)

{out.println("文件不能上传<BR>");}

out.println("</BODY></HTML>");

}

//处理GET请求

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException

{doPost(request,response); }

}说明:

(1)

InputStreamsource=request.getInputStream();语句表示获得客户端的一个输入流,通过这个输入流读入客户上传的全部信息,包括文件的内容以及表单的信息。

图10.9SelectFile.jsp的运行结果

(2)

Filef=newFile(Ph,"text2.txt");语句指出文件上传的位置(路径)和文件名。本例将文件上传至F:/xiti/ch10/WebContent目录中,并以text2.txt为文件名保存。

3.运行测试

执行SelectFile.jsp程序,首先出现如图10.9所示的界面。在这个界面上单击“浏览”按钮,弹出如图10.10所示的“选择文件”对话框。在这个对话框中指定要上传的文件后,单击“打开”按钮,返回图10.9。这时再单击“上传”按钮,则执行Upload.java程序,实施文件上传功能。文件上传完成后,出现如图10.11所示界面。打开text2.txt文件,其结果如图10.12所示。图10.9SelectFile.jsp的运行结果

图10.10“选择文件”对话框

图10.11Upload.java的运行结果

图10.12存入text2.txt文件的内容10.6.2文件下载

与上传文件类似,基于JSP+Servlet技术的下载文件程序也由两个程序文件组成:一个是供用户选择下载文件的JSP界面程序,另一个是实施文件下载功能的Servlet程序。

1.客户端从服务器下载文件的JSP程序DownFile_JSP.jsp

<%@pagecontentType="text/html;charset=GBK"%>

<HTML><HEAD><TITLE>下载文件</TITLE></HEAD><BODY>

<CENTER><B>下载文件</B></CENTER><HR>

<P><Ahref="DownFile?filename=text1.txt">下载text1.txt</A></P>

<P><Ahref="DownFile?filename=c10_1.jsp">下载c10_1.jsp</A></P>

</BODY></HTML>

2.将下载的文件存入任意文件夹中的Servlet程序DownFile.java

importjava.io.*;

importjavax.servlet.ServletException;

importjavax.servlet.http.*;

publicclassDownFileextendsHttpServlet

{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException

{BufferedInputStreambis=null;

BufferedOutputStreambos=null;

try

{

Stringfilename=request.getParameter("filename");

Stringfilename2=newString(filename.getBytes("iso8859-1"),"gb2312");

//通知客户文件的MIME类型

response.setContentType("application/x-msdownload");

//客户使用保存文件的对话框

response.setHeader("Content-disposition","attachment;filename="+filename);

bis=newBufferedInputStream(newFileInputStream(getServletContext().getRealPath("/"+filename2)));

bos=newBufferedOutputStream(response.getOutputStream());

byte[]buff=newbyte[2048];

intbytesRead;

while((bytesRead=bis.read(buff))!=-1)

{bos.write(buff,0,byt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论