Java-servlet(完結篇)過濾器亂碼解決與監聽器

Java-servlet(完結篇)過濾器亂碼解決與監聽器

  • 前言
  • 一、過濾器亂碼解決
  • 二、監聽器
    • 1. HttpSessionListener
    • 2. ServletContextListener
    • 3. ServletRequestListener
  • 三、監聽器的使用場景
  • Java-servlet 結語


前言

  • 在之前的 Java Servlet 學習中,我們已經熟悉了 Servlet 的基礎配置、生命周期、請求響應處理,以及 Java Servlet 環境的配置,還學習了過濾器、請求調度程序和 Servlet 線程等知識
  • 今天,我們繼續深入探討過濾器和監聽器,這兩個在 Java Web 開發中極為重要的部分

我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-servlet文章專欄
歡迎來閱讀指出不足
https://blog.csdn.net/2402_83322742/category_12907265.html?spm=1001.2014.3001.5482


一、過濾器亂碼解決

  • 在Web開發里,亂碼問題常常讓人頭疼。
  • 不過,利用過濾器能有效解決這個問題。下面是一段解決亂碼問題的過濾器代碼:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("執行了過濾器-FilterDemo3");// 先讓請求通過過濾器鏈,處理后續的過濾器或目標資源filterChain.doFilter(servletRequest, servletResponse);// 設置響應內容類型為HTML,字符編碼為UTF-8servletResponse.setContentType("text/html;charset=utf-8");// 將ServletRequest強轉為HttpServletRequest,方便后續操作HttpServletRequest request = (HttpServletRequest) servletRequest;// 再次通過過濾器鏈,保證請求和響應都得到完整處理filterChain.doFilter(servletRequest, servletResponse);
}
  • 這段代碼的過濾器,先讓請求在過濾器鏈中傳遞,然后設置響應編碼為UTF - 8,避免響應內容出現亂碼
  • 同時,再次調用過濾器鏈,確保整個請求和響應過程的完整性。

二、監聽器

  • 監聽器是Servlet規范里的重要組件,能監聽Web應用中的各種事件,并在事件發生時執行相應操作。
  • 監聽器有23種模式,下面介紹幾種常用的監聽器。

1. HttpSessionListener

用于監聽HttpSession的創建和銷毀事件。代碼示例如下:

package javax.servlet.http;
import java.util.EventListener;
// HttpSessionListener繼承自EventListener
public interface HttpSessionListener extends EventListener {// 當HttpSession創建時調用此方法void sessionCreated(HttpSessionEvent var1);// 當HttpSession銷毀時調用此方法void sessionDestroyed(HttpSessionEvent var1);
}

使用時,要在web.xml文件中注冊監聽器:

<listener><listener-class>listener.MySessionListener</listener-class>
</listener>

然后實現自定義的監聽器類MySessionListener:

package listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener {// 當HttpSession創建時,打印日志@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("session Created");}// 當HttpSession銷毀時,打印日志@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("session Destroyed");}// 這里額外重寫一個處理屬性添加的方法,雖然接口未定義,但可按需添加處理邏輯@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {System.out.println("attribute added");}
}

2. ServletContextListener

用于監聽ServletContext的創建和銷毀事件

  • ServletContext代表整個Web應用的上下文,通過它可以獲取Web應用的初始化參數、共享資源等。示例代碼如下:
package javax.servlet;
import java.util.EventListener;
public interface ServletContextListener extends EventListener {// 當ServletContext創建時調用此方法void contextInitialized(ServletContextEvent sce);// 當ServletContext銷毀時調用此方法void contextDestroyed(ServletContextEvent sce);
}

在web.xml中注冊:

<listener><listener-class>listener.MyServletContextListener</listener-class>
</listener>

實現自定義的監聽器類:

package listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 在Web應用啟動時執行的操作,比如初始化數據庫連接池System.out.println("ServletContext初始化了");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 在Web應用關閉時執行的操作,比如關閉數據庫連接池System.out.println("ServletContext銷毀了");}
}

3. ServletRequestListener

用于監聽ServletRequest的創建和銷毀事件。

  • ServletRequest代表客戶端的一次請求,通過監聽它的生命周期,可以在請求處理前后進行一些通用操作。示例代碼如下:
package javax.servlet;
import java.util.EventListener;
public interface ServletRequestListener extends EventListener {// 當ServletRequest創建時調用此方法void requestInitialized(ServletRequestEvent sre);// 當ServletRequest銷毀時調用此方法void requestDestroyed(ServletRequestEvent sre);
}

在web.xml中注冊:

<listener><listener-class>listener.MyServletRequestListener</listener-class>
</listener>

實現自定義的監聽器類:

package listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyServletRequestListener implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent sre) {// 在請求開始處理時執行的操作,比如記錄請求開始時間System.out.println("請求開始處理");}@Overridepublic void requestDestroyed(ServletRequestEvent sre) {// 在請求處理結束時執行的操作,比如記錄請求處理時間System.out.println("請求處理結束");}
}

