资源描述
第 一章 什么是JSP
什么是JSP
JSP(Java Server Pages)是基于Java 语言的一种Web应用开发技术。利用这一技术可以建立安全、跨平台、易维护的Web 应用程序ss
网络应用中最常见的模式是B/S模式 (Browser / Sever即浏览器/服务器)
B/S模式中即需要获取信息的用户使用浏览器向服务器发出请求,服务器对此做出响应,将有关信息发送给用户的浏览器
基于B/S模式的网络程序的核心就是设计服务器端的Web应用程序。
JSP引擎与Tomcat服务器
JSP的核心内容之一就是编写JSP页面,JSP页面是Web应用程序的重要组成部分之一。
简单Web应用程序可能只有一个JSP页面。
复杂的Web应用程序可能由许多JSP页面、Javabean和servlet组成。当用户请求Web服务器上的JSP页面时,JSP引擎负责运行JSP,并将运行结果返回给用户。
2.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,将出现“安装向导”界面,单击其中的Next按钮,接受授权协议后,将出现选择“安装方式”的界面。在“安装方式”界面中选择Norma、Minimun、Custom和Full之一,然后按着安装向导的提示进行安装即可。
网页浏览过程
打开浏览器->输入网址->打开网页
--浏览器是 网页浏览的工具
--输入网址是向网站服务器发出请求
--打开网页是接收服务器发送的网页
静态网页与动态网页
网页分为静态网页和动态网页,动态与静态是相对的
静态网页:静态网页是事先做好并存放于服务器中的文件,无论是否被访问,都是一个独立存在的文件;
静态网页使用语言:HTML(超文本标记语言);
静态网站没有数据库的支持,在网站制作和维护方面工作量较大;
由于不需通过数据库工作,访问速度比较快;
静态网页的交互性差
动态网页:动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页;
动态网页以数据库技术为基础,降低网站维护的工作量;
动态网页技术分为客户端和服务器端
常见动态网页技术:JSP,PHP,ASP(.net)
ASP——Active Server Page
JSP——JavaServer Pages(一种动态网页技术标准。 在传统的网页HTML文件(*.htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.jsp)。)
Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式返回给客户。程序片段可以操作数据库、重新定向网页以及发送 email 等等,这就是建立动态网站所需要的功能。
所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,对客户浏览器的要求最低,可以实现无Plugin,无ActiveX,无Java Applet,甚至无Frame
JSP动态网页技术优势
业务逻辑和显示分离
多平台支持及高可移植性
开发便利
安全
较高的效率与性能
较低的开发和运营成本
使用JSP进行开发,需要具备以下的运行环境:
Web浏览器
JDK开发工具包
数据库
Web服务器
第 二章 JSP页面
JSP页面可由5种元素组合而成:
① 普通的HTML标记符;
② JSP标记,如指令标记、动作标记;
③ 变量和方法的声明;
④ Java程序片;
⑤ Java表达式 ;
JSP页面的运行原理:
把JSP页面中普通的HTML标记符号,交给客户的浏览器执行显示。
JSP标记、数据和方法声明、Java程序片由Tomcat服务器负责执行,将需要显示的结果发送给客户的浏览器。
Java表达式由Tomcat服务器负责计算,将结果转化为字符串,交给客户的浏览器负责显示。
1.在JSP页面的标记符
“<%! ”和“ %> ” 有效范围和标识符的位置无关
之间声明的变量称作JSP页面的成员变量(变量类型可以是java允许的任何数据类型)。
之间声明方法 。该方法在整个JSP页面有效
“<%=”和“%>”之间可以是一个Java表达式 。
表达式的值由服务器负责计算,并将计算结果用字符串形式发送到客户端显示
1. HTML注释格式:
<!-- 注释内容 -->
2. JSP注释格式:
<%-- 注释内容 --%>
定义JSP页面使用的脚本语言,该属性的值目前只能取"java"。
例如:
<%@ page language="java" %>
注:JSP页面默认有如上page指令 。
Import 引入Java运行环境提供的包中的类
例如:
<%@ page import="java.io.*", "java.util.Date" %>
注:JSP页面默认import属性已经有“java.lang.*”、“javax.servlet.*” 等值。
contentType 属性值确定JSP页面响应的MIME(Multipurpose Internet Mail Extention)类型和JSP页面字符的编码。
例如:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page contentType="application/msword" %>
注:不允许两次使用page 指令给contentType属性指定不同的属性值 .
session属性
用于设置是否需要使用内置的session对象。session的属性值可以是true或false。session属性默认的属性值是true。
buffer属性
buffer属性用来指定out设置的缓冲区的大小或不使用缓冲区。
<%@ page buffer= “24kb” %>
buffer属性的默认值是8kb 。
buffer属性可以取值“none”,设置out不使用缓冲区。
autoFlush属性:
指定out的缓冲区被填满时,缓冲区是否自动刷新。
注: autoFlush属性的默认值是true。
isThreadSafe属性:
用来设置JSP页面是否可多线程访问。 注: isThreadSafe属性的默认值是true。
info属性
的属性值是一个字符串,其目的是为JSP页面准备一个常用且可能需要经常修改的字符串
例如:
<%@ page info= “we are students” %>
注:可以在JSP页面中使用方法:
getServletInfo();
获取info属性的属性值。
<% page contentType=” text/html;charset=gb2312”%>
<html><body>
<%@ include file=”hello.txt”%>
</body></html>
include 动作标记
语法格式:
<jsp:include page= "文件的URL"/>
或
<jsp:include page= "文件的URL">
param子标记
</jsp:include>
include动作标记告诉JSP页面动态加载一个文件。
注: include 动作标记是在JSP页面运行时才处理文件,被处理的文件在逻辑和语法上独立于当前JSP页面。
param动作标记 forward动作标记 plugin动作标记 useBean动作标记
第 三章
第 四章 内置对象
内置对象有:resquest、response、session、out 、 application
request对象可以获取用户提交的信息。request对象获取用户提交信息的最常用的方法是getParameter(String s).
一般格式是:
<FORM method=get|post action="提交信息的目的地页面">
提交手段
</FORM>
例如用户提交信息表单:
<FORM action="tom.jsp" method=post >
<INPUT type="text" name="boy" value="ok" >
<INPUT TYPE="submit" value="送出" name="submit">
</FORM>
tom.jsp页面可以使用内置request对象获得用户提交的信息
request.getParameter("boy");
当用request对象获取用户提交的汉字字符时,会出现乱码问题,所以对含有汉字字符的信息必须进行特殊的处理
String str=request.getParameter("girl");
byte b[]=str.getBytes("ISO-8859-1");
str=new String(b);
getProtocol():获取请求使用的通信协议,如http/1.1等。
getServletPath():获取请求的JSP页面所在的目录。
getContentLength():获取HTTP请求的长度。
getMethod():获取表单提交信息的方式,如POST或GET。
getHeader(String s):获取请求中头的值。
getHeaderNames():获取头名字的一个枚举。
getHeaders(String s):获取头的全部值的一个枚举。
getRemoteAddr():获取客户的IP地址。
getRemoteHost():获取客户机的名称(如果获取不到,就获取IP地址).
getServerName():获取服务器的名称。
getServerPort():获取服务器的端口号。
getParameterNames():获取表单提交的信息体部分中name参数值的一个枚举.
HTML是Hypertext Marked Language的缩写,即超文本标记语言。
<Input type="输入对象的GUI类型" name="名字" >
服务器通过属性name指定的名字来获取“输入对象的GUI类型”中提交的数据。“输入对象的GUI类型”可以是:text(文本框)、checkbox(检查框)、submit(提交键)等。
文本框text:
<Input type="text" name="me" value="hi" size= "9" align= "left" maxlength="30">
单选框radio:
<Input type="radio" name="rad" value="red" align="top" checked="java">
复选框checkbox :
<Input type="checkbox" name="ch" value="pink" align="top" checked="java">
口令框password:<Input type="password" name="me" size="12" maxlength="30">
隐藏hidden:<Input type="hidden" name="h" value="123">
提交键submit:<Input type="submit" name="me" value="确定" size="12">
重置键:reset:<Input type="reset">
处理HTML标记_<Select>、<Option>格式
1)下拉列表
<Select name="shulie" >
<Option value="cat">你选了小猫
<Option value="dog">你选了小狗
…
</Select>
(2)滚动列表:在Select中指定size属性的值就变成滚动列表,size的值是滚动列表的可见行的个数。
<Select name="shulie" size=2>
<Option value="1">计算1到n的连续和
<Option value="2">计算1到n的平方和
…
</Select>
<TextArea> 标记在表单中指定一个能输入多行文本的文本区域。
基本格式为:
<TextArea name= "ilovethisgame" Rows= "4" Cols= "20"></TextArea>
表格由<table>、</table>标记定义。一般格式:
<table>
<tr width="该行的宽度">
<th width= "单元格的宽度" >单元格中的数据</th>
…
<td width= "单元格的宽度" >单元格中的数据</td>
</tr>
…
</table>
其中 <tr> … </tr>定义表格的一个行,<th>或<td>标记定义这一行中的表格单元,二者的区别是:<th>定义的单元加重显示,<td>称做普通单元,不加重显示。一行中的加重单元和普通单元可以交替出现,也可以全是加重单元或普通单元。
<table border=1>中增加选项border可指明该表格是否带有边框。
使用<img>或<iamge>标记都可以显示一副图象,标记的基本格式为
<img src="图像文件的URL" >描述文字</img>
<image src="图像文件的URL" >描述文字</image>
播放音乐和视频
<embed src="音乐或视频文件的URL" >描述文字</embed >
<embed>标记中经常使用的属性及取值如下:
autostart属性的值用来指定音乐或视频文件传送完毕后是否立刻播放, autostart取值 “true”或“false”,该属性的默认值是false。
loop属性的取值为正整数,该属性的值用来指定音乐或视频文件重复播放的次数。
动态响应contentType属性
由于page指令只能为contentType属性指定一个值来决定响应的MIME类型。
如果想动态地改变这个属性的值来响应用户,就需要使用response对象的setContentType(String s)方法来改变contentType的属性值。
public void setContentType(String s)方法动态设置响应的MIME类型,参数s可取:
text/html、text/plain、image/gif、image/x-xbitmap、
image/jpeg、image/pjpeg、application/x-shockwave-flash、
application/vnd.ms-powerpoint、 application/vnd.ms-excel、
application/msword。
response对象可以使用方法:
addHeader(String head,String value);
或使用方法:
setHeader(String head ,String value);
动态添加新的响应头和头的值,并将这些头发送给用户的浏览器。如果添加的头已经存在,则先前的头被覆盖。
例4-12
用户的重定向。
在某些情况下,JSP引擎在响应用户时,可能需要将用户重新引导至另一个页面。
例如,如果用户输入的表单信息不完整,就会再次被引导到该表单的输入页面。
使用response对象的sendRedirect(URL url)方法实现用户的重定向。
response的状态行
当JSP引擎对用户请求进行响应时,它发送的首行称做状态行。
状态行包括3位数字的状态代码和对状态代码的描述(称做原因短语)。
session对象
内置session(会话)对象记录有关连接的信息.由Tomcat服务器负责创建。
当一个用户首次访问Web服务目录中的某个JSP页面时,JSP引擎为其产生一个session对象。为用户产生的session对象调用相应的方法可以存储用户在访问各个页面期间提交的各种信息
session对象与URL重写
如果用户端不支持Cookie,那么用户在不同网页之间的session对象可能是互不相同的,因为如果服务器无法将Id存放到用户端,就不能建立session对象和用户的一一对应关系。
可以通过URL重写来实现session对象的惟一性。所谓URL重写,就是当用户从一个页面重新链接到另一个页面时,通过向这个新的URL添加参数,把session对象的Id传带过去,这样就可以保障用户在该网站各个页面中的session对象是完全相同的。可以使用response对象调用encodeURL()或encodeRedirectURL()方法实现URL重写.
例4-19中,session对象使用setMaxInactiveInterval(int interval)方法设置最长的“发呆”状态时间为10
秒。用户可以通过刷新页面检查是否达到了最长的“发呆”时间,如果两次刷新之间的间隔超过10秒,用户先前的session将被取消,用户将获得一个新的session对象。
使用session设置时间间隔 例4-20
out对象
out对象是一个输出流,用来向用户端输出数据。
out对象可调用如下的方法用于各种数据的输出,
n out.print(Boolean),out.println(Boolean) 用于输出一个布尔值。
n out.print(char),out.println(char) 输出一个字符。
n out.print(double),out.println(double) 输出一个双精度的浮点数。
n out.print(float),out.println(float) 用于输出一个单精度的浮点数。
n out.print(long),out.println(long) 输出一个长整型数据。
n out.print(String),out.println(String) 输出一个字符串对象的内容。
n out.newLine() 输出一个换行符。
n out.flush() 输出缓冲区里的内容。
n out.close() 关闭流。
application对象
任何客户在所访问的服务目录的各个页面浏览时,application对象都是同一个.
application对象的常用方法
(1)public void setAttribute(String key, Object obj)
application对象可以调用该方法将参数Object指定的对象 obj添加到application对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加对象被清除。
(2)public Object getAttibue(String key)
获取application对象含有的关键字是key的对象。由于任何对象都可以添加到application对象中,因此用该方法取回对象时,应强制转化为原来的类型。
(3)public Enumeration getAttributeNames()
application对象调用该方法产生一个枚举对象,该枚举对象使用nextElemets()遍历application中的各个对象所对应的关键字。
(4)public void removeAttribue(String key)
从当前application对象中删除关键字是key的对象。
(5)public String getServletInfo()
application对象可以调用该方法获取Servlet编译器的当前版本的信息。
第 五章 JSP中的文件操作
JSP通过Java的输入输出流来实现文件的读写操作
File构造方法
n File(String filename);
n File(String directoryPath,String filename);
n File(File f, String filename);
1.创建目录
public boolean mkdir()
File对象调用方法创建一个目录,如果创建成功就返回true,否则返回false。
2.列出目录中的文件(如果File对象是一个目录)
public String[] list() 用字符串形式返回目录下的全部文件。
public File [] listFiles() 用File对象形式返回目录下的全部文件。
3.列出指定类型的文件
public String[] list(FilenameFilter obj)
该方法用字符串形式返回目录下的指定类型的所有文件。
public File [] listFiles(FilenameFilter obj)
该方法用File对象返回目录下的指定类型的所有文件。
File对象调用方法
public boolean delete();
可以删除当前对象代表的文件或目录。如果File对象表示的是一个目录,则该目录必须是一个空目录,删除成功将返回true
使用字节流读写文件
java.io包提供大量的流类。称InputStream类及其子类对象为字节输入流类,称OutputStream类及其子类对象为字节输出流。
InputStream类的常用方法:
l int read()输入流调用该方法从源中读取单个字节的数据,该方法返回字节值(0~255之间的一个整数)。如果未读出字节就返回-1。
l int read(byte b[]) 输入流调用该方法从源中试图读取b.length个字节到字节数组b中,返回实际读取的字节数目。如果到达文件的末尾,则返回-1。
l int read(byte b[], int off, int len) 输入流调用该方法从源中试图读取len个字节到字节数组b中,并返回实际读取的字节数目。如果到达文件的末尾,则返回-1。参数off指定从字节数组的某个位置开始存放读取的数据。
l void close() 输入流调用该方法关闭输入流。
l long skip(long numBytes) 输入流调用该方法跳过numBytes个字节,并返回实际跳过的字节数目。
OutputStream类的常用方法:
l void write(int n) 输出流调用该方法向输出流写入单个字节。
l void write(byte b[]) 输出流调用该方法向输出流写入一个字节数组。
l void write(byte b[],int off,int len) 从给定字节数组中起始于偏移量off处取len个字节写入到输出流。
l void close() 关闭输出流。
输入、输出流示意图
n FileInputStream类是InputStream的子类。
构造方法: FileInputStream(String name)
FileInputStream(File file)
使用构造方法可能发生IOException异常。输入流通过调用read方法读出源中的数据 。
n FileOutputStream是OutputStream类的子类。
构造方法: FileOutputStream(String name)
FileOutputStream(File file)
使用构造方法可能发生IOException异常。输出流通过调用write方法把字节写入到目的地 。
读取一个名为myfile.dat的文件
FileInputStream流经常和BufferedInputStream流配合使用,
FileOutputStream流经常和BufferedOutputStream流配合使用类配合使用 提高读写效率。
n BufferedInputStream类的一个常用的构造方法是:
BufferedInputStream(InputStream in);
读取文件A.txt常用下列方式:
FileInputStream in=new FileInputStream("A.txt");
BufferedInputStream bufferRead=new BufferedInputStream(in);
n BufferedOutputStream类的一个常用的构造方法是:
BufferedOutputStream(OutputStream out);
向文件B.txt写入字节常用下列方式:
FileOutputStream out=new FileOutputStream("B.txt");
BufferedOutputStream bufferWriter=new BufferedOutputStream(out);
例5-6
使用字符流读写文件
字节流不能直接操作Unicode字符,所以Java提供了字符流。由于汉字在文件中占用2个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象。在Unicode字符中,一个汉字被看做一个字符。
所有字符输入流类都是Reader(输入流)抽象类的子类。
所有字符输出流都是Writer(输出流)抽象类的子类。
Reader类中常用方法:
l int read()
l int read(char b[])
l int read(char b[], int off, int len)
l void close()
l long skip(long numBytes)
Writer类中常用方法:
• void write(int n) 输出流写入一个字符。
• 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流经常和BufferedReader流配合使用;
FileWriter流经常和BufferedWriter流配合使用。
n BufferedReader流还可以使用方法
String readLine() 读取一行;
n BufferedWriter流还可以使用方法
void write(String s,int off,int length)将字符串s的一部分写入文件.
newLine() 向文件写入一个行分隔符
文件上传
用户通过一个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()获得一个输入流,通过这个输入流读入用户上传的全部信息,包括文件的内容以及表单域的信息。
文件下载
JSP内置对象response调用方法getOutputStream()可以获取一个指向用户的输出流,服务器将文件写入这个流,用户就可以下载这个文件了。当提供下载功能时,应当使用response对象向用户发送HTTP头信息,这样用户的浏览器就会调用相应的外部程序打开下载的文件,response调用setHeader方法添加下载头的格式如下:
response.setHeader("Content-disposition","attachment;filename="下载的文件名字");
第 六章 数据库
JDBC的全称为Java DataBase Connectivity,是一套面向对象的应用程序接口(API),制定了统一的访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现。通过JDBC技术,开发人员可以用纯Java语言和标准的SQL语句编写完整的数据库应用程序,并且真正地实现了软件的跨平台性。
注意:JDBC不能直接访问数据库,必须依赖于数据库厂商提供的JDBC驱动程序,通常情况下使用JDBC完成以下操作:
(1)同数据库建立连接;
(2)向数据库发送SQL语句;
(3)处理从数据库返回的结果。
JDBC优点:
(1)JDBC与ODBC十分相似,便于软件开发人员理解;
(2)JDBC使软件开发人员从复杂的驱动程序编写工作中解脱出来,可以完全专著与业务逻辑的开发;
(3)JDBC支持多种关系型数据库,大大增加了软件的可移植性;
(4)JDBC API是面向对象的,软件开发人员可以将常用的方法进行二次封装,从而提高代码的重用性。
JDBC缺点:
(1)通过JDBC访问数据库时速度将受到一定影响;
(2)虽然JDBC API是面向对象的,但通过JDBC访问数据库依然是面向关系的;
(3)JDBC提供了对不同厂家的产品的支持,这将对数据源带来影响。
JDBC驱动程序是用于解决应用程序与数据库通信的问题,它可以分为JDBC-ODBC Bridge、JDBC-Native API Bridge、JDBC-middleware和Pure JDBC Driver4种。
第 七章 JSP与JavaBean
7.1.1 bean的编写与保存
1.如果类的成员变量的名字是xxx,那么为了获取或更改成员变 量的值,即获取或更改属性,类中必须提供两个方法:
getXxx() 用来获取属性xxx
setXxx() 用来修改属性xxx
即方法的名字用get或set为前缀,后缀是将成员变量名字的首字母大写的字符序列。对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用“is”代替上面的“get”和“set”。
3.类中声明的方法的访问属性都必须是public的。
4.类中声明的构造方法必须是public、无参数的。
参考 Circle.java
getProperty动作标记
使用动作标记getProperty可以获得bean的属性值,并将这个值以字符串的形式显示给用户。
格式如下:
<jsp:getProperty name=“bean的id” property= "bean的属性" />
或
<jsp:getProperty name= "beanid" property= "bean的属性">
</jsp:getProperty>
第 八章 Java Servlet基础
Java Servlet技术的核心就是在服务器端创建能响应用户请求的对象,被创建的对象习惯上称做一个servlet对象。
init方法
该方法是HttpServlet类中的方法,我们可以在子类中重写这个方法。init方法的声明格式:
public void init(ServletConfig config) throws ServletException
servlet对象第一次被请求加载时,服务器创建一个servlet对象,这个对象调用init方法完成必要的初始化工作。
init方法只被调用一次,即在servlet第一次被请求加载时调用该方法。
service方法
public void service(HttpServletRequest request HttpServletResponse response)
throw ServletException,IOException
当servlet对象成功创建和初始化之后,该对象就调用service方法来处理用户的请求并返回响应。
service方法可能被多次调用。
destroy方法
该方法是HttpServlet类中的方法,子类可直接继承这个方法,一般不需要重写。destroy方法的声明格式:
public destroy()
当服务器终止服务时,destroy()方法会被执行,消灭servlet对象
展开阅读全文