1. 程式人生 > >《Servlet和JSP程式設計基礎》學習筆記

《Servlet和JSP程式設計基礎》學習筆記

第1章  JSP簡介
Java Server Page(JSP)是一種建立動態網頁的簡單方法

第2章  配置JSP執行環境
JSP執行環境主要包括JDK和Tomcat,開發工具為Eclipse
啟動Tomcat: /usr/local/src/apache-tomcat-9.0.0.M9/bin/startup.sh
Tomcat預設Web服務目錄是/usr/local/src/apache-tomcat-9.0.0.M9/webapps/ROOT

第3章  JSP基本語法
3.1 Java程式片
HTML式註釋的基本語法是:
<!--comment[<%=expression%>]-->
例如:
<!--當前頁面的載入時間為:<%=(newjava.util.Data().toLocalString())%>-->
JSP隱藏式註釋的基本語法是:
<%--comment--%>或<%/*comment*/%>
3.2 宣告
宣告的基本語法是:
<%!Declaration1; [Declaration2;]...%>
例如:
<%!int i=2004;%> # 此宣告僅對當前頁面有效
3.3 表示式
形如<%=expression%>的標籤在JSP中被視為表示式,與JSP宣告不同,它不使用“;”作為結束符
3.4 程式段
在JSP中程式段一般包括在<% %>之間,其基本語法為:
<%code fragment%>
3.5 JSP指令
1. include指令
include指令的基本語法是:
<%@include file="relative URL"%>
2. page指令
page指令用來設定整個JSP頁面的相關屬性和功能,其基本語法是:
<%@page attribute1="value1" attribute2="value2"...%>
例如:
<%@page import="java.util.*,javax.servlet.*"%>
page指令屬性:
屬性                      說明
language="java"           宣告指令碼語言種類,預設為java
extends="package.class"   定義JSP頁面產生的servlet所繼承的父類
import="package1.class,
  package2.class..."      宣告需要匯入的包
session="true|false"      指明session物件是否可用,預設為true
buffer="8kb|none|size kb  指明輸出流是否有緩衝區,預設為8kb
autoFlush="true|false"    指明緩衝區是否需要自動清除,預設為true
isThreadSafe="true|false" JSP檔案是否允許多執行緒使用,預設為true
info="text"               描述該JSP頁面的相關資訊
errorPage="relative URL"  指明如果該頁面產生異常,應當呼叫的JSP頁面
isErrorPage="true|false"  指明該JSP頁面是否為處理異常錯誤的頁面
ContentType="mimeType[;
charset=characterSet]"    指明MIME型別和編碼屬性
3. taglib指令
taglib指令允許使用者自定義新的標籤,其基本語法是:
<%@taglib url="relative tagLibURL" prefix="tagPrefix"%> # 其中url指明自定義標籤庫的存放位置,prefix是為了區分不同標籤庫中的相同標籤名
3.6 JSP動作
1. <jsp:include>動作
<jsp:include>是在當前JSP頁面中動態包含一個檔案,其基本語法是:
<jsp:include page="relative URL|<%=expression%>" flush="true"/> # 其中page指明瞭需要包含的檔案路徑,flush屬性必須設為true,預設為false
<jsp:include>動作與<%@include%>指令不同,前者是在頁面被請求訪問使才被嵌入,後者是在JSP頁面轉化成Servlet時嵌入檔案
2. <jsp:forward>動作
<jsp:forward>動作允許將使用者請求定位至其他頁面,其基本語法是:
<jsp:forward page="relative URL">
3. <jsp:plugin>動作
<jsp:plugin>動作用於在客戶端瀏覽器中執行一個Bean或者顯示一個Applet,其基本語法是:
<jsp:plugin attribute1="value1" attribue2="value2"...>
例如:
<jsp:plugin type="applet" code="Clock.class" codebase="applet" jreversion="1.2" width="160" height="150">
    <jsp:fallback>APPLET載入出錯!<jsp:fallback>
</jsp:plugin>
<jsp:plugin>屬性:
屬性                                                 說明
type="bean/applet"                                   指定被執行外掛的型別,沒有預設值,固必須指定
code="classFileName"                                 將被外掛執行的Java類檔名,該檔案必須位於codebase屬性指定的目錄中
codebase="classFileBase"                             被執行的Java類檔案所在目錄,預設值為使用<jsp:plugin>的JSP頁面所在路徑
name="instanceName"                                  Bean或Applet的名字
align="bottom|top|middle|left|right                  Bean或Applet物件的位置
height="heightPixels" width="widthPixels"            Bean或Applet物件將要顯示的長寬值
hspace="leftrightPixels" vspace="topbottomPixels"    Bean或Applet物件顯示時距螢幕左右、上下的距離
archive="archiveList"                                一些用逗號分隔開的路徑名,這些路徑名用於預先載入一些將要使用的Class以提高Applet的效能
iepluginurl="iepluginURL" nspluginurl="nspluginURL"  分別用來指明IE使用者和Netscape Navigator使用者能夠使用的JRE URL地址
jreversion="versionnumber"                           執行Applet或Bean所需JRE的版本,預設值為1.2
<jsp:fallback>message<jsp:fallback>                  當外掛無法顯示給使用者的提示資訊
<jsp:params>
    <jsp:param name="parameterName"
        value="parameterValue <%=expression%>"/>
</jsp:params>                                        需要向Applet或Bean物件傳遞的引數
4. <jsp:param>動作
<jsp:param>用來提供引數資訊,其基本語法是:
<jsp:param name="parameterName" value="parameterValue"> # 其中,name屬性就是引數的名稱,value屬性就是引數值
例如:
<jsp:param name="username" value="張三">
3.7 字元使用慣例
特殊字元的替代:
需要替換的字元  用於替換的字元
\               \\
<%              <\%
%>              %\>
'               \'
"               \"
3.8 JSP異常
javax.servlet.jsp包中有兩類錯誤異常,JspError和JspException
JspError發生在JSP檔案轉換成Servlet檔案時,通常稱為“轉換期錯誤”,這類錯誤通常都是由語法錯誤引起,導致無法編譯,在頁面中報“HTTP 500”型別的錯誤,其原型為:
public class JspError extends JspException
JspException發生在編譯後的Servlet Class檔案在處理Request請求時,因為邏輯上的錯誤而導致“請求期異常”,其原型為:
public class JspException extends java.lang.Exception

