JavaWeb三大組件(Servlet、Filter、Listener)

来源:https://www.cnblogs.com/jadite/archive/2022/12/07/16951328.html
-Advertisement-
Play Games

1.異常處理能夠使一個方法給它的調用者拋出一個異常。 2.Java異常是派生自java.lang.Throwable的類的實例。Java提供大量預定義的異常類,例如,Error、 Exception、RuntimeException、ClassNotFoundException、Nul1Pointe ...


前言

JavaWeb三大組件指的是:Servlet 程式、Filter 過濾器、Listener 監聽器,它們在JavaWeb開發中分別提供不同的功能,然而很多人有隻用過Servlet、Filter,很少接觸到Listener,甚至有些人對然而很多人有隻用過Servlet都不熟悉,因為在企業開發中,都是使用框架的封裝好的,很少接觸到原生的JavaWeb組件,充其量就是使用Filter攔截請求,過濾響應,所以很多人上來就直接學框架。

其實這種做法很不可取,雖然隨著技術的發展,已經沒有人再使用原生JavaWeb開發了,加之前後端分離,像JSP、JDBC等技術都沒有了專門學習的必要了。但是JavaWeb的三大組件卻是十分重要,框架都是對原生JavaWeb進行封裝的結果,像SpringMVC的核心就是Servlet,涉及到Listener的框架就更多了,而Filter不僅在框架使用,日常開發中也經常被用到,所以要深入理解框架,就必須熟練掌握JavaWeb的三大組件。

一、Servlet 程式

Servlet是什麼?

Servlet是JavaEE規範(介面)之一;
Servlet是運行在伺服器(Web容器Tomcat等)上的一個 java 小程式,它用來接收客戶端發送過來的請求進行處理,並響應數據給客戶端
Servlet及相對的對象,都由Tomcat創建,我們只是使用。

Servlet需要完成3個任務:

  1. 接收請求:將客戶端發送過來的請求封裝成ServletRequest對象(包含請求頭、參數等各種信息)
  2. 處理請求:在service方法中接收參數,並且進行處理請求。
  3. 數據響應:請求處理完成後,通過轉發(forward)或者重定向(redirect)到某個頁面。
    轉發(forward)或者重定向(redirect)的區別?
    本質:forward是HttpServletRequest的方法,redirect是HttpServletResponse的方法。
    現象及結果:
    1. forward客戶端只發了一次請求,在服務端進行轉發行為,可以共用數據(request中參數),瀏覽器URL不改變。
    2. redirect是服務端向客戶端完成響應後,客戶端再次發起一個請求,不可以共用數據(request中參數),請求了兩次,瀏覽器URL改變。
    

Servlet的生命周期

  1. 執行 Servlet 構造器方法
    第一步,在web.xml中的servlet中配置 load-on-startup 的值 ≥ 0 時,表示應用啟動時就創建這個servlet。否則,第一次訪問的時候調用。

  2. 執行 init 初始化方法
    第二步,第一次訪問的時候調用。

  3. 執行 service 方法
    第三步,每次訪問都會調用。

  4. 執行 destroy 銷毀方法
    第四步,在 web 工程停止的時候調用。

通過實現 Servlet 介面 實現Servlet程式

  1. 實現Servlet介面,重寫service方法,處理請求,並響應數據
  2. 在web.xml中配置servlet程式的訪問地址。

web.xml 中的配置:

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.demo.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

通過繼承 HttpServlet 實現Servlet程式(推薦,一般開發中使用這種方式)

  1. 繼承 HttpServlet類,按業務需求重寫doGet 或 doPost 方法,處理請求
  2. 到 web.xml 中的配置 Servlet 程式的訪問地址

代碼比實現Servlet介面的方式更加簡單,不需要進行請求的類型轉換,配置與實現Servlet介面的方式一樣,所以這裡不做演示

ServletConfig(Servlet程式的配置信息類)

在Servlet 程式創建時,就會創建一個對應的 ServletConfig 對象。

它的三大作用:

  1. 獲取web.xml 中 Servlet 程式的別名 servlet-name 的值
  2. 獲取web.xml 中 Servlet 程式的獲取初始化參數 init-param
  3. 獲取 ServletContext 對象

