1、 1 / 37第 一章 什么是 JSP什么是 JSPJSP(Java Server Pages)是基于 Java 语言的一种 Web 应用开发技术。利用这一技术可以建立安全、跨平台、易维护的 Web 应用程序 ss网络应用中最常见的模式是 B/S 模式 (Browser / Sever 即浏览器 /服务器)B/S 模式中即需要获取信息的用户使用浏览器向服务器发出请求,服务器对此做出响应,将有关信息发送给用户的浏览器基于 B/S 模式的网络程序的核心就是设计服务器端的 Web 应用程序。JSP 引擎与 Tomcat 服务器JSP 的核心内容之一就是编写 JSP 页面,JSP 页面是 Web 应用
2、程序的重要组成部分之一。简单 Web 应用程序可能只有一个 JSP 页面。复杂的 Web 应用程序可能由许多 JSP 页面、Javabean 和 servlet 组成。当用户请求 Web 服务器上的 JSP 页面时,JSP 引擎负责运行 JSP,并将运行结果返回给用户。2 / 372 apache-tomcat-8.0.3.exe 的安装 apache-tomcat-8.0.3.exe 文件是针对 MS-Window 的 Tomcat 服务器,安装后形成的目录结构和 apache-tomcat-8.0.3.zip 安装的基本相同。 单击下载的 apache-tomcat-8.0.3.exe,将
3、出现“安装向导”界面,单击其中的 Next 按钮,接受授权协议后,将出现选择“安装方式”的界面。在“安装方式”界面中选择 Norma、Minimun、Custom 和 Full 之一,然后按着安装向导的提示进行安装即可。3 / 374 / 37网页浏览过程打开浏览器-输入网址- 打开网页-浏览器是 网页浏览的工具-输入网址是向网站服务器发出请求-打开网页是接收服务器发送的网页静态网页与动态网页网页分为静态网页和动态网页,动态与静态是相对的静态网页:静态网页是事先做好并存放于服务器中的文件,无论是否被访问,都是一个独立存在的文件;静态网页使用语言:HTML(超文本标记语言 );静态网站没有数据库
4、的支持,在网站制作和维护方面工作量较大;由于不需通过数据库工作,访问速度比较快;静态网页的交互性差动态网页:动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页;动态网页以数据库技术为基础,降低网站维护的工作量;动态网页技术分为客户端和服务器端5 / 37常见动态网页技术:JSP,PHP,ASP (.net)ASPActive Server Page JSPJavaServer Pages(一种动态网页技术标准。 在传统的网页 HTML 文件(*.htm,*.html)中加入 Java 程序片段(Scriptlet)和 JSP 标记(tag),就构成了
5、JSP 网页(*.jsp)。 )Web 服务器在遇到访问 JSP 网页的请求时,首先执行其中的程序片段,然后将执行结果以 HTML 格式返回给客户。程序片段可以操作数据库、重新定向网页以及发送 email 等等,这就是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,对客户浏览器的要求最低,可以实现无 Plugin,无 ActiveX,无 Java Applet,甚至无 FrameJSP 动态网页技术优势业务逻辑和显示分离多平台支持及高可移植性开发便利安全较高的效率与性能较低的开发和运营成本使用 JSP 进行开发,需要具备以下的运行环境:Web 浏览器
6、JDK 开发工具包数据库Web 服务器第 二章 JSP 页面JSP 页面可由 5 种元素组合而成: 普通的 HTML 标记符; JSP 标记,如指令标记、动作标记; 变量和方法的声明; Java 程序片; Java 表达式 ;JSP 页面的运行原理:把 JSP 页面中普通的 HTML 标记符号,交给客户的浏览器执行显示。JSP 标记、数据和方法声明、Java 程序片由 Tomcat 服务器负责执行,将需要显示的结果发送给客户的浏览器。Java 表达式由 Tomcat 服务器负责计算,将结果转化为字符串,交给客户的浏览器负责显示。1.在 JSP 页面的标记符“ ” 有效范围和标识符的位置无关之间
7、声明的变量称作 JSP 页面的成员变量(变量类型可以是 java 允许的任何数据类型) 。 之间声明方法 。该方法在整个 JSP 页面有效6 / 37“ ”之间可以是一个 Java 表达式 。表达式的值由服务器负责计算,并将计算结果用字符串形式发送到客户端显示1. HTML 注释格式 :2. JSP 注释格式:7 / 37定义 JSP 页面使用的脚本语言,该属性的值目前只能取“java“。例如:注:JSP 页面默认有如上 page 指令 。Import 引入 Java 运行环境提供的包中的类例如:注:JSP 页面默认 import 属性已经有“java.lang.*” 、 “javax.ser
8、vlet.*” 等值。contentType 属性值确定 JSP 页面响应的 MIME(Multipurpose Internet Mail Extention)类型和 JSP 页面字符的编码。例如:注:不允许两次使用 page 指令给 contentType 属性指定不同的属性值 .session 属性用于设置是否需要使用内置的 session 对象。session 的属性值可以是 true 或 false。session 属性默认的属性值是true。buffer 属性buffer 属性用来指定 out 设置的缓冲区的大小或不使用缓冲区。buffer 属性的默认值是 8kb 。buffer
9、属性可以取值 “none”,设置 out 不使用缓冲区。autoFlush 属性:指定 out 的缓冲区被填满时,缓冲区是否自动刷新。注: autoFlush 属性的默认值是 true。isThreadSafe 属性:8 / 37用来设置 JSP 页面是否可多线程访问。 注: isThreadSafe 属性的默认值是 true。 info 属性的属性值是一个字符串,其目的是为 JSP 页面准备一个常用且可能需要经常修改的字符串例如:注:可以在 JSP 页面中使用方法:getServletInfo();获取 info 属性的属性值。 include 动作标记语法格式:或param 子标记 inc
10、lude 动作标记告诉 JSP 页面动态加载一个文件。 注: include 动作标记是在 JSP 页面运行时才处理文件,被处理的文件在逻辑和语法上独立于当前 JSP 页面。9 / 37param 动作标记 forward 动作标记 plugin 动作标记 useBean 动作标记第 三章第 四章 内置对象内置对象有:resquest、response、session、out 、 applicationrequest 对象可以获取用户提交的信息。 request 对象获取用户提交信息的最常用的方法是 getParameter(String s).一般格式是:提交手段例如用户提交信息表单:tom
11、.jsp 页面可以使用内置 request 对象获得用户提交的信息 request.getParameter(“boy“);当用 request 对象获取用户提交的汉字字符时 ,会出现乱码问题,所以对含有汉字字符的信息必须进行特殊的处理String str=request.getParameter(“girl“);10 / 37byte b=str.getBytes(“ISO-8859-1“);str=new String(b);getProtocol():获取请求使用的通信协议,如 http/1.1 等。getServletPath():获取请求的 JSP 页面所在的目录。getConten
12、tLength():获取 HTTP 请求的长度。getMethod():获取表单提交信息的方式,如 POST 或 GET。getHeader(String s):获取请求中头的值。getHeaderNames():获取头名字的一个枚举。getHeaders(String s):获取头的全部值的一个枚举。getRemoteAddr():获取客户的 IP 地址。getRemoteHost():获取客户机的名称 (如果获取不到,就获取 IP 地址).getServerName():获取服务器的名称。getServerPort():获取服务器的端口号。getParameterNames():获取表单提
13、交的信息体部分中 name 参数值的一个枚举.11 / 37HTML 是 Hypertext Marked Language 的缩写,即超文本标记语言。 服务器通过属性 name 指定的名字来获取 “输入对象的 GUI 类型”中提交的数据。 “输入对象的 GUI 类型”可以是:text(文本框) 、checkbox(检查框) 、submit (提交键)等。文本框 text:单选框 radio:复选框 checkbox :口令框 password:隐藏 hidden: 提交键 submit: 重置键:reset:处理 HTML 标记_ 、格式1)下拉列表你选了小猫你选了小狗(2)滚动列表:在 S
14、elect 中指定 size 属性的值就变成滚动列表,size 的值是滚动列表的可见行的个数。计算 1 到 n 的连续和计算 1 到 n 的平方和12 / 37标记在表单中指定一个能输入多行文本的文本区域。基本格式为:表格由、标记定义。一般格式:单元格中的数据单元格中的数据 其中 定义表格的一个行,或 标记定义这一行中的表格单元,二者的区别是:定义的单元加重显示, 称做普通单元,不加重显示。一行中的加重单元和普通单元可以交替出现,也可以全是加重单元或普通单元。中增加选项 border 可指明该表格是否带有边框。使用 或标记都可以显示一副图象,标记的基本格式为描述文字描述文字 播放音乐和视频描述
15、文字标记中经常使用的属性及取值如下:autostart 属性的值用来指定音乐或视频文件传送完毕后是否立刻播放, autostart 取值 “true”或“false”,该属性的默认值是 false。loop 属性的取值为正整数,该属性的值用来指定音乐或视频文件重复播放的次数。动态响应 contentType 属性由于 page 指令只能为 contentType 属性指定一个值来决定响应的 MIME 类型。如果想动态地改变这个属性的值来响应用户,就需要使用 response 对象的setContentType(String s)方法来改变 contentType 的属性值。public voi
16、d setContentType(String s)方法动态设置响应的 MIME 类型,参数 s 可取:text/html、 text/plain、image/gif、image/x-xbitmap、13 / 37image/jpeg、image/pjpeg、application/x-shockwave-flash、application/vnd.ms-powerpoint、 application/vnd.ms-excel、application/msword。 response 对象可以使用方法:addHeader(String head,String value);或使用方法:setH
17、eader(String head ,String value);动态添加新的响应头和头的值,并将这些头发送给用户的浏览器。如果添加的头已经存在,则先前的头被覆盖。例 4-1214 / 37用户的重定向。在某些情况下,JSP 引擎在响应用户时,可能需要将用户重新引导至另一个页面。例如,如果用户输入的表单信息不完整,就会再次被引导到该表单的输入页面。使用 response 对象的 sendRedirect(URL url)方法实现用户的重定向。response 的状态行当 JSP 引擎对用户请求进行响应时,它发送的首行称做状态行。状态行包括 3 位数字的状态代码和对状态代码的描述(称做原因短语)
18、 。15 / 37session 对象内置 session(会话)对象记录有关连接的信息. 由 Tomcat 服务器负责创建。当一个用户首次访问 Web 服务目录中的某个 JSP 页面时, JSP 引擎为其产生一个 session 对象。为用户产生的session 对象调用相应的方法可以存储用户在访问各个页面期间提交的各种信息16 / 37session 对象与 URL 重写如果用户端不支持 Cookie,那么用户在不同网页之间的 session 对象可能是互不相同的,因为如果服务器无法将 Id 存放到用户端,就不能建立 session 对象和用户的一一对应关系。可以通过 URL 重写来实现
19、session 对象的惟一性。所谓 URL 重写,就是当用户从一个页面重新链接到另一个页面时,通过向这个新的 URL 添加参数,把 session 对象的 Id 传带过去,这样就可以保障用户在该网站各个页面中的 session 对象是完全相同的。可以使用 response 对象调用 encodeURL()或 encodeRedirectURL()方法实现 URL重写.17 / 37例 4-19 中,session 对象使用 setMaxInactiveInterval(int interval)方法设置最长的“发呆” 状态时间为 10 秒。用户可18 / 37以通过刷新页面检查是否达到了最长的
20、“发呆”时间,如果两次刷新之间的间隔超过 10 秒,用户先前的 session 将被取消,用户将获得一个新的 session 对象。使用 session 设置时间间隔 例 4-20out 对象out 对象是一个输出流,用来向用户端输出数据。 out 对象可调用如下的方法用于各种数据的输出, out.print(Boolean),out.println(Boolean) 用于输出一个布尔值。 out.print(char),out.println(char) 输出一个字符。 out.print(double),out.println(double) 输出一个双精度的浮点数。 out.print(
21、float),out.println(float) 用于输出一个单精度的浮点数。 out.print(long),out.println(long) 输出一个长整型数据。 out.print(String),out.println(String) 输出一个字符串对象的内容。 out.newLine() 输出一个换行符。 out.flush() 输出缓冲区里的内容。 out.close() 关闭流。application 对象任何客户在所访问的服务目录的各个页面浏览时,application 对象都是同一个.application 对象的常用方法(1 ) public void setAttri
22、bute(String key, Object obj)application 对象可以调用该方法将参数 Object 指定的对象 obj 添加到 application 对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加对象被清除。(2 ) public Object getAttibue(String key)获取 application 对象含有的关键字是 key 的对象。由于任何对象都可以添加到 application 对象中,因此用该方法取回对象时,应强制转化为原来的类型。(3 ) public Enumeration getAttributeNa
23、mes()application 对象调用该方法产生一个枚举对象,该枚举对象使用 nextElemets()遍历 application 中的各个对象所对应的关键字。(4 ) public void removeAttribue(String key)从当前 application 对象中删除关键字是 key 的对象。 (5)public String getServletInfo() application 对象可以调用该方法获取 Servlet 编译器的当前版本的信息。 19 / 37第 五章 JSP 中的文件操作JSP 通过 Java 的输入输出流来实现文件的读写操作File 构造方法
24、File(String filename); File(String directoryPath,String filename); File(File f, String filename); 20 / 371创建目录 public boolean mkdir()File 对象调用方法创建一个目录,如果创建成功就返回 true,否则返回 false。 2列出目录中的文件(如果 File 对象是一个目录)public String list() 用字符串形式返回目录下的全部文件。public File listFiles() 用 File 对象形式返回目录下的全部文件。3列出指定类型的文件pu
25、blic String list(FilenameFilter obj) 该方法用字符串形式返回目录下的指定类型的所有文件。public File listFiles(FilenameFilter obj) 该方法用 File 对象返回目录下的指定类型的所有文件。 21 / 37File 对象调用方法public boolean delete();可以删除当前对象代表的文件或目录。如果 File 对象表示的是一个目录,则该目录必须是一个空目录,删除成功将返回 true使用字节流读写文件java.io 包提供大量的流类。称 InputStream 类及其子类对象为字节输入流类,称 OutputS
26、tream 类及其子类对象为字节输出流。InputStream 类的常用方法:22 / 37 int read()输入流调用该方法从源中读取单个字节的数据,该方法返回字节值(0255 之间的一个整数) 。如果未读出字节就返回-1 。 int read(byte b) 输入流调用该方法从源中试图读取 b.length 个字节到字节数组 b 中,返回实际读取的字节数目。如果到达文件的末尾,则返回-1。 int read(byte b, int off, int len) 输入流调用该方法从源中试图读取 len 个字节到字节数组 b 中,并返回实际读取的字节数目。如果到达文件的末尾,则返回-1。参数
27、 off 指定从字节数组的某个位置开始存放读取的数据。 void close() 输入流调用该方法关闭输入流。 long skip(long numBytes) 输入流调用该方法跳过 numBytes 个字节,并返回实际跳过的字节数目。OutputStream 类的常用方法: void write(int n) 输出流调用该方法向输出流写入单个字节。 void write(byte b) 输出流调用该方法向输出流写入一个字节数组。 void write(byte b,int off,int len) 从给定字节数组中起始于偏移量 off 处取 len 个字节写入到输出流。 void close
28、() 关闭输出流。输入、输出流示意图 FileInputStream 类是 InputStream 的子类。构造方法: FileInputStream(String name)FileInputStream(File file) 使用构造方法可能发生 IOException 异常。输入流通过调用 read 方法读出源中的数据 。 FileOutputStream 是 OutputStream 类的子类。构造方法: FileOutputStream(String name)FileOutputStream(File file)使用构造方法可能发生 IOException 异常。输出流通过调用 w
29、rite 方法把字节写入到目的地 。23 / 37读取一个名为 myfile.dat 的文件FileInputStream 流经常和 BufferedInputStream 流配合使用,FileOutputStream 流经常和 BufferedOutputStream 流配合使用类配合使用 提高读写效率。 BufferedInputStream 类的一个常用的构造方法是:BufferedInputStream(InputStream in);读取文件 A.txt 常用下列方式:FileInputStream in=new FileInputStream(“A.txt“);BufferedIn
30、putStream bufferRead=new BufferedInputStream(in); BufferedOutputStream 类的一个常用的构造方法是:BufferedOutputStream(OutputStream out);向文件 B.txt 写入字节常用下列方式:FileOutputStream out=new FileOutputStream(“B.txt“);BufferedOutputStream bufferWriter=new BufferedOutputStream(out); 例 5-6使用字符流读写文件字节流不能直接操作 Unicode 字符,所以 Ja
31、va 提供了字符流。由于汉字在文件中占用 2 个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象。在 Unicode 字符中,一个汉字被看做一个字符。所有字符输入流类都是 Reader(输入流)抽象类的子类。所有字符输出流都是 Writer(输出流)抽象类的子类。 Reader 类中常用方法:24 / 37 int read() int read(char b) int read(char b, int off, int len) void close() long skip(long numBytes) Writer 类中常用方法: void write(int n
32、) 输出流写入一个字符。 void write(char b) 向输出流写入一个字符数组。 void write(char b,int off,int length) void close() 关闭输出流。 FileReader 和 FileWriter 类是 Reader 和 Writer 的子类。 FileReader 构造方法: FileReader (String filename) FileReader(File file) FileWriter 构造方法: FileWriter (String filename) FileWriter (File file) FileReader
33、流经常和 BufferedReader 流配合使用;FileWriter 流经常和 BufferedWriter 流配合使用。 BufferedReader 流还可以使用方法String readLine() 读取一行; BufferedWriter 流还可以使用方法void write(String s,int off,int length)将字符串 s 的一部分写入文件. newLine() 向文件写入一个行分隔符 25 / 3726 / 37文件上传用户通过一个 JSP 页面上传文件给服务器时,该 JSP 页面必须含有 File 类型的表单,并且表单必须将 ENCTYPE的属性值设成 m
34、ultipart/form-data。File 类型表单如下所示:JSP 引擎可以让内置对象 request 调用方法 getInputStream()获得一个输入流,通过这个输入流读入用户上传的全部信息,包括文件的内容以及表单域的信息。27 / 37文件下载JSP 内置对象 response 调用方法 getOutputStream()可以获取一个指向用户的输出流,服务器将文件写入这个流,用户就可以下载这个文件了。当提供下载功能时,应当使用 response 对象向用户发送 HTTP 头信息,这样用户的浏览器就会调用相应的外部程序打开下载的文件,response 调用 setHeader 方
35、法添加下载头的格式如下:response.setHeader(“Content-disposition“,“attachment;filename=“下载的文件名字“); 第 六章 数据库JDBC 的全称为 Java DataBase Connectivity,是一套面向对象的应用程序接口( API) ,制定了统一的访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现。通过 JDBC 技术,开发人员可以用纯 Java 语言和标准的 SQL 语句编写完整的数据库应用程序,并且真正地实现了软件的跨平台性。注意:JDBC 不能直接访问数据库,必须依赖于数据库厂商提供的 JDBC 驱动程
36、序,通常情况下使用 JDBC 完成以下操作:(1 )同数据库建立连接;(2 )向数据库发送 SQL 语句;(3 )处理从数据库返回的结果。JDBC 优点:(1 ) JDBC 与 ODBC 十分相似,便于软件开发人员理解;(2 ) JDBC 使软件开发人员从复杂的驱动程序编写工作中解脱出来,可以完全专著与业务逻辑的开发;(3 ) JDBC 支持多种关系型数据库,大大增加了软件的可移植性;(4 ) JDBC API 是面向对象的,软件开发人员可以将常用的方法进行二次封装,从而提高代码的重用性。JDBC 缺点:(1 )通过 JDBC 访问数据库时速度将受到一定影响;(2 )虽然 JDBC API 是
37、面向对象的,但通过 JDBC 访问数据库依然是面向关系的;(3 ) JDBC 提供了对不同厂家的产品的支持,这将对数据源带来影响。JDBC 驱动程序是用于解决应用程序与数据库通信的问题,它可以分为 JDBC-ODBC Bridge、JDBC-Native API Bridge、JDBC-middleware 和 Pure JDBC Driver4 种。28 / 37第 七章 JSP 与 JavaBean7.1.1 bean 的编写与保存1.如果类的成员变量的名字是 xxx,那么为了获取或更改成员变 量的值,即获取或更改属性,类中必须提供两个方法:getXxx() 用来获取属性 xxxsetXxx() 用来修改属性 xxx即方法的名字用 get 或 set 为前缀,后缀是将成员变量名字的首字母大写的字符序列。对于 boolean 类型的成员变量,即布尔逻辑类型的属性,允许使用“is”代替上面的 “get”和“set” 。3.类中声明的方法的访问属性都必须是 public 的。4.类中声明的构造方法必须是 public、无参数的。参考 Circle.java getProperty 动作标记使用动作标记 getProperty 可以获得 bean 的属性值,并将这个值以字符串的形式显示给用户。 29 / 37格式如下:或30 / 37