三、監聽器的使用場景

  1. 統計在線用戶數量:利用HttpSessionListener,在sessionCreated方法中讓在線用戶數加1,在sessionDestroyed方法中減1,從而實時統計在線用戶數量。
  2. 記錄用戶登錄和退出時間:在HttpSession創建時記錄登錄時間,銷毀時記錄退出時間,便于分析用戶行為。
  3. 資源初始化和銷毀:借助ServletContextListener,在Web應用啟動時初始化全局資源,如數據庫連接池;在應用關閉時釋放資源,確保資源管理得當。
  4. 請求日志記錄:通過ServletRequestListener,在請求開始和結束時記錄日志,方便排查問題和監控系統運行狀態。

Java-servlet 結語

  • 至此,Java Servlet 的入門講解暫告一段落。通過這部分內容,我們已經搭建起 Web 開發的基礎框架,理解了服務端與客戶端交互的核心邏輯。

接下來,我們將深入探討 JSP(Java 服務器頁面)MySQL 數據庫 的核心知識。

  • JSP 作為 Servlet 的延伸,能更便捷地實現動態頁面渲染。

  • 而 MySQL 則是企業級應用中最常用的關系型數據庫之一。

  • 三者結合(Servlet 處理請求邏輯、JSP 構建動態視圖、MySQL 存儲數據),將形成一套完整的 Web 后端開發體系——這正是支撐現代 Web 項目的“三板斧”

掌握這三項核心技術,不僅能為前端開發提供堅實的后端支持,更能讓你在構建完整 Web 應用時游刃有余。無論是小型項目的快速落地,還是大型系統的架構設計,它們都是不可或缺的基石

后續課程中,我們將通過實戰案例串聯知識,幫助大家更好地理解和應用。

  • 期待與你繼續探索,一起夯實 Web 開發的核心能力!

在這里插入圖片描述
在這里插入圖片描述


以上就是這篇博客的全部內容,接下來的博客里我們將陸續探索JSP與MySQL的更多精彩內容。

我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-servlet文章專欄
歡迎來閱讀指出不足
https://blog.csdn.net/2402_83322742/category_12907265.html?spm=1001.2014.3001.5482

非常感謝您的閱讀,喜歡的話記得三連哦

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76315.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76315.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76315.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為了避免unboundLocalError和為什么X的值一直不變呢?

## 1.為了避免unboundLocalError 發生unboundLocalError&#xff01; def generate_integer(level):if level 1:X randint(1,9)return X這里出錯的原因在于&#xff0c;一旦if 后面的條件沒有成立&#xff0c;然后X根本沒出生&#xff0c;然后你去使用它&#xff0c;這是有…

opencv-python基礎

一.opencv-python簡述 其使用Numpy&#xff0c;所有OpenCV數組結構都轉換為Numpy數組&#xff0c;是一個高度優化的數據庫操作庫。 二.環境安裝 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python 三.基本概念 - 像素是圖像的基本單元&#xff0c;每個…

ReentrantLock 實現公平鎖和非公平鎖的原理!

&#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&#xff0c;可以多多支持一下&#xff0c;感謝&#x1f917;&#xff01; &#x1f31f;了解 ThreadLocal請看&#xff1a; ThreadLocal有趣講解&#xff0c;小白也能聽懂&#xff…

NLP高頻面試題(四十一)——什么是 IA3 微調?

隨著大型語言模型的廣泛應用,如何高效地將這些模型適配到特定任務中,成為了研究和工程實踐中的重要課題。IA3(Infused Adapter by Adding and Adjusting)微調技術,作為參數高效微調的一種新穎方法,提供了在保持模型性能的同時,顯著減少可訓練參數數量的解決方案。 IA3 …

swift菜鳥教程14(閉包)

一個樸實無華的目錄 今日學習內容&#xff1a;1.Swift 閉包1.1閉包定義1.2閉包實例1.3閉包表達式1.3.1sorted 方法&#xff1a;據您提供的用于排序的閉包函數將已知類型數組中的值進行排序。1.3.2參數名稱縮寫&#xff1a;直接通過$0,$1,$2來順序調用閉包的參數。1.3.3運算符函…

藍橋杯-藍橋幼兒園(Java-并查集)

并查集的核心思想 并查集主要由兩個操作構成&#xff1a; Find&#xff1a;查找某個元素所在集合的根節點。并查集的特點是&#xff0c;每個元素都指向它自己的父節點&#xff0c;根節點的父節點指向它自己。查找過程中可以通過路徑壓縮來加速后續的查找操作&#xff0c;即將路…

ruby內置全局變量

以下是 Ruby 中常見的 內置全局變量 及其用途的詳細說明。這些變量以 $ 開頭&#xff0c;由 Ruby 解釋器自動管理&#xff0c;用于訪問系統狀態、異常、輸入輸出等核心信息。 一、異常處理相關 全局變量說明示例$!當前作用域最后拋出的異常對象&#xff08;等同于 rescue >…

tcp轉串口

