Java Web程序设计

刘肃平、聂军、王华、李勇波、魏碧晴

目录

  • 1 Java Web概述
    • 1.1 任务导引
    • 1.2 动态网页技术介绍
    • 1.3 JSP的运行环境
    • 1.4 JSP的运行原理
    • 1.5 JSP程序开发模式
    • 1.6 JSP开发工具
    • 1.7 任务实施:JSP开发环境搭建及第一个Hello World程序
  • 2 JSP基本语法
    • 2.1 任务导引
    • 2.2 JSP的基本组成
    • 2.3 脚本元素
    • 2.4 指令元素
    • 2.5 动作元素
    • 2.6 任务实施
  • 3 服务器交互
    • 3.1 任务导引
    • 3.2 JSP内置对象概述
    • 3.3 out对象
    • 3.4 request对象
    • 3.5 response对象
    • 3.6 session对象
    • 3.7 application对象
    • 3.8 其他内置对象
    • 3.9 任务实施:使用JSP内置对象实现登录和注销功能
  • 4 JavaBean技术
    • 4.1 任务引导
    • 4.2 JavaBean概述
    • 4.3 JavaBean的应用
    • 4.4 JavaBean的作用域
    • 4.5 任务实施
    • 4.6 JSP中的文件操作
  • 5 Servlet技术
    • 5.1 任务引导
    • 5.2 Servlet基础
    • 5.3 Servlet开发
    • 5.4 Servlet常用API
    • 5.5 任务实施
  • 6 第6章 过滤器和监听器
    • 6.1 任务导引
    • 6.2 Servlet过滤器
    • 6.3 过滤器创建与配置
    • 6.4 Servlet监听器
    • 6.5 Servlet3.0新特性
    • 6.6 任务实施
  • 7 Java Web的数据库操作
    • 7.1 任务导引
    • 7.2 JDBC技术
    • 7.3 使用JDBC驱动程序访问数据库
    • 7.4 数据库连接的JavaBean
    • 7.5 JDBC对事务的操作
    • 7.6 连接池技术
    • 7.7 任务实施
    • 7.8 扩展阅读
  • 8 JSP高级技术
    • 8.1 任务导引
    • 8.2 EL概述
    • 8.3 JSTL标签库简介
    • 8.4 JSTL核心标签
    • 8.5 JSP与Ajax
    • 8.6 任务实施
    • 8.7 扩展阅读
  • 9 JSP实用组件技术
    • 9.1 任务导引
    • 9.2 上传与下载组件
    • 9.3 发送E-mail
    • 9.4 JSP动态图表
    • 9.5 在线编辑器
    • 9.6 任务实施
JSP中的文件操作


1、File类

File类的对象主要用来获取文件本身的一些信息,不涉及对文件的读写操作。
创建一个File对象的构造方法有3个:

File(String filename);
File(String directoryPath,String filename);
File(File f, String filename);

经常使用File类的下列方法获取文件本身的一些信息:

  • 创建目录
    File对象调用方法public boolean mkdir()创建一个目录
    如果创建成功就返回true,否则返回false,若该目录已存在也返回false

  • 列出目录中的文件
    如果File对象是一个目录:
    public String [ ] list() // 用字符串形式返回目录下的全部文件.
    public File [ ] listFiles() // 用File对象形式返回目录下的全部文件。

  • 列出指定类型的文件
    public String [ ] list(FilenameFilter obj) // 该方法用字符串形式返回目录下的指定类型的所有文件。
    public File [ ] listFiles(FilenameFilter obj) // 该方法用File对象返回目录下的指定类型的所有文件。

  • 删除文件和目录
    File对象调用方法public boolean delete()删除当前对象代表的文件或目录.
    如果对象表示的是一个目录,则该目录必须是空目录.
    删除成功返回true.


  • String path=request.getRealPath("/");//传递参数"/"可以返回web应用根目录

  • String tmp_path=path+"tmp";

  • File f1=new File(tmp_path);//创建FILE类,指定路径为tmp_path

  • f1.mkdir();//创建目录

  • File f2=new File(tmp_path,"a.txt");//创建FILE类,指定路径为//tmp_path+"a.txt"

  • f2.createNewFile();//创建f2指定的文件

  • File f3=new File(tmp_path,"b.txt");

  • f3.createNewFile();

  • File f4=new File(tmp_path,"b.txt");

  • f4.createNewFile()

2、读写文件的常用流

Java的I/O流提供一条通道程序,可以使用这条通道把源中的数据送给目的地。

1)字节输入流

如果对文件读取需求比较简单:
FileInputStream类(文件字节输入流),该类是InputStream类的子类(以字节为单位读取文件)。

使用输入流通常包括4个基本步骤:

  • (1)设定输入流的源

  • (2)创建指向源的输入流

  • (3)让输入流读取源中的数据

  • (4)关闭输入流。