第4章  JSP內建物件
4.1 request物件
request物件是對HTTP請求包的封裝
request物件的常用方法:
getProtocol(): 用於獲取通訊協議
gerServletPath(): 用於獲取客戶請求的JSP頁面檔案的目錄
getContentLength(): 用於獲取客戶提交的整個資訊的長度
getMethod(): 用於獲取客戶提交資訊的方式
getHeader(String s): 用於獲取HTTP標頭檔案中由引數s指定的頭名字的值
getHeaderNames(): 用於獲取頭名字的一個列舉
getHeaders(String s): 用於獲取標頭檔案中指定頭名字的全部值的一個列舉
getRemoteAddr(): 用於獲取客戶的IP地址
getRemoteHost(): 用於獲取客戶機的名字
getServerName(): 用於獲取伺服器的名字
getServerPort(): 用於獲取伺服器的埠號
getParameterNames(): 用於獲取客戶提交的資訊體部分的name引數值的一個列舉
4.2 response物件
response物件:伺服器響應客戶時,即向客戶傳送資訊時,使用的是HTTP響應包,系統將HTTP響應包封裝為response物件
response物件常用的方法:
addHeader(String head,String value):向包裡新增一個頭(head)及對應值(value)
SendRedirect(URL url): 實現客戶重定向
SetStatus(int n): 設定響應的狀態程式碼
響應包的狀態行:
伺服器響應客戶時,它傳送到客戶端的首行被稱為狀態行,狀態行由3位數的狀態程式碼和描述狀態程式碼的文字組成,下面是對狀態程式碼的分類描述
1xx: 1開頭的3位數字,主要用於實驗
2xx: 2開頭的3位數字,表明客戶端的請求成功
3xx: 3開頭的3位數字,表明處理客戶的請求以前,應做一些別的處理
4xx: 4開頭的3位數字,表明瀏覽器請求是非法或無效
5xx: 5開頭的3位數字,表明伺服器出現問題
4.3 session物件
session物件記錄了每個客戶與伺服器的連線資訊
1.會話
從一個客戶開啟瀏覽器連線到伺服器的某個服務目錄,到客戶關閉瀏覽器,這一過程稱為一個會話
2.客戶的session物件與服務目錄
當一個客戶首次訪問服務目錄中的一個JSP頁面時,JSP引擎為該客戶建立一個session物件
3.session物件與Cookie物件
當JSP引擎為客戶建立一個session物件後,這個session物件被分配了一個String型別的ID號,JSP引擎同時將此ID號傳送到客戶端,存放在Cookie中
4.session物件與執行緒
一個客戶對應一個執行緒,每個執行緒對應一個session物件,每個執行緒的session物件不同
5.session物件生命週期
從一個客戶會話開始到會話結束(即客戶訪問某Web目錄下的頁面到關閉瀏覽器,離開該Web目錄)這段時間稱為session物件的生命週期
6.session物件的常用方法
public void setAttribute(String key, Object obj):session物件類似於散列表,該方法將引數Object指定的物件obj新增到session物件中,併為新增的物件指定一個索引關鍵字key
public Object getAttribute(String key): 獲取session物件中含有關鍵字key的物件
public Enumeration getAttributeName(): session物件呼叫該方法可以產生一個列舉物件,該物件使用nextElement()遍歷session物件所含有的全部物件
public long getCreateTime(): 獲取session物件的建立時間,單位是毫秒,從1970年7月1日午夜起至該物件建立時刻所走過的毫秒數
public int getMaxInactiveInterval(): 獲取session物件的生存時間
public void setMaxInactiveInterval(): 設定session物件的生存時間,單位是秒
public void removeAttribute(String key): 從當前session物件中刪除關鍵字key的物件
public String getID(): 獲取session物件的編號
invalidate(): 使session物件無效
public boolean isNew(): 判斷是否是一個新使用者
4.4 application物件
application物件在伺服器啟動後產生,客戶的application物件是相同的一個,即所有客戶共享這個內建的application物件
1.application物件生命週期
application物件的生命週期指從application物件建立到伺服器關閉這段時間
2.application物件與執行緒
當多個客戶單擊同一個頁面時,JSP引擎為每個客戶啟動一個執行緒,這些執行緒共享同一個application物件
3.application物件的常用方法
public void setAttribute(String key, Object obj): 將引數Object指定的物件obj新增到application物件中,併為新增到的物件指定一個索引關鍵字key
public Object getAttribute(String key): 獲取application物件中含有的關鍵字為key的物件
public Enumeration getAttributeNames(): 產生一個列舉物件,該列舉物件使用nextElements()方法遍歷application物件所含有的全部物件
public void removeAttribute(String key): 從當前application物件中刪除關鍵字是key的物件
public String getServletInfo(): 獲取Servlet編譯器的當前版本資訊
4.5 page物件
page物件代表JSP頁面本身,更確切地說,代表JSP被轉譯後的Servlet
4.6 out物件
out物件是一個輸出流,用來向客戶端輸出資料