ServletContext (Servlet上下文) 介面

  1. 每個web項目只有一個ServletContext對象,在web工程部署啟動的時候創建,在工程停止的時候關閉。
  2. ServletContext 對象是一個域對象(可以像Map一樣存儲數據的對象。域指的是作用域,這裡是整個web工程)。

ServletContext 類的四個作用:

  1. 獲取 web.xml 中配置的上下文參數 context-param
  2. getContextPath()獲取當前的工程路徑,格式: /工程路徑
  3. getRealPath()獲取工程部署後在伺服器硬碟上的絕對路徑
  4. 像 Map 一樣存取數據

HttpServletRequest 和 HttpServletResponse

HttpServletRequest

HttpServletRequest繼承了ServletRequest,每次請求進入tomcat伺服器,tomcat容器就會把請求過來的 HTTP 協議信息解析好封裝到 Request 對象中。然後傳遞到 service 方法(doGet 和 doPost)中給我們使用。我們可以通過 HttpServletRequest 對象,獲取到所有請求的信息

HttpServletResponse

HttpServletResponse 類和 HttpServletRequest 類一樣。每次請求進來,Tomcat 伺服器都會創建一個 Response 對象傳遞給 Servlet 程式去使用。通過 HttpServletResponsee 對象來進行設置返回給客戶端的信息

解決請求的中文亂碼

  1. Get請求:獲取請求參數,先以 iso8859-1 進行編碼,再以 utf-8 進行解
  2. Post請求:調用req.setCharacterEncoding("UTF-8"), 設置請求體的字元集為 UTF-8;

解決響應的中文亂碼

方案一(推薦):

// 它會同時設置伺服器和客戶端都使用 UTF-8 字元集,還設置了響應頭
// 此方法一定要在獲取流對象之前調用才有效
resp.setContentType("text/html; charset=UTF-8")

方案二(不推薦):