字节输入流-构造方法

  FileInputStream(String name);
  FileInputStream(File file);

使用输入流读取字节
输入流的目的是提供读取源中数据的通道,程序可以通过这个通道读取源中的数据。

int read() // 读取单个字节的数据,该方法返回字节值(0~255之间的一个整数),如果未读出字节就返回-1。
int read(byte b[]) // 试图读取b.length个字节到字节数组b中。
int read(byte b[], int off, int len) //试图读取len个字节到字节数组b中,参数off指定从字节数组的某个位置开始存放读取的数据。

关闭流
输入流都提供了关闭方法close() 。

2)字节输出流

如果对文件写入需求比较简单:
FileOutputStream类(文件字节输出流),它是OutputStream类的子类(以字节为单位向文件写入内容)。

使用输出流通常包括4个基本步骤:

  • (1)给出输出流的目的地

  • (2)创建指向目的地的输出流

  • (3)让输出流把数据写入到目的地

  • (4)关闭输出流


字节输出流-构造方法

  FileOutputStream(String name);
  FileOutputStream(File file);

如果输出流指向的文件不存在,java就创建该文件,如果已经存在,输出流将刷新该文件,使其长度为0.

选择是否具有刷新功能的构造方法

FileOutputStream(String name, boolean append);
FileOutputStream(File file, boolean append);
//append=true,输出流不会刷新,write方法从文件末开始写入;
//append=false,输出流将刷新所指向的文件

使用输出流写字节
输出流的目的是提供通往目的地的通道,程序可以通过这个通道将程序中的数据写入到目的地。

void write(int n) // 输出流调用该方法向目的地写入单个字节
void write(byte b[]) // 输出流调用该方法向目的地写入一个字节数组。
void write(byte b[],int off,int len) // 给定字节数组中起始于偏移量off处取len个字节写到目的地。
123

关闭流
通过调用close()方法关闭输出流可以把该流所用的缓冲区的内容冲洗掉

3)字符流

构造方法分别是:

FileReader(String filename); 
FileReader(File filename);
FileWriter (String filename); 
FileWriter (File filename);
FileWriter (String filename,boolean append);
FileWriter (File filename,boolean append);
4)缓冲流

BufferedReader类和BufferedWriter的构造方法分别是:

BufferedReader(Reader in); 
BufferedWriter (Writer out);

需要注意的是二者的源和目的地必须是字符输入流和字符输出流

FileReader inOne=new FileReader(“studen.txt”);     //创建字符输入流
BufferReader inTwo=new BufferReader(inOne);     //创建缓冲输入流
FileWriter tofile=new FileWriter(“hello.txt”);     //创建字符输出流
BufferWriter out=new BufferWriter(tofile);     //创建缓冲输出流
readLine()//读取一行
write(String s,int off, int len)//把字符串s写到流中。
newLine()//写入一个回车符

可以把BufferedReader和BufferedWriter称为上层流,把它们指向的字符流称为底层流,Java采用缓存技术将上层流和底层流连接。

当BufferedWriter流调用flush()刷新缓存或调用close()方法关闭时,底层流也会立刻将缓存的内容写入目的地。

3、RandomAccessFile类

RandomAccessFile类创建的流与前面的输入、输出流不同。

习惯上,仍称RandomAccessFile类创建的对象为一个流。

RandomAccessFile流的指向既可以作为源也可以作为目的地。

RandomAccessFile类的两个构造方法

 RandomAccessFile(String name,String mode) 
 RandomAccessFile(File file,String mode)

读写方法

4、文件操作

文件的建立与删除

首先取得当前的磁盘路径,指定要建立的文件的路径,再进行检查,如果文件不存在,如果文件不存在,则建立这个文件,如果文件存在,则删除这个文件。

CreateDelete.jsp

<%@ page contentType="text/html; charset=GB2312"%>
<%@ page import="java.io.*" %>
<%@ page language="java" %>
<HTML>
<HEAD>
<TITLE>文件的建立与删除</TITLE>
</HEAD>
<BODY>
<CENTER>
<FONT SIZE = 5 COLOR = blue>文件的建立与删除</FONT>
</CENTER>
<BR>
<HR>
<BR>
<%
//建立代表目前目录位置中File.txt档的File变量, 并由fileName变量变数引用
String path = request.getRealPath("/jsphosting/wenjian");
File fileName = new File(path, "File.txt");
//检查File.txt是否存在
if(fileName.exists())
{
//删除File.txt档
fileName.delete();
//输出目前所在的目录路径
out.println(path + "\\File.txt");
%>
<FONT SIZE = 4 COLOR = red>存在</FONT>, 已完成
<FONT SIZE = 4 COLOR = red>删除</FONT>
<%
}
else
{
//在目前的目录下建立一个名为File.txt的文字档 
fileName.createNewFile();
//输出目前所在的目录路径
out.println(path + "\\File.txt");
%>
<FONT SIZE = 4 COLOR = red>不存在</FONT>, 已完成
<FONT SIZE = 4 COLOR = red>建立</FONT>
<%
}
%>
</BODY>
</HTML> 