第5章  資料庫操作
5.1 JDBC簡介
JDBC(Java DataBase Connectivity)是一種用於訪問資料庫和執行SQL語句的Java API
5.3 JDBC介面
1.Driver
Sun公司定義了4種JDBC驅動:
JDBC-ODBC橋
原始API驅動
JDBC網路純Java驅動
原始協議純Java驅動
第一種:JDBC-ODBC橋
它通過ODBC驅動提供對資料庫的JDBC訪問
第二種:原始API驅動
原始API驅動直接將JDBC命令轉換成DBMS所指定的程式碼呼叫
第三種:JDBC網路純Java驅動
這種驅動將JDBC命令轉換成獨立於資料庫的網路協議,協議傳送給中間伺服器,然後伺服器將獨立於DBMS的協議轉換成具體的DBMS的協議,傳送給資料庫,結果沿原路返回
第四種:原始協議純Java驅動
直接同資料庫提供商的資料庫通訊的純Java驅動,將JDBC命令直接轉換成資料庫引擎的本地協議
import java.sql.*; # 匯入有關SQL的類
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); # 使用JDBC-ODBC Bridge Driver時,載入驅動
Class.forName("driver_class_name"); # 使用JDBC Driver時,載入驅動
Class.forName("org.gjt.mm.mysql.Driver"); # 使用JDBC Driver時,載入mysql資料庫驅動
Class.forName("org.mariadb.jdbc.Driver"); # 使用JDBC Driver時,載入mariadb資料庫驅動
2.DriverManager
用DriverManager的getConnection()方法可以建立一個數據庫連線物件,它的一般形式如下:
Connection connection_name=DriverManager.getConnection("驅動型別:資料來源","使用者名稱","密碼"); # 其中驅動型別,在使用JDBC-ODBC驅動時就用jdbc:odbc,如果是JDBC驅動則根據使用的資料庫決定
Connection con = DriverManager.getConnection("jdbc:mysql://主機:埠號;DatabaseName=資料庫名稱","使用者名稱","密碼"); # 使用JDBC驅動時,mysql資料庫getConnection()宣告
Connection con = DriverManager.getConnection("jdbc:maridb://localhost:3306/grade", "root", ""); # 使用JDBC驅動時,mariadb資料庫getConnection()宣告
3.Connection
一個Connection表示與一個特定資料庫的會話,Connection物件代表與資料庫的連線,也就是在已經載入的Driver和資料庫之間建立連線
Connection方法:
close(): 關閉資料庫的連線
commit(): 提交對資料庫的更改,使更改生效,這個方法只有呼叫了setAutoCommit(false)方法後才生效,否則對資料庫的更改會自動提交到資料庫
createStatement(): 建立SQL語句物件,呼叫方法如下:
Statement sql_statement_name=connection_name.createStatement();
GetAutoCommit(): 獲得當前自動提交狀態,如果是自動提交模式則返回true,否則返回false
isClosed(): 判斷連線是否已經關閉,如果已經關閉則返回true,否則返回false
isReadOnly(): 檢測該連線是否在只讀狀態,如果是隻讀狀態則返回true,否則返回false
prepareCall(): 建立一個CallableStatement物件,用來處理一個SQL儲存過程呼叫語句,呼叫方法如下:
connectionObjectName.prepareStatement(String sqlString); # 其中sqlString是一個SQL語句
rollback(): 回滾上一次提交/回滾操作後的所有更改,並釋放Connection當前保持的任何資料庫鎖,只有當禁止自動提交時可以使用該方法
setAutoCommit(): 設定連線是否處於自動提交狀態,其呼叫方法如下:
connectionObjectName.setAutoCommit(boolean autoCommit); # 引數autoCommit如果為true則啟動自動提交,否則禁止自動提交
setReadOnly(): 可以把一個連線設定為只讀模式,呼叫方法如下:
connectionObjectName.setReadOnly(boolean readOnly); # 引數readOnly如果為true則啟動只讀模式,若false則禁止只讀模式
4.Statement
Statement類物件代表SQL語句,可用於將SQL語句傳送至資料庫,其中存在三種Statement物件:
Statement, 用來執行基本的SQL語句
PreparedStatement, 它從Statement繼承,用於提供和查詢資訊一起預編譯的語句
CallableStatement, 它繼承自PreparedStatement, 用來執行資料庫中的儲存過程
Statement物件用於執行一條靜態的SQL語句並獲取它產生的結果,任何時候每條語句僅能開啟一個ResultSet, ResultSet是語句執行後返回的記錄結果集
Statement類的常用方法:
cancel(): 用於一個執行緒取消另一個執行緒正在執行的一條語句
close(): 用來關閉語句,同時立即釋放該語句的資料庫和JDBC資源,如果它有相應產生的ResultSet, 則ResultSet也會被關閉
execute(): 執行一條可能返回多個結果的SQL語句,返回一個布林值,如果下一個結果是ResultSet, 則返回true, 如果它是一個更新數量或沒有其他結果,則返回false, 呼叫方法如下:
StatementObjName.execute(String sqlString); # 其中sqlString是一個SQL語句
StatementObjName.executeQuery(String sqlString); # 執行一個返回單個ResultSet的SQL語句,返回值是由查詢SELECT產生的資料集ResultSet
StatementObjName.executeUpdate(String sqlString); # 執行一條INSERT、UPDATE或DELETE語句或是沒有返回值的SQL語句,返回語句影響的行數,如果沒有影響的行數則返回0
StatementObjName.getResultSet(); # 得到當前的ResultSet結果
StatementObjName.getUpdateCount(); # 得到更新的數量,如果結果是一個ResultSet或沒有其他結果,則返回-1,返回值是int型資料
PreparedStatement類物件封裝一條預編譯的SQL語句,可用於高效地多次執行該語句,其常用方法:
PreparedStatementObjectName.clearParamenters(); # 立即釋放當前引數值使用的資源
PreparedStatementObjectName.execute(); # 執行一條可能返回多個結果的SQL語句,返回一個布林值,如果下一個結果是ResultSet, 則返回true, 如果它是一個更新數量或沒有其他結果,則返回false
PreparedStatementObjectName.executeQuery(); # 執行準備好的SQL查詢SELECT並返回ResultSet
PreparedStatementObjectName.executeUpdate(); # 執行一條INSERT、UPDATE或DELETE語句或是沒有返回值的SQL語句,返回語句影響的行數,如果沒有影響的行數則返回0
PreparedStatementObjectName.setBoolean(int parameterIndex, boolean x); # 設定一個引數的布林值,驅動程式把該值傳送到資料庫時,將該值轉換為一個BIT值,其中,parameterIndex是引數的索引號,第一個引數是1,第二個引數是2..., x是對應這個引數的布林值
PreparedStatementObjectName.setByte(int parameterIndex, byte x); # 設定一個引數的位元組值,當驅動程式把該值傳送到資料庫時,將該值轉換為一個tinyint值
PreparedStatementObjectName.setBytes(int parameterIndex, byte x[]); # 設定一個引數的位元組陣列值,當驅動程式把該值傳送到資料庫時,將該值轉換為integer值
PreparedStatementObjectName.setDate(int parameterIndex, Date x); # 設定一個引數的日期值,當驅動程式把該值傳送到資料庫時,將該值轉換為一個date值
PreparedStatementObjectName.setDouble(int parameterIndex, double x); # 設定一個引數的雙精度值,當驅動程式把該值傳送到資料庫時,將該值轉換為一個double值
PreparedStatementObjectName.setFloat(int parameterIndex, float x); # 設定一個引數的單精度值
PreparedStatementObjectName.setInt(int parameterIndex, int x); # 設定一個引數的整型值
PreparedStatementObjectName.setShort(int parameterIndex, short x); # 設定一個引數的short值
5. ResultSet
ResultSet類可用來接收執行SQL查詢語句後得到的記錄集,用它的get方法可得到記錄中不同列的資料,用它的next()方法可把當前記錄指標往下移動一行
ResultSet類的常用方法:
ResultsetObjectName.absolute(int row); # 移動記錄指標到指定的行,引數row如果是正數,則從記錄的開始起移動指定的行數,如果為負數則表示倒數,該方法返回一個布林值,當移動到第一行的前面或最後一行的後面時返回false
ResultsetObjectName.afterLast(); # 移動當前記錄指標至最後一行的後面
ResultsetObjectName.beforeFirst(); # 移動當前記錄指標至第一行的前面
ResultsetObjectName.close(); # 立即釋放該語句的資料庫和JDBC資源
ResultsetObjectName.first(); # 移動當前記錄指標至第一行
ResultsetObjectName.getBoolean(int columnIndex);

ResultsetObjectName.getBoolean(String columnIndex); # 把當前行的列值作為一個Boolean值獲取,如果列值為空則返回false
ResultsetObjectName.getByte(int columnIndex);