// 設置伺服器字元集為 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通過響應頭,設置瀏覽器也使用 UTF-8 字元集
resp.setHeader("Content-Type", "text/html; charset=UTF-8"

Filter

Filter 是JavaEE規範(介面)之一;
Filter 過濾器它的作用是:攔截請求,過濾響應。

常見應用場景:
1、許可權檢查
2、日記操作
3、事務管理
……等等

Filter 過濾器的使用步驟:

1、實現 Filter 介面,實現過濾方法 doFilter()
2、到 web.xml 中去配置 Filter 的攔截路徑

web.xml 中的配置:

<filter>
    <filter-name>AdminFilter</filter-name>
    <filter-class>com.demo.filter.AdminFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AdminFilter</filter-name>
    <url-pattern>/admin/*</url-pattern>
</filter-mapping>

Filter 的生命周期

  1. 構造器方法
  2. init 初始化方法
    第 1,2 步,在 web 工程啟動的時候執行(Filter 已經創建)
  3. doFilter 過濾方法
    第 3 步,每次攔截到請求,就會執行
  4. destroy 銷毀
    第 4 步,停止 web 工程的時候,就會執行(停止 web 工程,也會銷毀 Filter 過濾器)

FilterConfig(Filter過濾器配置類)

Tomcat 每次創建 Filter 的時候,也會同時創建一個 FilterConfig 類,這裡包含了 Filter 配置文件的配置信息。

FilterConfig 類的作用是獲取 filter 過濾器的配置內容:

  1. 獲取 Filter 的名稱 filter-name 的內容
  2. 獲取在 Filter 中配置的 init-param 初始化參數
  3. 獲取 ServletContext 對象

FilterChain 過濾器鏈

在多個Filter執行的時候,它們執行的優先順序由它們在web.xml中從上到下配置的filter-mapping順序決定,與filter的配置順序無關!!!

過濾器鏈(多個Filter執行)的特點:

  1. 所有filter和目標資源預設都執行在一個線程中。
  2. 多個filter共同執行的時候,它們使用的是同一個Request對象。

Filter 的3種攔截路徑匹配規則:

  • 精確匹配 /target.jsp
  • 目錄匹配 /admin/*
  • 尾碼名匹配 *.html
    Filter 過濾器它只關心請求的地址是否匹配,不關心請求的資源是否存在!!!

Listener

用於對其他對象身上發生的事件或狀態改變進行監聽和相應處理的對象,當被監視的對象發生情況時,立即採取相應的行動。本質是觀察者模式
Servlet監聽器:Servlet規範中定義的一種特殊類,它用於監聽Web應用程式中的ServletContext,HttpSession 和HttpServletRequest等域對象的創建與銷毀事件,以及監聽這些域對象中的屬性發生修改的事件。

監聽器分為3類

image

  • 域對象監聽器
  • 域對象的屬性域監聽器
  • Session域中數據的監聽器

八大監聽器

  1. ServletContextListener
    監聽ServletContext對象的創建與銷毀

在SpringMVC中,有個ContextLoaderListener,這個監聽器就實現了ServletContextListener介面,表示對ServletContext對象本身的生命周期進行監控
2. HttpSessionListener
監聽HttpSession對象的創建與銷毀
3. ServletRequestListener
監聽ServletRequest對象的創建與銷毀
4. ServletContextAttributeListener
監聽ServletContext中屬性的創建、修改和銷毀
5. HttpSessionAttributeListener
監聽HttpSession中屬性的創建、修改和銷毀
6. ServletRequestAttributeListener
監聽ServletRequest中屬性的創建、修改和銷毀
7. HttpSessionBindingListener
監聽某個對象在Session域中的創建與移除
8. HttpSessionActivationListener
監聽某個對象在Session中的序列化與反序列化。

Listener 監聽器的使用步驟:

  1. 實現八大監聽器中相應一種,重寫相應的方法
  2. 到 web.xml 中去配置 Listener

web.xml 中的配置:

<listener>
    <listener-class>com.demo.listener.HelloListener</listener-class>
</listener>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 示例: 地圖文件下載地址:https://gitcode.net/mirrors/fuhang-lm/echarts?utm_source=csdn_github_accelerator&from_codechina=yes 這裡以北京市地圖為例,如果是其他省份或者全國,下載對應的js文件並引入系統 ...
  • 自 90 年代初開啟 PC 時代以來,隨著移動網路的快速普及,在 2010 年左右,進入移動時代、IOT 時代,各種移動互聯設備不斷涌現,除了最常見的 PC、Pad、智能手機外,它還可能是小小的一塊智能手錶,也可以是一個大屏終端。智能設備層出不窮,填滿了人們生活的各個角落,設備的系統類型、屏幕大小等... ...
  • 力扣14 尋找字元串數組中最長公共首碼 題目: 編寫一個函數來查找字元串數組中的最長公共首碼。 如果不存在公共首碼,返回空字元串 ""。 示例 1: 輸入:strs = ["flower","flow","flight"] 輸出:"fl" 示例 2: 輸入:strs = ["dog","raceca ...
  • 知識來源:https://www.imooc.com/learn/1304 https://www.runoob.com/cplusplus/cpp-tutorial.html 編程第一步導入頭文件: #include <stdio.h> std=standard io= into out #inc ...
  • 1.局部變數和全局變數 在函數外定義的不可變數據類型,在函數裡面是可讀不可寫在函數外定義的可變數據類型,在函數裡面可讀可寫不可變類型傳入函數,進行的操作不會影響到外面的變數但是當我們聲明一個變數為全局變數後,進行的操作會影響到函數外的變數 可變數據類型,傳入和直接使用都會改變原本的數據不可變數據類型 ...
  • 目錄 一.OpenGL 透明度 1.IOS Object-C 版本 1.Windows OpenGL ES 版本 2.Windows OpenGL 版本 二.OpenGL 透明度 GLSL Shader 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> ...
  • "Good code is its own best documentation." - Steve McConnell “好代碼本身就是最好的文檔。” —— 史蒂夫·麥克康奈爾 0x00 大綱 0x01 前言 數據與結構的解耦 在上篇文章,我們通過將鏈表的節點放在具體數據類型的結構體內,這樣,抽象 ...
  • @(文章目錄) 前言 為了提高伺服器的利用率,且便於項目部署及發佈,伺服器採用docker部署多個項目jar包。該項目採用ssm+shiro+mysql+redis+mongdb等。 備註:本文以CentOs 7為例。 一、下載安裝docker: 1.前提工作 1.1 查看linux版本 Docke ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...