显示目录中的文件


首先建立要显示的目录的FILE对象,然后调用LISTFILES方法,该方法返回一个FILE对象数组,显示数组中的所有元素即可。

ListFile.jsp

<%@ page contentType="text/html; charset=GB2312"%>
<%@ page language="java" %>
<%@ page import="java.io.*" %>
<HTML>
<HEAD>
<TITLE>取得目录中的文件</TITLE>
</HEAD>
<BODY>
<CENTER>
<FONT SIZE = 5 COLOR = blue>取得目录中的文件</FONT>
</CENTER>
<BR>
<HR>
<BR>
<%
//取得目前目录的磁盘目录
String path = request.getRealPath("/jsphosting/wenjian");
//建立代表目前目录位置的d变量
File d = new File(path);
//取得代表目录中所有文件
File list[] = d.listFiles();
%>
在<Font color = red><%= path%></Font>目录下的文件有(每个文件有其相应的功能)<BR>
<Font color = blue>
<ul>
<%
for(int i=0; i < list.length; i++)
{
%>
<li><%= list[i].getName() %><BR> 
<%
}
%>
</ul>
</Font>
</BODY>
</HTML> 


读取文件中的字符

直接调用FILEREADER对象的READ()方法读取所要显示的字符

ReadAll.jsp

<%@ page contentType="text/html; charset=GB2312" %>
<%@ page language="java" %>
<%@ page import="java.io.*" %>
<HTML>
<HEAD>
<TITLE>读取文件内容</TITLE>
</HEAD>
<BODY>
<CENTER>
<FONT SIZE = 5 COLOR = blue>读取文件内容</FONT>
</CENTER>
<BR>
<HR>
<BR>
<%
String path = request.getRealPath("/jsphosting/wenjian"); //取得目前目录在伺服端的实际位置
FileReader fr = new FileReader(path + "\\File.txt"); //建立FileReader变量,并设定由fr变量变数引用
int c = fr.read(); //从文件中读取一个字节
while(c != -1) //判断是否已读到文件的结尾
{
out.print((char)c); //输出读取到的数据 
c = fr.read(); //从文件中读取数据
if(c == 13) //判断是否为断行字节
{
out.print("<BR>"); //输出分行标签
fr.skip(1); //略过一个字节
c = fr.read(); //读取一个字节
}
}
//关闭文件
fr.close();
%>
</BODY>
</HTML> 


将数据写入文件

通过调用FILEWRITER对象的WRITE()方法向文件中写入数据

Write.jsp

<%@ page contentType="text/html; charset=GB2312"%>
<%@ page language="java" %>
<%@ page import="java.io.*" %>
<HTML>
<HEAD>
<TITLE>将数据写入文件</TITLE>
</HEAD>
<BODY>
<CENTER>
<FONT SIZE = 5 COLOR = blue>将数据写入文件</FONT>
</CENTER>
<BR>
<HR>
<BR>
<%
String path = request.getRealPath("/jsphosting/wenjian"); //取得目前目录在伺服端的实际位置
FileWriter fw = new FileWriter(path + "\\File.txt"); //建立FileWrite对象,并设定由fw对象变量引用
//将字串写入文件
fw.write("大家好!");
fw.write("祝大家学习jsp愉快!");
fw.write("希望大家能够深入了解jsp技术!");
fw.close(); //关闭文件
%>
<P>写入文件内容为</P>
<FONT SIZE = 4 COLOR = red>
<%
FileReader fr = new FileReader(path + "\\File.txt"); //建立FileReader对象,并设定由fr对象变量引用
BufferedReader br = new BufferedReader(fr); //建立BufferedReader对象,并设定由br对象变量引用
String Line = br.readLine(); //读取一行数据
out.println(Line + "<BR>"); //输出读取得的数据
br.close(); //关闭BufferedReader对象
fr.close(); //关闭文件
%>
</FONT>
</BODY>
</HTML> 


5、小结

  •        输入流的指向称为源,程序从指向源的输入流中读取源中的数据。而输出流的指向是数据要去的目的地,程序通过向输出流中写入数据把信息送往目的地。

  •         FileInputStream和FileReader流都顺序地读取文件,二者的区别是:FileInputStream流以字节(byte)为单位读取文件;FileReader流以字符(char)为单位读取文件。

  •         FileOutStream流和FileWriter 顺序地写文件,二者的区别是:FileOutStream流以字节(byte)为单位写文件;FileWriter流以字符(char)为单位写文件。

  •         RandomAccessFile流的指向既可以作为源也可以作为目的地,在读写文件时可以调用seek方法改变读写位置。