ResultsetObjectName.getByte(String columnName); # 把當前行的列值作為一個Byte值獲取,如果列值為空則返回null
ResultsetObjectName.getBytes(int columnIndex);

ResultsetObjectName.getBytes(String columnName); # 把當前行的列值作為一個Byte值獲取,如果列值為空則返回null
ResultsetObjectName.getDate(int columnIndex);

ResultsetObjectName.getDate(String columnName); # 把當前行的列值作為一個Date值獲取,如果列值為空則返回null
ResultsetObjectName.getDouble(int columnIndex);

ResultsetObjectName.getDouble(String columnName); # 把當前行的列值作為一個Double值獲取,如果列值為空則返回0
ResultsetObjectName.getFloat(int columnIndex);

ResultsetObjectName.getFloat(String columnName); # 把當前行的列值作為一個Float值獲取,如果列值為空則返回0
ResultsetObjectName.getInt(int columnIndex);

ResultsetObjectName.getInt(String columnName); # 把當前行的列值作為一個Int值獲取,如果列值為空則返回0
ResultsetObjectName.getLong(int columnIndex);

ResultsetObjectName.getLong(String columnName); # 把當前行的列值作為一個Long值獲取,如果列值為空則返回0
ResultsetObjectName.getRow(); # 移動當前記錄指標所指向的行號,行號從1開始,如果記錄集中沒有記錄則返回0
ResultsetObjectName.getShort(int columnIndex);

ResultsetObjectName.getShort(String columnName); # 把當前行的列值作為一個Short值獲取,如果列值為空則返回0
ResultsetObjectName.getString(int columnIndex);

ResultsetObjectName.getString(String columnName); # 把當前行的列值作為一個String值獲取,如果列值為空則返回null
ResultsetObjectName.isAfterLast(); # 判斷當前記錄指標是否在最後一行之後
ResultsetObjectName.isBeforeFirst(); # 判斷當前記錄指標是否在第一行之前
ResultsetObjectName.isFirst(); # 判斷當前記錄指標是否在第一行
ResultsetObjectName.isLast(); # 判斷當前記錄指標是否在最後一行
ResultsetObjectName.last(); # 移動當前記錄指標到最後一行
ResultsetObjectName.next(); # 把當前記錄指標往下移動一行,ResultSet初始定位於它的第一行之前,如果當前行有效,返回true,如果沒有更多的行則返回false
ResultsetObjectName.previous(); # 把當前記錄指標向上移動一行,當移動到第一行之前時返回false, 否則返回true
5.4 資料庫事務處理
1. 資料查詢
Statement stmt=conn.createStatement(int type, int concurrency); # 建立語句物件
String sql="select * from tablename where expression";
ResultSet rs=stmt.executeQuery(sql); # 獲得查詢結果集
2. 資料更新
Statement stmt=conn.createStatement(int type, int concurrency); # 建立語句物件
String sql="sqlStatement";
int number=stmt.executeUpdate(sql); # 執行更新
需要說明的是:
在資料查詢、資料更新事務中,一般採用無參的createStatement()方法建立語句物件,如果事務是隨即查詢、遊動查詢或用結果集更新資料庫,則應採用帶引數的createStatement(int type, int concurrency)方法建立語句物件,其中:
type的取值決定滾動方式,即結果集中的遊標是否能上下滾動
ResultSet.TYPE_FORWORD_ONLY: 表示結果集的遊標只能向下滾動
ResultSet.TYPE_SCROLL_INSENSITIVE: 表示結果集的遊標可以上下移動,當資料庫變化時,當前結果集不變
ResultSet.TYPE_SCROLL_SENSITIVE: 表示返回可滾動的結果集,當資料庫變化時,當前結果集同步改變
concurrency的取值決定是否能用結果集更新資料庫
ResultSet.CONCUR_READ_ONLY: 表示不能用結果集更新資料庫中的表
ResultSet.CONCUR_UPDATABLE: 表示能用結果集更新資料庫中的表

第6章  JSP中Bean的使用
6.1 Bean的概念
Bean本身是遵循一定規範的Java類,是一個可以重複使用的元件
Bean作為類必須遵循的規範:
Bean必須是public類
Bean必須有一個共有的無參構造方法
Bean必須實現介面Serializable或Externalizable,以確保元件的持續性
6.2 編寫Bean
為了讓JSP引擎知道Bean的屬性和方法,Bean的方法命名必須遵守以下規則:
1. 假設Bean類的成員變數名是xxx,則訪問該變數的兩個方法命名為:
getXxx(): 獲取xxx的值
setXxx(): 設定xxx的值
2. 若成員變數xxx是布林型別,則只有一個訪問方法,其命名是:
isXxx()
部署Bean:
1. 給Bean起包名small.dog
2. 把編譯後的位元組碼檔案Triangle.class複製到存放Bean的目錄下,即/usr/local/src/apache-tomcat-9.0.0.M9/webapps/ROOT/WEB-INF/classes/small/dog目錄中
6.3 JSP使用Bean
1. 將Bean位元組碼存放在正確的目錄中
(1) 將Bean位元組碼檔案存放在公有目錄中,Tomcat5.0/common/classes
(2) 將Bean位元組碼檔案存放在私有目錄中,test/WEB-INF/classes, 只有test目錄下的JSP頁面才能訪問
2. 在JSP頁面中使用動作標籤useBean獲得一個Bean物件
<jsp:useBean id = "boy" class = "small.dog.Circle" scope = "session">
</jsp:useBean> # 其中,id為Bean物件名,class為類名,scope為作用域,預設是page, 取值為request時,Bean只對當前使用者的請求有效,Bean的生命週期是在客戶請求開始到對請求作出響應這段時間,取值為page時,Bean在當前頁有效,Bean的生命週期是客戶進入頁面到客戶離開這個頁面這段時間,取值為session時,Bean在當前Web目錄下的所有頁面有效,Bean的生命週期是客戶訪問Web目錄到客戶離開這個Web目錄這段時間,取值為application時,Bean在所有的頁面有效,Bean的生命週期是從Bean分配給客戶到伺服器關閉這段時間
6.4 訪問Bean屬性
訪問Bean屬性值的方法有兩種:第一種方式,通過Bean的方法訪問Bean的屬性值;第二種方式,使用JSP動作標籤訪問Bean屬性的值
1. 讀取Bean屬性值(getProperty標籤)
<jsp:getProperty name = "bean的名字" property = "bean的屬性名" />
2. 設定Bean屬性值(setProperty標籤)
<jsp:setProperty name = "bean的名字" property = "bean的屬性名" value = "<%expression%>" /> # 使用字串或表示式直接給Bean屬性賦值
<jsp:setProperty name = "bean的名字" property = "*" /> # 不具體指定每個Bean屬性的名字,系統會自動根據表單中資料元件名字與Bean的成員變數名字一一對應賦值
<jsp:setProperty name = "bean的名字" property = "屬性名字" param = "引數名字" /> # 要求表單中提供引數的資料元件名與setProperty標籤中的param屬性值名稱相同

