1. 程式人生 > 實用技巧 >javaWeb學習之jsp

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程式執行時,完成包含操作,被包含的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的基本使用步驟

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的配置的名稱攔截servlet

3.的配置

  • REQUEST:預設值,預設過濾器攔截的就是請求
  • FORWARD:攔截轉發
  • INCLUDE:頁面包含的時候進行攔截
  • ERROR:頁面出現全域性錯誤頁面跳轉的時候進行攔截

10.jspMVC模式開發案例(登入案例):

github地址:https://github.com/luyi02/jsp_mvc_demo/