第六讲 JSP中的文件操作(2) 教学目的 本讲继续讲述JSP中使用Java输入、输出流实现文件的读写操作 。 1 文件上传 2 文件下载

Slides:



Advertisements
Similar presentations
第 4 章 配合 例子源代码一起使用 Power point 制作:耿祥义 张跃平 普通高等教育 “ 十一五 ” 国家级规划教材 JSP 内置对象.
Advertisements

第 4 章 JSP 内置对象 本章主要内容:  内置对象的概念  内置对象的作用域和生命期  内置对象的作用和关系  内置对象的使用方法.
第二章 JSP 编译指令. 课程目标  JSP 编译指令  JSP 页面的表达式  JSP 页面的注释  JSP 页面的声明  Scriptlets.
Java Web 开发 授课人:张鸽. 第三讲 JSP 内置对象  JSP 有以下九种内置对象,包括:  ·request ,请求对象  ·response ,响应对象  ·pageContext ,页面上下文对象  ·session ,会话对象  ·application ,应用程序对象.
第 4 课 使用 JSP 处理客户端请求.  掌握 Form 表单的请求处理  掌握 JSP 常用内置对象的用法 out 对象 request 对象 response 对象 本章目标.
LOGO 第 9 章 Java Servlet 和 JSP 编程 孙焘. 重点: servlet 编程原理 1 servlet 的基础类与编程实现 2 JSP 编程原理 3 JSP 的常用语法 4.
第 7 章 配合 例子源代码一起使用 Power point 制作:耿祥义 张跃平 普通高等教育 “ 十一五 ” 国家级规划教材 JSP 与 JavaBean.
《计算机网络技术》 动态网页制作技术 常用HTML控件课程积件 杨 姝.
第六章 网页设计与制作基础.
HE Fixed Assets Manage System
动态Web开发技术--JSP.
檔案處理.
第五章 JSP内置对象 第4章学习了页面组成元素和使用方法。本章学习JSP内置对象的使用。使用JSP内置对象,可以方便操作页面,访问页面环境,实现页面内、页面间、页面与环境之间的通讯。 学习目标 熟悉主要内置对象的概念 理解主要内置对象的作用域和生命期 理解主要内置对象的作用和关系 熟悉主要内置对象的使用方法.
基于JSP搭建Web应用程序.
上节课我们是讲解了request, response, session, application 等内置对象,有了它们,我们就可以编写一个完整的应用程序了。 我们来看ebank这个小应用程序的编写。
高一年级过渡性学习 活动汇报 高一年级组 教科研室 汉滨高中.
第5章 HTML 標籤介紹.
第8讲 HTML与PHP基础 静态网页 vs. 动态网页.
第13章 FTP檔案上傳、 自動傳送 報告人 M9153314 李育旻.
模块1 网页设计基础 实训1 体验HTML文档 1.1 网页基础知识 1.2 网站配色方案 1.3 网站设计常用软件
全球資訊網(WWW)簡介.
認證與檔案上傳 學習目標 基本原理 資料庫連線與選擇 執行查詢 取回答案 SQL Injection.
第二章 JAVA语言基础.
例外與檔案處理 例外處理 拋出例外 串流 Stream FileReader、FileWriter
创意源自激情,技术成就梦想 畅翼创新俱乐部 2012年春俱乐部第三次技术培训 赵程.
Ch03 VB.NET語法建立ASP.NET 網頁程式設計.
ASP动态网页设计实用教程 主讲教师: 开课单位:.
第3章 超文本标记语言(HTML) 3.1 基本结构标记 3.2 文本格式标记 3.3 超链接标记<A></A>
11-1 JDBC的基礎-說明 昇陽公司提出的資料庫中介軟體(Middleware)稱為「JDBC」(Java Database Connectivity),這是一種開放標準的Java程式介面,可以讓Java程式連接資料庫管理系統, 以Java技術來說,就是實作JDBC驅動程式介面(JDBC Driver.
Hello World 體驗實作第一個JSP程式.
《ASP.NET数据库网站设计教程(C#版)》
第四章 網頁表單與資料傳遞.
Java语言程序设计 清华大学出版社 第9章 网络通信.
Ch11 檔案上傳及電子郵件 WEB程式設計.
ASP.NET 網頁製作教本 – 從基本語法學起
数据库操作示例 import java.sql.*; //导入java.sql包 public class JDBCDemo {
专题4:JSP脚本和指令.
JSP自定义标签技术的分析与应用 ----Custom Tag 的分析与应用
電子商務網站建制技術與實習(II) 助教:江宜政 吳昇洋.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
Lesson 5 :基礎應用二(留言版) (2004/08/20).
進階 WWW 程式設計 -- PHP Regular Expression 靜宜大學資訊管理學系 蔡奇偉副教授 2004
第四章 基本輸出入 Java應用程式的輸出入介面有三種,分別是命令提示字元視窗、AWT元件、及Swing元件。本單元先介紹命令提示字元視窗,AWT請看第16、17章,Swing請看第20章。 輸入 輸出.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第九章 输入/输出流.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第十一章 Java 中的网络编程.
PHP+MySQL互動式網頁程式設計班 檔案上傳程式設計 講師:林業峻 CSIE, NTU 7 / 3, 2010.
檔案上傳 所謂檔案上傳,就是將檔案由客戶端的主機,藉 由瀏覽器傳送到伺服器的資料夾上。
第12章 JSP的檔案與電子郵件處理 12-1 伺服端的檔案處理 12-2 伺服端檔案的讀取與寫入 12-3 客戶端的檔案上傳
PHP 程式流程控制結構.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
第一讲 J2EE基础 博和利初级培训 —开发技能.
PHP 變數、常數與運算子 變數 常數 運算子
第五讲 JSP中的文件操作(1) 教学目的 本讲主要讲述JSP中使用Java输入、输出流实现文件的读写 操作 。 知识要点
Web前端开发 第23章:网站发布 阮晓龙 / 河南中医药大学管理科学与工程学科
第一章 JSP概述 study-thinking-action.
网页设计与制作教程第5版 机械工业出版社同名教材 配套电子教案.
HTML 103 互動式網頁.
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
大綱 *專題演講介紹 *大陸醫療的改革與發展 *海報發表文章分享 2012海峽兩岸醫院院長論壇行後報告 ‧台北
Chap5 PHP程式設計進階 授課講師:.
Ch09 在網頁之間傳遞資訊 網頁程式設計.
HTTP 1.1 Method OPTIONS GET HEAD POST PUT DELETE TRACE CONNECT
HTML 103 互動式網頁 助教:黃毓瑩.
2019/5/3 JAVA Socket(UDP).
第6章 PHP的数据采集.
PHP程式設計 五、程式流程控制結構 建國科技大學 資訊管理學系 饒瑞佶.
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
HTML表单 JSP借由标签所构成的表单区块中,取得用户在其中特定字段输入的数据內容 。 JSP 动态网页新技术.
表单页面 表单是用户利用浏览器对Web站点网络数据库进行查询的一种界面,用户利用表单可以输入信息或选择选项等,然后将这些信息提交给服务器进行处理。通过表单,既可以将浏览器的信息发送到Internet服务器上,同时表单也可以使用户与站点的浏览者交互或从浏览者那里收集信息。它是网页的设计者和使用者相互交流的工具。表单对象包括文本域(单行、多行、密码)、列表、菜单、复选框、单选框、按钮等。
第四章 jsp语法 4.1 jsp页面的基本结构 一个jsp页面可由五种元素组合而成: 普通的html标记符
Presentation transcript:

第六讲 JSP中的文件操作(2) 教学目的 本讲继续讲述JSP中使用Java输入、输出流实现文件的读写操作 。 1 文件上传 2 文件下载 3 分页读取文件

第六讲 JSP中的文件操作(2) 这一讲继续介绍有关JSP中文件操作的内容。

6.1 文件上传 客户通过一个JSP页面,上传文件给服务器时,该JSP页面必须含有File类型的表单,并且表单必须将ENCTYPE的属性值设成“multipart/form-data”,File类型表单如下所示: <Form action= “接受上传文件的页面” method= “post” ENCTYPE=“ multipart/form-data” <Input Type= “File” name= “picture” > </Form>

JSP引擎可以让内置对象request调用方法getInputStream()获得一个输入流,通过这个输入流读入客户上传的全部信息,包括文件的内容以及表单域的信息。 下面的例子1中,客户通过Example6_1.jsp页面上传如下的文本文件A.txt。 A.txt: 你好,我们正在学习文件的上传,request调用getInpuStream()可以获得一个输入流,通过这个输入流可以读取客户上传的全部信息,包括表单的头信息以及上传文件的内容。以后将讨论如何去掉表单的信息,获取文件的内容。 在accept.jsp页面,内置对象request调用方法getInputStream()获得一个输入流in、用FileOutputStream创建一个输出流o。输入流in读取客户上传的信息,输出流o将读取的信息写入文件B.txt,该文件B.txt被存放于服务器的F:/2000中。B.txt的内容如图6.3所示。

图6.1 选择上传的文件 图6.2 接收上传 图6.3 收到的上传信息

文件B.txt的前4行(包括一个空行)以及倒数5行(包括一个空行)是表单域的内容,中间部分是上传文件A.txt的内容。 例子1(效果如图6.1、6.2、6.3所示) Example6_1.jsp: <%@ page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <P>选择要上传的文件:<BR> <FORM action="accept.jsp" method="post" ENCTYPE="multipart/form-data"> <INPUT type=FILE name="boy" size="38"> <BR> <INPUT type="submit" name ="g" value="提交"> </BODY> </HTML>

accept.jsp: <%@ page contentType="text/html;charset=GB2312" %> <%@ page import ="java.io.*" %> <HTML> <BODY> <%try{ InputStream in=request.getInputStream(); File f=new File("F:/2000","B.txt"); FileOutputStream o=new FileOutputStream(f); byte b[]=new byte[1000]; int n; while((n=in.read(b))!=-1) {o.write(b,0,n); } o.close(); in.close(); catch(IOException ee){} out.print("文件已上传"); %> </BODY> </HTML> accept.jsp:

通过上面的讨论我们知道,按着HTTP协议,文件表单提交的信息中,前4行和后面的5行是表单本身的信息,中间部分才是客户提交的文件的内容。在下面的例子中我们通过输入输出流技术获取文件的内容,即去掉表单的信息。 首先,我们将客户提交的全部信息保存为一个临时文件,该文件的名字是客户的session对象的Id,不同客户的这个Id是不同的。然后读取该文件的第2行,这一行中含有客户上传的文件的名字,获取这个名字。再获取第4行结束的位置,以及倒数第6行的结束位置,因为这两个位置之间的内容是上传文件的内容。然后将这部分内容存入文件,该文件的名字和客户上传的文件的名字保持一致。最后删除临时文件。

在下面的例子2中,客户上传一个图象文件,还可以连接到showImage 在下面的例子2中,客户上传一个图象文件,还可以连接到showImage.jsp页面查看这个上传图象的效果。我们可以允许客户将文件上传到服务器的任何一个目录,为了让客户能查看上传图象的效果,下面的例子2将上传文件保存到一个web服务目录D:/tomcat/jakarta-tomcat-4.0/webapps/examples中,假设服务器的IP是:192.168.0.100。 例子2(效果如图6.4、6.5、6.6所示)

图6.4 选择上传的图象文件 图6.6 显示上传的图象文件 图6.5 接收上传的图象文件

Example6_2.jsp: <%@ page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <% String str=response.encodeURL("acceptFile.jsp"); %> <P>选择要上传的文件:<BR> <FORM action="<%=str %>" method="post" ENCTYPE="multipart/form-data"> <INPUT type=FILE name="boy" size="45"> <BR> <INPUT type="submit" name ="g" value="提交"> </FORM> </BODY> </HTML>

acceptFile.jsp: <%@ page contentType="text/html;charset=GB2312" %> <%@ page import ="java.io.*" %> <HTML> <BODY> <%try{ //用客户的session的id建立一个临时文件: String tempFileName=(String)session.getId(); //建立临时文件f1: File f1=new File("D:/Tomcat/jakarta-tomcat-4.0/webapps/examples/",tempFileName); FileOutputStream o=new FileOutputStream(f1); //将客户上传的全部信息存入f1: InputStream in=request.getInputStream(); byte b[]=new byte[10000]; int n; while( (n=in.read(b))!=-1) {o.write(b,0,n); } o.close();in.close(); //读取临时文件f1,从中获取上传文件的名字,和上传的文件的内容:

RandomAccessFile random=new RandomAccessFile(f1,"r"); 续前页: RandomAccessFile random=new RandomAccessFile(f1,"r"); //读出f1的第2行,析取出上传文件的名字: int second=1; String secondLine=null; while(second<=2) {secondLine=random.readLine(); second++; } //获取第2行中目录符号'\'最后出现的位置 int position=secondLine.lastIndexOf('\\'); //客户上传的文件的名字是: String fileName=secondLine.substring(position+1,secondLine.length()-1); random.seek(0); //再定位到文件f1的开头。 //获取第4行回车符号的位置:

long forthEndPosition=0; 续前页: long forthEndPosition=0; int forth=1; while((n=random.readByte())!=-1&&(forth<=4)) { if(n=='\n') { forthEndPosition=random.getFilePointer(); forth++; } //根据客户上传文件的名字,将该文件存入磁盘: File f2=new File("D:/Tomcat/jakarta-tomcat-4.0/webapps/examples/",fileName); session.setAttribute("Name",fileName);//供showImage.jsp页面使用。 RandomAccessFile random2=new RandomAccessFile(f2,"rw"); //确定出文件f1中包含客户上传的文件的内容的最后位置,即倒数第6行。

random.seek(random.length()); 续前页: random.seek(random.length()); long endPosition=random.getFilePointer(); long mark=endPosition; int j=1; while((mark>=0)&&(j<=6)) { mark--; random.seek(mark); n=random.readByte(); if(n=='\n') { endPosition=random.getFilePointer(); j++; } //将random流指向文件f1的第4行结束的位置: random.seek(forthEndPosition); long startPoint=random.getFilePointer(); //从f1读出客户上传的文件存入f2(读取从第4行结束位置和倒数第6行之间的内容)。

while(startPoint<endPosition-1) 续前页: while(startPoint<endPosition-1) { n=random.readByte(); random2.write(n); startPoint=random.getFilePointer(); } random2.close();random.close(); f1.delete(); //删除临时文件 catch(IOException ee){} out.print("文件已上传"); %> <P> 查看上传的图象效果 <%String str=response.encodeURL("showImage.jsp"); <FORM action="<%=str%>"> <Input type=submit value="查看"> </FOrm > </BODY> </HTML>

showImage.jsp: <HTML> <BODY> <% String name=(String)session.getAttribute("Name"); if(name==null) {name=""; } out.print("<image src=http://192.168.1.100:8080/examples/"+name); %> </BODY> </HTML>

6.2 文件下载 JSP内置对象response调用方法getOutputStream()可以获取一个指向客户的输出流,服务器将文件写入这个流,客户就可以下载这个文件了。 当JSP页面提供下载功能时,应当使用response对象向客户发送HTTP头信息,说明文件的MIME类型,这样客户的浏览器就会调用相应的外部程序打开下载的文件。例如,Ms-Word文件的MIME类型是application/msword,pdf文件的MIME类型是application/pdf。点击点击资源管理器→工具→文件夹选项→文件类型可以查看文件的相应的MIME类型。

在下面的例子3中,客户在Example6_3页面点击超链接下载一个zip文档。 例子3(效果如图6.7、6.8所示) 图6.8下载文件 图6.7 选择下载文件

Example6_3.jsp: loadFile.jsp: <%@ page contentType="text/html;charset=GB2312" %> <HTML> <BODY> <P>点击超链接下载Zip文档book.Zip <BR> <A href="loadFile.jsp">下载book.zip </Body> </HTML> loadFile.jsp: <%@ page contentType="text/html;charset=GB2312" %> <%@ page import="java.io.*" %> <HTML> <BODY> <% //获得响应客户的输出流: OutputStream o=response.getOutputStream(); //输出文件用的字节数组,每次发送500个字节到输出流: byte b[]=new byte[500];

//下载的文件: 续前页: File fileLoad=new File("f:/2000","book.zip"); //客户使用保存文件的对话框: response.setHeader("Content-disposition","attachment;filename="+"book.zip"); //通知客户文件的MIME类型: response.setContentType("application/x-tar"); //通知客户文件的长度: long fileLength=fileLoad.length(); String length=String.valueOf(fileLength); response.setHeader("Content_Length",length); //读取文件book.zip,并发送给客户下载: FileInputStream in=new FileInputStream(fileLoad); int n=0; while((n=in.read(b))!=-1) { o.write(b,0,n); } %> </BODY> </HTML>

6.3 分页读取文件 当读取一个较大的文件时,比如想让客户阅读一部小说,我们希望分页地读取该文件。可以借助session对象实现分页读取文件。当客户向JSP页面发出请求时,JSP页面建立一个指向该文件的输入流,通过文件流每次读取文件的若干行。 我们已经知道HTTP协议是一种无状态协议。一个客户向服务器发出请求(request)然后服务器返回响应(respons),连接就被关闭了。在服务器端不保留连接的有关信息,因此当下一次连接时,服务器已没有以前的连接信息了,无法判断这一次连接和以前的连接是否属于同一客户。也就是说,如果我们请求每次读取10行,那么第一次请求会读取文件的前10行,当我们第2次请求时,JSP页面会重新将输入流指向文件,这样,我们第2次读取的内容和第一次读取的完全相同,仍是文件的前10行。因此,必须使用会话来记录有关连接的信息。当客户第一次请求该页面时,创建指向文件的输入流连接,然后将这个输入流保存到客户的会话中,当客户再次请求这个页面时,直接使用客户会话中的输入流继续读取的文件的后续10行就可以了。

例子4 readFileByLine.jsp: <%@ page contentType="text/html;charset=GB2312" %> <%@ page import ="java.io.*" %> <% String s=request.getParameter("g"); //获取客户提交的信息(是否重新读取文件) if(s==null) {s=""; } byte b[]=s.getBytes("ISO-8859-1"); s=new String(b); File f=null; FileReader in=null; BufferedReader buffer=null; long startTime=session.getCreationTime(); long endTime=session.getLastAccessedTime(); if(endTime-startTime==0) //当第一次请求该页面时,建立和文件的输入流连接。

{ f=new File("f:/2000","A.txt"); in=new FileReader(f); buffer=new BufferedReader(in); session.setAttribute("file",f); session.setAttribute("in",in); session.setAttribute("buffer",buffer); } if(s.equals("重新读取文件")) //当请求重新读取文件时,建立和文件的输入流连接。 //从session 对象中获取该用户的输入流对象: try{ String str=null; int i=1; f=(File)session.getAttribute("file"); in=(FileReader)session.getAttribute("in"); buffer=(BufferedReader)session.getAttribute("buffer"); 续前页:

while( ((str=buffer.readLine())!=null)&&(i<=5)) 续前页: while( ((str=buffer.readLine())!=null)&&(i<=5)) { out.print("<BR>"+str); i++; } catch(IOException e) { out.print("文件不存在,或读取出现问题"); %> <%String code=response.encodeURL("readFileByLine.jsp "); <HTML> <BODY> <P><BR>点击按钮读取下5行: <FORM action="<%=code%>" method="post" name=form> <Input type=submit value="读取文件的下5行"> </FORM> <P><BR>点击按钮读重新读取文件: <FORM action="" method="post" name=form> <Input type=submit name="g" value="重新读取文件"> </BODY> </HTML>