第7章  Servlet技術
7.1 什麼是Servlet
Servlet是用Java編寫的伺服器端程式,是由伺服器端呼叫和執行的、按照Servlet自身規範編寫的Java類
7.3 Servlet的生命週期
Servlet的生命週期概括為以下幾個階段:
1. 裝載Servlet
2. 呼叫Servlet的init()方法
3. 呼叫service()方法
4. 伺服器呼叫destroy()方法
7.4 部署一個Servlet
Servlet檔案ServletTest.java目錄:/usr/local/src/apache-tomcat-9.0.0.M9/webapps/ROOT/WEB_INF/classes/servlettest/ServletTest.java
在WEB-INF/Web.xml檔案中新增如下內容:
<servlet>
    <servlet-name>servlettest</servlet-name>
        <servlet-class>servlettest.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>servlettest</servlet-name>
        <url-pattern>/ServletTest</url-pattern>
</servlet-mapping>
在瀏覽器中輸入:http://localhost:8080/ServletTest

第8章  JSTL應用開發
8.1 JSTL技術概述
JSTL:JSP Standard Tag Library, JSP標準標籤庫
JSTL標籤庫中的標籤主要有如下5類:
1. 核心標籤庫
2. XML操作標籤庫
3. 格式化/國際化標籤庫
4. 資料庫操作標籤庫
5. 函式標籤庫
安裝JSTL:
http://jakarta.apache.org/site/downloads_taglibs-standard.cgi
解壓縮,將lib目錄下的jstl.jar和standard.jar複製到WEB-INF/lib目錄下
8.2 表示式相關標籤
需在JSP頁面首部加入:
<%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/fmt"%>
8.2.1 <c:out>
<c:out>標籤用於把表示式計算的結果輸出到JSP頁面中,語法格式為:
<c:out value = "Expression" [escapeXml = "true|false"] [default = "defaultValue"]/> # 沒有body的形式,在default屬性中設定要輸出的預設值
<c:out value = "Expression" [escapeXml = "true|false"]> defaultValue </c:out> # 有body的形式,body中的內容就是要輸出的預設值,當Expression為null時,輸出預設值
escapeXml為預設值true時,轉換字元"<", ">", "'", "&", """為實體程式碼,設定為false時則不轉換
特殊字元轉換對應情況:
字元    實體程式碼
<    &lt;
>    &gt;
'    &#039;
"    &#034;
&    &amp;
8.2.2 <c:set>
<c:set>標籤用於在某個範圍(request, page, session, application) 中設定某個值,呼叫方法為:
<c:set value = "Expression" var = "varName" [scope = "{request|page|session|application}"]/> # 設定範圍scope(預設值page)中變數var的值為value
<c:set var = "varName" [scope = "{request|page|session|application}"]>valueExpression</c:set> # 同上
<c:set value = "Expression" target = "targetName" property = "propertyName"/> # 設定變數target的屬性property的值為value
<c:set target = "targetName" property = "propertyName">valueExpression</c:set> # 同上
8.2.3 <c:remove>
<c:remove>標籤用於刪除某個範圍(request, page, session, application)中設定的某個值,呼叫方法如下:
<c:remove var = "varName" [scope = "{page|request|session|application}"]/> # 其中scope預設值為page
8.2.4 <c:catch>
<c:catch>標籤用於捕獲巢狀在它裡面的程式程式碼丟擲的異常,從而進行相應的處理,呼叫方法如下:
<c:catch [var = "varName"]>
    需要捕獲異常的標籤語句、Java程式、HTML程式碼等
</c:catch> # 其中,var用於標識捕獲的異常
8.3 流程控制標籤
8.3.1 <c:if>
<c:if>標籤用於條件判斷,語法如下:
<c:if test = "testBooleanExpression" [var = "varName"] [scope = "{request|page|session|application}"]/>
<c:if test = "testBooleanExpression" [var = "varName"] [scope = "{request|page|session|application}"]>testBooleanExpression為真時執行的語句、Java程式、HTML程式碼等
</c:if> # 其中var接收testBooleanExpression的結果true或false, scope為var的有效範圍
8.3.2 <c:choose>與<c:when>, <c:otherwise>
<c:choose>標籤類似於Java中的switch語句
<c:choose>
    ...
    <c:when test = "testBooleanExpression">
        testBooleanExpression為真時執行的語句、Java程式、HTML程式碼等
    </c:when>
    ...
    [<c:otherwise>
        標籤語句、Java程式、HTML程式碼等
    </c:otherwise>
    ...]
</c:choose> # 其中,<c:when>標籤可以有一個或多個,<c:otherwise>可以有0個或多個,當多個<c:when>標籤為真時,則只執行最前一個
8.4 迭代標籤
<c:forEach>標籤類似於Java中的for迴圈
<c:forEach [var = "varName"] item = "collection" [varStatus = "varStatusName"] [begin = "begin"] [end = "end"] [step = "step"]>
    標籤語句、Java程式、HTML程式碼等
</c:forEach> # 第一種形式用於在集合collection中進行迭代,begin, end 為集合中元素的下表值
<c:forEach [var = "varName"] [varStatus = "varStatusName"] [begin = "begin"] [end = "end"] [step = "step"]>
    標籤語句、Java程式、HTML程式碼等
</c:forEach> # 第二種形式用於迭代固定次數,varStatus中存放當前迭代的狀態資訊主要有4個屬性,index當前索引號, count當前迭代的次數, first當前是否是第一次迭代, last當前是否是最後一次迭代
8.4.2 <c:forTokens>
<c:forTokens>標籤用於處理由某一符號分隔的字串,從其中拆分出子字串
<c:forTokens items = "stringOfTokens" delims = "delimeters" [var = varName] [varStatus = "varStatusName"] [begin = "begin"] [end = "end"] [step = "step"]>
    標籤語句、Java程式、HTML程式碼等
</c:forTokens> # items是進行處理的字串,delims是拆分處理的分隔符,var用來存放當前迭代到所指向的成員值,varStatus存放當前迭代的狀態資訊
8.5 URL相關標籤
8.5.1 <c:import>與<c:param>
<c:import url = "urlString" [context = "context"] [var = "varName"] [scope = request|page|session|application] [charEncoding = "charEncoding"]>
    [<c:param>標籤語句]
</c:import> # 第一種形式,把檔案的內容以String型別存入變數var中
<c:import url = "urlString" [context = "context"] [varReader = "varReaderName"] [charEncoding = "charEncoding"]>
    [<c:param>標籤語句]
</c:import> # 第二種形式,把檔案的內容以Reader型別的方式向外暴露出來,以供讀取
url可以是網址,也可以是伺服器上檔案,如果以"/"開頭,表示相對Web伺服器的根目錄的路徑;<c:param>標籤語句用於嚮導入的頁面中傳入引數
8.5.2 <c:redirect>
<c:redirect>標籤用於把客戶端發來的請求重定向到另一個頁面
<c:redirect url = "urlString" [context = "context"]/>
<c:redirect url = "urlString" [context = "context"]>
    [<c:param>標籤語句]
</c:redirect> # 可以向目標URL通過<c:param>標籤帶入引數, context用於當要重定向目標網頁為其他Web應用的網頁時指出應用名
8.5.3 <c:url>
<c:url>標籤用於生成一個URL
<c:url value = "urlString" [context = "context"] var = "varName" [scope = "{page|request|session|application}"]/>
<c:url value = "urlString" [context = "context"] var = "varName" [scope = "{page|request|session|application}"]>
    [<c:param>標籤語句]
</c:url> # 可通過<c:param>標籤語句增加URL中的引數,value是要生成的URL,context用於URL為其他Web應用中的網頁情況,它指出應用名,var是存入生成的URL字串的變數名稱
8.6 國際化格式標籤庫
需在JSP頁面首部加入:
<%@taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt"%>
8.6.1 <fmt:setLocale>標籤用於設定使用者的語言國家(或地區)
<fmt:setLocale value = "localecode" [variant = "variant"] [scope = "{page|request|session|application}"]/> # localecode是語言程式碼,variant設定瀏覽器型別
常用國家或地區程式碼:
程式碼    名稱
en    英文
en_US    英文(美國)
zh_TW    中文(臺灣)
zh_CN    中文(中國)
zh_HK    中文(香港)
zh_SG    中文(新加坡)
fr    法語
de    德語
ja    日語
vi    越南語
ko    朝鮮語
8.6.2 <fmt:requestEncoding>
<fmt:requestEncoding>標籤用於設定請求中資料的字符集
<fmt:requestEncoding value = "charsetName" /> # value為要設定的字符集名稱
8.6.3 <fmt:bundle>
<fmt:bundle>標籤用於繫結資料來源.properties檔案,.properties檔案的內容形如key=value,即鍵值對,通常將.properties檔案放於當前應用的WEB-INF/classes目錄下,這樣檔案就不能直接被客戶端訪問,安全性較高
<fmt:bundle basename = "bundleResourceName" prefix = "prefix">
    標籤語句、Java程式、HTML程式碼等
</fmt:bundle> # basename是要繫結的資料來源.properties, prefix是要獲取的.properties檔案的字首
8.6.4 <fmt:message>與<fmt:param>
<fmt:message key = "messageKeyName" [bundle = "bundleResourceName"] [var = "varName"] [scope = "{page|request|session|application}"]/>
<fmt:message key = "messageKeyName" [bundle = "bundleResourceName"] [var = "varName"] [scope = "{page|request|session|application}"]>
    [<fmt:param>標籤語句]
</fmt:message> # key為鍵名稱,var用來存放取出的鍵值,<fmt:param>用於設定鍵的動態值,用法為:
<fmt:param value = "keyValue">
<fmt:param>
    keyValue
</fmt:param> # value是要設定的鍵值
8.6.5 <fmt:setBundle>
<fmt:setBundle>標籤用來設定預設的資料來源
<fmt:setBundle basename = "bundleResourceName" [var = "varName"] [scope = "{page|request|session|application}"]/> # var代表繫結的資料來源
8.6.6 <fmt:formatNumber>
<fmt:formatNumber>標籤用於根據設定的區域將資料格式化輸出
<fmt:formatNumber value = "numbericValue" # value是要格式化的數字
[type = "number|currency|percent"] # type用於指定數字的單位,number(標準數字), currency(當地貨幣), percent(百分比)
[pattern = "customPattern"] # pattern設定顯示模式
[currencyCode = "currencyCode"] # currencyCode設定ISO-4217碼
[currencySymbol = "currencySymbol"] # currencySymbol設定貨幣符號
[groupingUsed = "{true|false}"] # grouningUsed設定是否在顯示數字時分隔開
[maxIntegerDigits = "maxIntegerDigits"] # maxIntegerDigits設定最多的整數位
[minIntegerDigits = "minIntegerDigits"] # minIntegerDigits設定最少的整數位
[maxFractionDigits = "maxFractionDigits"] # maxFractionDigits設定最多的小數位數
[minFractionDigits = "minFractionDigits"] # minFractionDigits設定最少的小數位數
[var = "varName"] # var用於存放格式化後的數字
[scope = "page|request|session|application}"]/> # 設定var的有效範圍,預設值為page
<fmt:formatNumber
[type = "number|currency|percent"]
[pattern = "customPattern"]
[currencyCode = "currencyCode"]
[maxIntegerDigits = "maxIntegerDigits"]
[minIntegerDigits = "minIntegerDigits"]
[maxFractionDigits = "maxFractionDigits"]
[minFractionDigits = "minFractionDigits"]
[var = "varName"]
[scope = "{page|request|session|application}"]>
    numbericValue
</fmt:formatNumber>
8.6.7 <fmt:formatDate>
<fmt:formatDate>標籤用於格式化輸出日期和時間
<fmt:formatDate value = "date" # value是要格式化輸出的日期和時間
[type = "time|date|both"] # type設定輸出的部分(日期、時間或兩者)
[pattern = "customPattern"] # pattern定義日期和時間輸出的模式
[dateStyle = "default|short|medium|long|full"] # dateStyle設定日期輸出的格式
[timeStyle = "default|short|medium|long|full"] # timeStyle設定時間輸出的格式
[timeZone = "timeZone"] # timeZone是要設定時間的時區
[var = "varName"] # var接收格式化時的日期和時間
[scope = "{page|request|session|application}"]/> # scope設定var的有效範圍
常用日期和時間輸出模式:
模式                示例資料
yyyy.mm.dd G 'at' HH:mm:ss z    2006.04.13 公元 at 11:21:08 CST
h:mm a                11:21 上午
Hh'時', 'a, zzzz        11時, 上午, 中國標準時間
yyMMddHHmmssZ            060413112108+0800
8.6.8 <fmt:parseDate>
<fmt:parseDate>標籤用於把字串型別的日期和時間轉換成日期型資料型別
<fmt:parseDate value = "dateString"
type = "{date|time|both}"
[pattern = "customPattern"]
[dateStyle = "default|short|medium|long|full"]
[timeStyle = "default|short|medium|long|full"]
[parseLocale = "parseLocale"]
[timeZone = "timeZone"]
[var = "varName"]
[scope = "{page|request|session|application}"]/>
<fmt:parseDate
type = "{date|time|both}"
[pattern = "customPattern"]
[dateStyle = "default|short|medium|long|full"]
[timeStyle = "default|short|medium|long|full"]
[parseLocale = "parseLocale"]
[timeZone = "timeZone"]
[var = "varName"]
[scope = "{page|request|session|application}"]>
    dateString
</fmt:parseDate>
8.6.9 <fmt:parseNumber>
<fmt:parseNumber>標籤用於把字串中表示的數字、貨幣、百分比轉換成數字資料型別
<fmt:parseNumber
value = "numbericValue"
[type = "number|currency|percent"]
[pattern = "customPattern"]
[parseLocale = "parseLocal"]
[integerOnly = "true|false"]
[var = "varName"]
[scope = "{page|request|session|application}"]/>
<fmt:parseNumber
[type = "number|currency|percent"]
[pattern = "customPattern"]
[parseLocale = "parseLocale"]
[integerOnly = "true|false"] # 設定是否只輸出整數部分
[var = "varName"]
[scope = "{page|request|session|application}"]>
    numbericValue
</fmt:parseNumber>
8.6.10 <fmt:setTimeZone>
<fmt:setTimeZone>用於設定預設的時區
<fmt:setTimeZone
value = "timeZone" # value為要設定的時區
[var = "varName"] # var接收時區設定
[scope = "{page|request|session|application}"]/>
8.6.11 <fmt:timeZone>
<fmt:timeZone>標籤用於設定在本標籤體內有效的時區
<fmt:timeZone value = "timeZone">
    標籤語句、Java程式、HTML程式碼等
</fmt:timeZone>
8.7 SQL相關標籤
需在JSP頁面首部加入:
<%@taglib prefix = "sql" uri = "http://java.sun.com/jsp/jstl/sql"%>
8.7.1 <sql:setDataSource>
<sql:setDataSource>標籤用來設定要操作的資料來源
<sql:setDataSource
dataSource = "dataSource" # 已有資料來源的名稱
[var = "varName"] # 為建立起資料來源後代表此資料來源的名稱
[scope = "{page|request|session|application}"]/> # 第一種方式:使用已存在的資料來源
<sql:setDataSource
url = "jdbcURL" # 資料庫的連線字串
driver = "driverName" # 連線資料庫驅動程式的名稱
[user = "userName"]
[password = "password"]
[var = "varName"]
[scope = "{page|request|session|application}"]/> # 第二種方式:用JDBC的方式來建立起資料庫連線
8.7.2 <sql:query>
<sql:query>標籤用於查詢資料庫中的資料
<sql:query
sql = "sqlQuery" # 要查詢的SQL語句
var = "varName" # 用於存放SQL查詢的結果
[scope = "{page|request|session|application}"] # var的有效範圍
[dataSource = "dataSource"] # 連線的資料來源名稱
[maxRows = "maxRows"] # 最多可存放的記錄條數
[startRow = "startRow"]/> # 設定資料結果集從查詢結果的第幾條記錄開始
<sql:query
var = "varName"
[scope = "{page|request|session|application}"]
[dataSource = "dataSource"]
[maxRows = "maxRows"]
[startRow = "startRow"]>
    sqlQuery
</sql:query>
查詢結果存放在var中,var共有5個屬性:
1. rows: 以欄位名稱來讀取查詢結果記錄集
2. rowsByIndex:
3. columnNames: 欄位名稱集
4. rowCount: 查詢結果記錄集中記錄的條數
5. limitByMaxRows: 如果查詢到的記錄條數大於maxRows時,值為true, 否則為false
8.7.3 <sql:dateParam>與<sql:param>
<sql:dataParam>與<sql:param>標籤用於設定SQL語句中的動態值
<sql:param value = "value"/> # value是要設定的動態引數的值
<sql:param> value </sql:param>
<sql:dataParam value = "value" [type = "{timestamp|time|date}"]/> # timestamp表示日期和時間
例如:
<sql:query var = "rs">
    select * from userTable where username = ? and password = ?
    <sql:param value = "${username}"/>
    <sql:param value = "${password}"/>
</sql:query>
8.7.4 <sql:update>
<sql:update>標籤用於修改資料庫中的資料
<sql:update
sql = "sqlUpdate" # 更新資料庫的SQL語句
[var = "varName"] # 存放資料庫更新的記錄條數
[scope = "{page|request|session|application}"] # var的有效範圍
[dateSource = "dateSource"]/>
<sql:update
[var = "varName"]
[scope = "{page|request|session|application}"]
[dateSource = "dateSource"]>
    sqlUpdate
</sql:update>
8.7.5 <sql:transatciton>
<sql:transaction>標籤可保證其間的<sql:query>和<sql:update>標籤語句修改資料庫時的事務一致性
<sql:transaction
    [dataSource = "dataSource"]
    [isolation = "{read_uncommitted|read_committed|repeatable_read|serializable}"] # 設定事務的級別
    [<sql:query>標籤語句或<sql:update>標籤語句]
</sql:transaction>
8.8 XML標籤
需在JSP檔案首部加入:
<%@taglib prefix = "x" uri = "http://java.sun.com/jsp/jstl/xml"%>
8.8.1 XPath
XPath的含義是指UNIX作業系統下的目錄
用XPath方式表示XML檔案中的內容:
位置            表示方式
根元素            /
檔案元素        ./
父結點            ../
子結點            結點名稱
兄弟結點        ../結點名稱
所有同一名稱的結點    //結點名稱
屬性            @屬性名稱
全域性            *
8.8.2 <x:parse>
<x:parse>標籤用來解析XML檔案
<x:parse
{doc = "XMLDocument" | xml = "XMLDocument"} # 要解析的XML檔案內容
{var = "varName" | [scope = "{page|request|session|application}"] | varDom = "varName" [scope = "{page|request|session|application}"]} # 存放解析後的XML檔案,如果為varDom,則型別為org.w3c.dom.Document
[sustemId = "systemId"] # XML檔案的URI
[filer = "filer"]/> # 一個org.xml.sax.XMLFilter過濾器
<x:parse
{var = "varName" [scope = "{page|request|session|application}"] | varDom = "varName" [scope = "{page|request|session|application}"]}
[sustemId = "systemId"]
[filer = "filer"]>
    XMLDocument
</x:parse>
8.8.3 <x:out>
<x:out>標籤用於根據XPath表示式,輸出XML檔案中對應的內容
<x:out select = "XPathExpression" [escapeXML = "{true|false}"]/> # select為XPath表示式,escapeXML預設值為true
8.8.4 <x:set>
<x:set>標籤用於把XML檔案中的部分內容存放到一個變數中
<x:set
select = "XPathExpression"
var = "varName"
[scope = "{page|request|session|application}"]/> # select為XPath表示式,var存放從XML檔案中取出的內容
8.8.5 <x:if>
<x:if>標籤用於對XPath表示式作出判斷
<x:if
select = "XPathExpression"
var = "varName"
[scope = "{page|request|session|application}"]/>
<x:if
select = "XPathExpression" # 要判斷的XPath表示式
var = "varName" # 存放XPath表示式的結果
[scope = "{page|request|session|application}"]>
    XPathExpression為真時執行的標籤語句、Java程式、HTML程式碼等
</x:if>
8.8.6 <x:choose>, <x:when>和<x:otherwise>
<x:choose>
    <x:when>和<x:otherwise>語句
</x:choose>
<x:when select = "XPathExpression">
    標籤語句、Java程式、HTML程式碼等
</x:when>
8.8.7 <x:forEach>
<x:forEach select = "XPathExpression" [var = "varName"] [varStatus = "varStatusName"] [begin = "begin"] [end = "end"] [step = "step"]>
    標籤語句、Java程式、HTML程式碼等
</x:forEach>

第9章  過濾器與監聽器
9.1 過濾器
9.1.2 相關類介紹
開發過濾器相關的應用,主要與如下的介面或類有關:
javax.servlet包中的Filter介面、FilterConfig介面、FilterChain介面、ServletRequestWrapper類、ServletResponseWrapper類
javax.servlet.http包中的HttpServletRequestWrapper類、HttpServletResponseWrapper類
1. Filter介面
Filter介面常用方法:
(1) init(): 用來初始化過濾器
public void init(FilterConfig filterConfig) throws ServletException
(2) doFilter(): 實現對請求和響應中資料的處理
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException # request代表客戶端的請求,response代表對請求的響應,chain是過濾器鏈物件
(3) destroy(): 用於釋放過濾器中使用的資源
2. FilterConfig介面
FilterConfig介面用於在過濾器初始化時向過濾器傳遞一些資訊,介面方法有:
(1) getFilterName(): 用於得到過濾器的名字
public String getFilterName()
(2) getInitParameter(): 得到Web應用的配置檔案中配置的過濾器初始化引數值
public String getInitParameter(String name) # name為初始化引數的名字
(3) getInitParameterNames(): 得到過濾器配置的所有初始化引數名字的列舉集合
public Enumeration getInitParameterNames()
(4) getServlet(): 得到Servlet上下檔案物件
public ServletContext getServlet()
3. FilterChain介面
此介面只有一個方法:
public void doFilter(ServletRequest request, ServletResponse response) throws java.io.Exception, ServletException # 將使用過濾器鏈的下一個過濾器繼續工作
9.1.3 開發與部署方法
2. 部署過濾器
在Web應用的web.xml檔案中配置過濾器,配置方法如下:
<!--過濾器配置-->
<filter>
    <filter-name>過濾器的名稱</filter-name>
    <filter-class>過濾器的實現類</filter-class>
    <!--過濾器的初始化引數-->
    <init-param>
        <param-name>引數名稱</param-name>
        <param-value>對應的引數值</param-value>
    </init-param>
</filter>
<!--過濾器對映-->
<filter-mapping>
    <filter-name>過濾器的名稱</filter-name>
    <url-pattern>URL樣式</url-pattern>
    或
    <servlet-name>servlet名稱</servlet-name>
    <dispatcher>請求方式</dispatcher> # 請求方式有REQUEST、INCLUDE、FORWARD、ERROR四種,預設為REQUEST
</filter-mapping>
9.2 監聽器
用監聽器可以監聽Web容器中正在執行的程式,根據發生的事件作出特定的響應
9.2.2 開發與部署方法
在Web應用的web.xml檔案中配置監聽器:
<!--監聽器配置-->
<listener>
    <listener-class>
        listener.myServletContextListener
    </listener-class>
</listener> # listener元素位於所有的servlet元素之前,以及所有filter-mapping元素之後
9.2.3 ServletContext監聽器
其生命週期如同隱含物件application
1. ServletContextListener介面
(1) abstract public void contextInitialized(ServletContextEvent arg) # 通知監聽器Web應用已經載入和初始化
(2) abstract public void contextDestroyed(ServletContextEvent arg) # 通知監聽器已關閉Web應用
2. ServletContextAttributeListener介面
(1) abstract public void attributeAdded(ServletContextAttributeEvent arg) # 通知監聽器一個物件或變數被加入到application範圍
(2) abstract public void attributeReplaced(ServletContextAttributeEvent arg) # 通知監聽器一個物件或變數被更改
(3) abstract public void attributeRemoved(ServletContextAttributeEvent arg) # 通知監聽器一個物件或變數被刪除
9.2.4 HttpSession監聽器
其生命週期如同隱含變數session
1. HttpSessionBindingListener介面
(1) abstract public void valueBound(HttpSessionBindingEvent event) # 通知監聽器已繫結一個session範圍的物件或變數
(2) abstract public void valueUnbound(HttpSessionBindingEvent event) # 通知監聽器已對一個session範圍的物件或變數解除繫結
2. HttpSessionAttributeListener介面
(1) abstract public void attributeAdded(HttpSessionBindingEvent event) # 通知監聽器已加入一個session範圍的物件或變數
(2) abstract public void valueReplaced(HttpSessionBindingEvent event) # 通知監聽器已更改一個session範圍的物件或變數
(3) abstract public void valueRemoved(HttpSessionBindingEvent event) # 通知監聽器已刪除一個session範圍的物件或變數
3. HttpSessionListener介面
(1) abstract public void sessionCreated(HttpSessionEvent event) # 通知監聽器產生一個新的會話
(2) abstract public void sessionDestroyed(HttpSessionEvent event) # 通知監聽器消除一個會話
4. HttpSessionActivationListener介面
(1) abstract public void sessionDidActivate(HttpSessionEvent event) # 通知監聽器會話已變為有效狀態
(2) abstract public void sessionWillPassivate(HttpSessionEvent event) # 通知監聽器會話已變為無效狀態
9.2.5 ServletRequest監聽器
1. ServletRequestListener介面
可對請求的產生和消除進行監聽
(1) abstract public void requestInitialized(ServletRequestEvent event) # 通知監聽器一個請求物件已被載入
(2) abstract public void requestDestroyed(ServletRequestEvent event) # 通知監聽器一個請求物件已被消除
2. ServletRequestAttributeListener介面
可對request範圍的物件或變數的變化進行監聽
(1) abstract public void attributeAdded(ServletRequestAttributeEvent event) # 通知監聽器已加入一個request範圍的物件或變數
(2) abstract public void attributeReplaced(ServletRequestAttributeEvent event) # 通知監聽器已更改一個request範圍的物件或變數
(3) abstract public void attributeRemoved(ServletRequestAttributeEvent event) # 通知監聽器已刪除一個request範圍的物件或變數