javaWeb學習之jsp
1.jsp初識
概述:JSP就是Java Server Pages(java伺服器端頁面),其實就是在HTML中嵌入java程式碼
為什麼要學習jsp
SUN公司提供了動態網頁開發技術:Servlet,但是,Servlet自身有一些缺點,sun公司發現了這些問題,就提出了一個新的動態網頁開發技術jsp
Servlet的缺點:
- Servlet需要進行配置,不方便維護
- Servlet很難向網頁中輸出HTML頁面內容
jsp的執行原理
jsp檔案被翻譯成了java檔案,這個java檔案就是一個Servlet,將這個java檔案編譯生成class檔案,執行class檔案
jsp的註釋:
1.HTML部分程式碼的註釋:
2.java程式碼的註釋:<%
//單行註釋
/*多行註釋*/
/**文件註釋*/ %>
3.jsp自己獨有的註釋:<%--jsp的註釋--%>
jsp開發模式的發展(圖片來源於黑馬視訊教程截圖)
jsp實現請求轉發
前面我們的MVC開發模式中Servlet負責控制排程,也就是實現請求的轉發,那我們怎麼實現請求轉發呢?想要學習怎麼請求轉發,就得先來看看兩個方法:
- getRequestDispatcher(String path):通過Request物件獲取RequestDispatcher物件
- forword(ServletRequest request, ServletResponse response):通過RequestDispatcher物件進行請求轉發
補充:通過response物件的重定向方法sendRedirect()也可以實現頁面的跳轉,但是重定向與請求轉發是有一定區別的
請求轉發與重定向的區別:
- 請求轉發是一次請求一次響應,而重定向是兩次請求兩次響應
- 請求轉發位址列地址是不會變化的,而重定向位址列地址是會發生變化的
- 請求轉發路徑不帶工程名,重定向需要帶工程名路徑
- 請求轉發只能在本網站內部,重定向可以定向到任何網站
2.jsp的指令碼元素、指令元素
jsp的指令碼元素
概述:jsp的指令碼元素就是在jsp中嵌入java程式碼
jsp的指令碼元素的分類:
1.宣告標籤:
<%! 變數或方法宣告 %>:寫在這裡的指令碼中的程式碼,會被翻譯成Servlet內部的成員變數或成員方法
2.表示式標籤
<%= 表示式 %>:寫在這個指令碼中的程式碼,翻譯成方法內部的out.print();當中跟的內容
3.程式程式碼標籤
<% 程式程式碼 %>:寫在這個指令碼中的程式碼,翻譯成方法內部的區域性變數或方法內部程式碼片段
jsp的指令元素
指令元素的語法:<%@ 指令名稱 屬性名稱=屬性的值 屬性名稱=屬性的值 %>
jsp指令元素的分類:
- page指令:指示jsp的頁面設定屬性和行為
- include指令:指示jsp包含哪些其他頁面
- taglib指令:指示jsp頁面包含哪些標籤庫
page指令:
寫法:<%@page 屬性名=屬性值%>
作用:page指令用來定義jsp檔案的全域性屬性
page指令屬性:
- language屬性:宣告使用指令碼的語言,現在只能是java
- extends屬性:標明jsp編譯成Servlet的時候繼承的類,預設值是HttpJspBase
- session屬性:標明jsp中是否可以直接使用session物件,預設值是true
- buffer屬性:標明jsp對客戶端輸出緩衝區大小,預設是8kb
- autoFlush屬性:如果緩衝區大小溢位,是否自動刷出,預設是true
- import屬性:用於匯入java包和類,只有這個屬性可以出現多次,其他屬性都只能一次
- contentType屬性:標明jsp被瀏覽器解析和開啟的時候採用的預設的字符集
- pageEncoding屬性:jsp檔案及jsp翻譯後的servlet儲存到硬碟上採用字符集
- isErrorPage屬性:處理jsp頁面異常,預設是false,設定是否允許在頁面上顯示錯誤資訊
- errorPage屬性:處理jsp頁面異常,值就是出錯是要跳轉的頁面
- isELIgnored屬性:通知jsp是否忽略EL表示式,預設是false
include指令:
寫法:<%@include 屬性名=屬性值%>
作用:在jsp頁面中靜態包含一個檔案,同時由該jsp解析包含的檔案內容
include指令屬性:
- file屬性:指示jsp頁面包含的頁面路徑
靜態包含的原理:實際上就是複製另外一個或者幾個jsp檔案的程式碼過來這邊,然後翻譯成一個Servlet
使用靜態包含的注意地方:
- 應該將被包含的頁面的結構去掉(不去掉就會帶著head,body標籤等一起復制過來,就會導致頁面有重複的頁面結構)
- 在被包含的頁面中定義變數,在包含的頁面中還可以使用(原因是靜態包含其他頁面的jsp檔案會被翻譯成一個Servlet)
Taglib指令
寫法:<%@taglib 屬性=屬性值%>
作用:用於在jsp頁面中引入標籤庫
Taglib指令屬性:
- url屬性:引入的標籤庫的路徑
- prefix屬性:引入的標籤庫的別名
3.jsp的內建物件
概述:jsp內建物件指的就是可以直接在jsp頁面中使用的物件
jsp當中的9大內建物件
- request:從客戶端向服務端傳送請求的物件
- response:從伺服器端向客戶端做出響應的物件
- session:服務端為客戶端建立會話物件
- application:代表應用,也就是獲得的ServletContext物件
- out:向輸出流寫入內容的物件
- page:當前的jsp翻譯成Servlet後的物件引用
- pageContext:本jsp的頁面的上下文物件
- config:本jsp的ServletConfig物件
- exception:表示jsp頁面執行時產生的異常物件
jsp的9大內建物件的具體型別
- request:HttpServletRequest
- response:HttpServletResponse
- session:HttpSession
- application:ServletContext
- out:JspWriter
- page:Object
- pageContext:PageContext
- config:ServletConfig
- exception:Throwable
pageContext物件
概述:pageContext物件直接翻譯為“頁面上下文”物件,代表的的是當前頁面執行的一些屬性
pageContext物件的使用:
1.提供了page範圍的資料存取的方法
- setAttribute(String name, Object value)
- getAttribute(String name)
- removeAttribute(String name)
- findAttribute(String name):查詢屬性方法,先根據小範圍的名稱進行查詢,如果找到了就返回,如果沒有找到就會去比其大一個域的範圍進行查詢
2.通過這個物件獲得其他8個內建物件
- getRequest()
- getResponse()
- getSession()
- getServletContext()
- getOut():這個比較特殊,是來自pageContext父類JspContext的方法
- getPage()
- getServletConfig()
- getException()
jsp的四個作用範圍
1.PageScope:頁面範圍,指的是在當前頁面內有效,出了這個頁面,用pageContext儲存的資料就無效了
2.RequestScope:請求範圍,從客戶端向服務端傳送一次請求,伺服器對這次請求做出了響應之後,用request儲存的資料就無效了
3.SessionScope:會話範圍,每個瀏覽器向伺服器傳送請求(多次請求),直到該會話結束)
4.ApplicationScope:應用範圍,在整個應用中任意的地方都可以獲取
通過pageContext來設定四個範圍:
- pageContext.setAttribute(String name, Object value)
- pageContext.setAttribute(String name, Object value, PageContext.ReQuEST_SCOPE)
- pageContext.setAttribute(String name, Object value, PageCOntext.SESSION_SCOPE)
- pageContext.setAttribute(String name, Object value, PageContext.APPLICATION_SCOPE)
4.jsp的動作標籤
概述:jsp的動作標籤用於在jsp頁面中提供業務邏輯功能,避免在jsp頁面直接編寫java程式碼,造成jsp頁面難以維護
常用的動作標籤
- jsp:forward/:請求轉發
- jsp:include/:包含(動態包含)
- jsp:param/:多個頁面之間傳遞引數
動態包含的原理
在jsp程式執行時,完成包含操作,被包含的jsp會獨立翻譯執行,動態包含,包含的目標是jsp的執行結果
5.EL
概述:EL就是Expression Language(表示式語言),它的出現是為了使jsp寫起來更加簡單,表示式語言的靈感來自於ECMAScript和Xpath表示式語言,它提供了在jsp中簡化表示式的方法,讓jsp的程式碼更加簡化
為什麼要學習EL
EL和JSTL一起使用取代jsp頁面中嵌入java程式碼的寫法
EL的功能
- EL獲取資料
- EL執行運算
- EL獲取web開發常用的物件
- EL呼叫java方法
EL語法
${EL表示式}
EL如何獲取資料
EL表示式語句在執行的時候,會呼叫pageContext.findAttribute()方法,分別從page、request、session、application範圍查詢相應物件,找到就會返回相應物件,找不到返回""(空的字串),EL所獲取的資料需要在這四個作用範圍中
獲取陣列和集合中的資料:
- 獲取陣列的資料:通過中括號裡面寫下標即可獲取,如${array[0]}
- 獲取集合中的資料:
- 獲取List集合中的資料:也是通過中括號裡面寫下標即可獲取,如${list[0]}
- 獲取Map集合中的資料:通過“.”獲取Map集合的資料,如果Map的key中包含了特殊字元,則需要使用中括號裡面寫下標來獲取,如${map.arg},${map["arg"]}
EL執行運算
- 執行算數運算
- 執行關係運算
- 執行邏輯運算
- 執行三元運算
- 空運算
程式碼示例:
<h3>執行算數運算</h3>
<%
pageContext.setAttribute("n1", "10");
pageContext.setAttribute("n2", "20");
pageContext.setAttribute("n3", "40");
pageContext.setAttribute("n4", "30");
%>
${ n1+n2 }
<h3>執行關係運算符</h3>
${n1 > n2}--${n1 gt n2}<br>
${n1 < n2}--${n1 lt n2}<br>
${n1 == n2}--${n1 eq n2}<br>
${n1 >= n2}--${n1 le n2}<br>
${n1 <= n2}--${n1 ge n2}<br>
${n1 != n2}--${n1 ne n2}<br>
<h3>執行邏輯運算子</h3>
${n1 > n2 && n3 > n4}--${n1 > n2 and n3 > n4} <br>
${n1 > n2 || n3 > n4}--${n1 > n2 or n3 > n4} <br>
${! (n1 > n2)}--${not (n1 > n2)} <br>
<h3>三元運算子</h3>
${n1 > n2 ? "n1大於n2":"n1小於n2"}<br>
<h3>空運算子</h3>
${empty n1}<br>
EL獲取web開發常用物件
- pageContext:相當於jsp內建物件中的pageContext
- pageScope:獲取指定域下的名稱和資料
- requestScope:獲取指定域下的名稱和資料
- sessionScope:獲取指定域下的名稱和資料
- applicationScope:獲取指定域下的名稱和資料
- param:在頁面中接收請求引數(接收一個名稱對應一個值的引數)
- paramValues:在頁面中接收請求引數(接收一個名稱對應多個值的引數)
- header:在頁面上獲取請求頭(獲取一個key對應一個value的頭)
- headerValues:在頁面上獲取請求頭(獲取一個key對應多個value的頭)
- cookie:訪問cookie的名稱和值,如${cookie.key.name},${cookie.key.value}
- initParam:獲取全域性初始化引數的值
6.JSTL
概述:JSTL(Java server pages standarded tag library,即JSP標準標籤庫)是由JCP(Java community Proces)所制定的標準規範,它主要提供給Java Web開發人員一個標準通用的標籤庫,並由Apache的Jakarta小組來維護。開發人員可以利用這些標籤取代JSP頁面上的Java程式碼,從而提高程式的可讀性,降低程式的維護難度。
為什麼學習JSTL
主要用於與EL來取代傳統頁面上直接嵌入java程式碼的寫法,提升程式可讀性、維護性和方便性
JSTL的標籤庫有哪些
- c標籤(core標籤庫)
- fmt標籤(國際化標籤庫)
- xml標籤
- sql標籤
- jstl函式庫(EL函式)
JSTL的基本使用步驟
-
引入jar包
- standard.jar
- jstl.jar
-
新建jsp頁面
-
引入標籤庫
- 通過<%@ taglib %>來引入
-
使用JSTL
7.監聽器
概述:監聽器就是一個實現了特定介面的java類,這個java類用於監聽另一個java類的方法呼叫或者屬性的改變,當被監聽物件發上上述事件後,監聽器某個方法就會被立即執行
監聽器的用途:
用於監聽其他物件的變化的,主要應用在圖形介面開發上,如java中的GUI和安卓開發
監聽器的術語:
- 事件源:指的是被監聽物件
- 監聽器:指的是負責監聽的物件
- 事件源和監聽器繫結
- 事件:指的是事件源物件的改變--主要功能是獲得事件源物件
Servlet中的監聽器
概述:在Servlet中定義了多種型別的監聽器,它們用於監聽的事件源分別是ServletContext,HttpSession,ServletRequest這三個物件
Servlet中的監聽器的分類:
- 監聽三個域物件的建立和銷燬的監聽器(三個)
- 監聽三個域物件的屬性變更(屬性新增、移動、替換)的監聽器(三個)
- 監聽HttpSession中的JavaBean的狀態改變(鈍化、活化、繫結、解除繫結)的監聽(兩個)
ServletContextListener監聽器
作用:用來監聽ServletContext域物件的建立和銷燬
ServletContext的建立與銷燬:
- 在伺服器啟動的時候,為每個web應用建立單獨的ServletContext物件
- 在伺服器關閉的時候,或者專案從web伺服器中移除的時候
使用例項:
//MyServletContextListener.java
package cn.luyi.ServletListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
//監聽ServletContext的銷燬
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext物件被銷燬了");
}
//監聽ServletContext的建立
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext物件被建立了");
}
}
//web.xml關於listener的配置
<listener>
<listener-class>cn.luyi.ServletListener.MyServletContextListener</listener-class>
</listener>
HttpSessionListener監聽器
作用:用來監聽HttpSession物件的建立和銷燬
HttpSession的建立和銷燬:
- 伺服器端第一次呼叫getSession()方法時建立
- 非正常關閉伺服器時銷燬(正常關閉伺服器時session會被序列化)
- Session過期時也會銷燬
- 手動呼叫session.invalidate()方法時銷燬
程式碼例項:
//web.xml
<listener>
<listener-class>cn.luyi.ServletListener.MyHttpSessionListener</listener-class>
</listener>
//MyHttpSessionListener
package cn.luyi.ServletListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener {
//監聽HttpSession的建立
public void sessionCreated(HttpSessionEvent hse) {
System.out.println("HttpSession被建立");
}
//監聽HttpSession的銷燬
public void sessionDestroyed(HttpSessionEvent hse) {
System.out.println("HttpSession被銷燬");
}
}
問題:
- 訪問HTML檔案是否建立session:不會
- 訪問jsp是否建立session:會
- 訪問servlet是否建立session:不會
ServletRequestListener監聽器
作用:使用者監聽ServletRequest物件的建立和銷燬
ServletRequest物件的建立和銷燬
- 從客戶端向伺服器傳送一次請求,伺服器就會建立request物件
- 伺服器對這次請求作出了響應之後,request物件就銷燬了
程式碼示例:
//web.xml
<listener>
<listener-class>cn.luyi.ServletListener.MyServletRequestListener</listener-class>
</listener>
//MyServletRequestListener.java
package cn.luyi.ServletListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyServletRequestListener implements ServletRequestListener {
//監聽ServletRequest物件的銷燬
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("ServletRequest物件被銷燬");
}
//監聽ServletRequest物件的建立
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("ServletRequest物件被建立");
}
}
問題:
- 訪問HTML頁面是否會建立請求物件:會
- 訪問jsp頁面是否會建立請求物件:會
- 訪問Servlet是否會建立請求物件:會
監聽三個域物件的屬性變更的監聽器
- ServletContextAttributeListener:監聽servletContext物件中的屬性變更(屬性新增、移除、替換)
- HttpSessionAttributeListener:監聽HttpSession物件中的屬性變更(屬性新增、移除、替換)
- ServletRequestAttributeListener:監聽ServletRequest物件中的屬性變更(屬性新增、移除、替換)
程式碼示例:
//web.xml
<listener>
<listener-class>cn.luyi.ServletListener.MyHttpSessionAttributeListener</listener-class>
</listener>
//MyHttpSessionAttributeListener.java
package cn.luyi.ServletListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
//監聽HttpSession的屬性是否被新增
public void attributeAdded(HttpSessionBindingEvent hse) {
System.out.println("向session中添加了屬性");
}
////監聽HttpSession的屬性是否被移除
public void attributeRemoved(HttpSessionBindingEvent hse) {
System.out.println("從session中移除了屬性");
}
//監聽HttpSession的屬性是否被替換
public void attributeReplaced(HttpSessionBindingEvent hse) {
System.out.println("向session中替換了屬性");
}
}
監聽HttpSession中java類狀態改變的監聽器
概述:儲存在Session域中的java類可以有多種狀態,包括繫結到session中,從session中解除繫結,隨session物件持久化到一個儲存裝置中(鈍化),隨session物件從一個儲存裝置中恢復(活化),Servlet對方中定義了兩個特殊的監聽的介面來幫助java類瞭解自己在session域中的狀態:
- HttpSessionBindingListener介面:監聽HttpSession中java類與session的繫結與解除繫結
- HttpSessionActivationListener介面:監聽HttpSession中java類中的鈍化和活化監聽器
實現這兩個類不需要在web.xml中進行配置
HttpSessionBindingListener監聽器的使用例項:
package cn.luyi.ServletListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSessionBindingListener {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//監聽javabean是否與session繫結
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("User與session綁定了");
}
//監聽javabean是否與session解除繫結
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("User與session解除綁定了");
}
}
HttpSessionActivationListener監聽器的使用示例:
程式碼例項:
package cn.luyi.ServletListener;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
public class Person implements HttpSessionActivationListener, Serializable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//監聽這個Prson類是否被活化了
public void sessionDidActivate(HttpSessionEvent arg0) {
System.out.println("user被活化(反序列化)了");
}
//監聽這個Prson類是否被鈍化了
public void sessionWillPassivate(HttpSessionEvent arg0) {
System.out.println("user被鈍化(序列化)了");
}
}
補充:當伺服器正常關閉時,儲存在session裡面的資料就會被鈍化;當重新啟動伺服器時,session裡面的資料就會被活化了
配置完成序列化與反序列化
配置的程式碼:
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="mysession"></Store>
</Manager>
</Context>
以上程式碼的配置可以配置在:
- tomcat/conf/context.xml:所有tomcat下虛擬主機和虛擬目錄下的工程
- tomcat/conf/Catalina/localhost/context.xml:localhost虛擬主機下的所有專案會序列化
- 工程名/META-INF/context.xml:當前工程才會序列化session
8.Filter過濾器
概述:Filter稱為過濾器,它是Servlet技術中最實用的技術,web開發人員通過Filter技術,對web伺服器所管理的資源(jsp,servlet,靜態圖片html檔案)進行攔截,從而實現一些特殊的功能。Filter就是過濾從客戶端向伺服器傳送的請求
Filter的使用步驟
- 編寫一個類實現Filter介面
- 對過濾器進行配置
程式碼示例:
web.xml對Filter的配置
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.luyi.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//FilterDemo.java
package com.luyi.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterDemo implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("FilterDemo執行了...");
//放行
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
FilterChain物件
概述:FilterChain過濾器鏈,在一個web應用中,可以開發編寫多個Filter,這些Filter組合起來稱為一個過濾器鏈,web伺服器根據Filter在web.xml檔案中的註冊順序(mapping的配置順序)決定先呼叫哪個Filter,依次呼叫後面的過濾器,如果沒有下一個過濾器,呼叫目標資源
使用案例:
//web.xml配置三個過濾器
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>com.luyi.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>FilterDemo2</filter-name>
<filter-class>com.luyi.filter.FilterDemo2</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>FilterDemo3</filter-name>
<filter-class>com.luyi.filter.FilterDemo3</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo3</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//三個過濾器
//FilterDemo.java
package com.luyi.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterDemo implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("FilterDemo執行了...");
//放行
chain.doFilter(request, response);
System.out.println("FilterDemo執行結束了");
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
//FilterDemo2.java
package com.luyi.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterDemo2 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("FilterDemo2執行了");
chain.doFilter(request, response);
System.out.println("FilterDemo2執行結束了");
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
//FilterDemo3.java
package com.luyi.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterDemo3 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("FilterDemo3執行了");
chain.doFilter(request, response);
System.out.println("FilterDemo3執行結束了");
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
//當訪問當前工程下的資源時,就會向控制檯輸出:
FilterDemo執行了...
FilterDemo2執行了
FilterDemo3執行了
FilterDemo3執行結束了
FilterDemo2執行結束了
FilterDemo執行結束了
Filter的生命週期
Filter的建立和銷燬是由web伺服器負責,web應用程式啟動的時候,web伺服器建立Filter的例項物件,並呼叫其init方法進行初始化(filter物件只建立一次,init方法也只會執行一次)
每當filter進行攔截的時候,都會執行doFilter的方法
當伺服器關閉的時候,應用從伺服器中移除的時候,伺服器就會銷燬Filter物件
FilterConfig物件
作用:用來獲取Filter的相關的配置的物件
FilterConfig的API
- String getFilterName():返回過濾器的名字
- String getInitParameter(String name):獲取初始化引數的值
- Enumeration getInitParameterNames():獲取所有的初始化引數名稱
Filter的相關配置
1.
- 完全路徑匹配
- 目錄匹配
- 副檔名匹配
2.
- 專門以Servlet的配置的名稱攔截servlet
3.
- REQUEST:預設值,預設過濾器攔截的就是請求
- FORWARD:攔截轉發
- INCLUDE:頁面包含的時候進行攔截
- ERROR:頁面出現全域性錯誤頁面跳轉的時候進行攔截