windows 在 Windows 系統上&#xff0c;可以使用以下成熟的串口轉 TCP 工具&#xff1a; HW VSP3 (HW Virtual Serial Port) 提供串口到 TCP/IP 的映射功能。支持虛擬串口和網絡通信。下載地址&#xff1a;HW Group com0com com2tcp 開源工具&#xff0c;支持虛擬串口和 TCP…

HTML視頻和音頻

<video>元素 <video>元素用于在HTML文檔中嵌入視頻內容。 <video controls><source src"movie.mp4" type"video/mp4"><source src"movie.ogg" type"video/ogg">您的瀏覽器不支持 HTML5 video 標簽。 …

DeepSeek:重構辦公效率的AI新范式

目錄 一、效率躍遷的三重引擎 二、效率提升的量級突破 三、智能辦公的范式轉移 四、未來辦公的效率奇點 當企業主面對堆積如山的文件審批、跨時區協作的溝通損耗、重復機械的數據整理時&#xff0c;是否想過這些場景正在吞噬團隊的生產力&#xff1f;據麥肯錫研究顯示&…

redis 延遲雙刪

Redis延遲雙刪是一種用于解決緩存與數據庫數據一致性問題的策略&#xff0c;通常在高并發場景下使用。以下是其核心內容&#xff1a; 1. 問題背景 當更新數據庫時&#xff0c;如果未及時刪除或更新緩存&#xff0c;可能導致后續讀請求仍從緩存中讀取舊數據&#xff0c;造成數…

Python設計模式:策略模式

1. 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一系列算法&#xff0c;將每個算法封裝起來&#xff0c;并使它們可以互換。策略模式使得算法的變化獨立于使用算法的客戶。換句話說&#xff0c;策略模式允許在運…

SpringBoot集成Ollama本地模型

SpringBoot集成Ollama本地模型 目錄 項目準備創建Ollama服務客戶端創建控制器配置應用屬性創建前端界面添加靜態資源支持完整項目結構啟動應用高級功能擴展部署注意事項性能優化 1. 項目準備 創建一個SpringBoot項目&#xff0c;可以使用Spring Initializr或IDE創建添加必要…

ResNet改進(19):基于PyTorch的ResNet改進方案詳解:Mish激活+SPP模塊+MixUp數據增強

1. 前言 ResNet作為深度學習領域里程碑式的網絡架構,在圖像分類等計算機視覺任務中表現出色。然而,隨著研究的深入和技術的發展,原始的ResNet架構仍有改進空間。本文將詳細介紹一種基于PyTorch的ResNet改進方案,該方案融合了Mish激活函數、SPP模塊和MixUp數據增強等先進技…

leetcode68.左右文本對齊

思路源自 leetcode-字符串篇 68題 文本左右對齊 難度高的模擬類型題目&#xff0c;關鍵點在于事先知道有多少單詞要放在本行并且還要知道本行是不是最后一行&#xff08;最后一行需要全部單空格右對齊&#xff0c;不是最后一行就空格均攤&#xff09;&#xff0c;非最后一行的空…

深入理解 Spring 的 MethodParameter 類

MethodParameter 是 Spring 框架中一個非常重要的類&#xff0c;它封裝了方法參數&#xff08;或返回類型&#xff09;的元數據信息。這個類在 Spring MVC、AOP、數據綁定等多個模塊中都有廣泛應用。 核心功能 MethodParameter 主要提供以下功能&#xff1a; 獲取參數類型信息…

Qt 5.14.2入門(一)寫個Hello Qt!程序

目錄 參考鏈接&#xff1a;一、新建項目二、直接運行三、修改代碼增加窗口內容1、Qt 顯示一個 QLabel 標簽控件窗口2、添加按鍵 參考鏈接&#xff1a; Qt5教程&#xff08;一&#xff09;&#xff1a;Hello World 程序 Qt 編程指南 一、新建項目 1、新建一個項目&#xff08…

Spring Boot 3.x 集成 MongoDB 的 默認配置項及默認值,以及 常用需要修改的配置項 的詳細說明

以下是 Spring Boot 3.x 集成 MongoDB 的 默認配置項及默認值&#xff0c;以及 常用需要修改的配置項 的詳細說明&#xff1a; 一、默認配置項及默認值 Spring Boot 對 MongoDB 的默認配置基于 spring.data.mongodb 前綴&#xff0c;以下是核心配置項&#xff1a; 配置項默認…

【QT】 進程

目錄 QT 多進程復習 Linux-C 多進程QProcess 進程類常用方法簡單示例信號與槽應用場景 跨平臺注意事項技巧&#xff1a;使用宏控制平臺命令 QProcess 在嵌入式系統中的使用示例&#xff1a;調用 ALSA 播放音頻示例&#xff1a;調用 arecord 錄音示例&#xff1a;QProcess Shel…

原子操作(cpp atomic)

目錄 一.原子操作 1.原子操作的概念 2.原子變量 二.原子性 1.中間狀態描述 2.單處理器單核 3.多處理器或多核的情況下 4.cache&#xff08;高速緩沖器的作用&#xff09; 5.在cpu cache基礎上,cpu如何讀寫數據&#xff1f;&#xff1f;&#xff1f; 6.為什么會有緩存…