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("請求處理結束");}
}
三、監聽器的使用場景
- 統計在線用戶數量:利用HttpSessionListener,在sessionCreated方法中讓在線用戶數加1,在sessionDestroyed方法中減1,從而實時統計在線用戶數量。
- 記錄用戶登錄和退出時間:在HttpSession創建時記錄登錄時間,銷毀時記錄退出時間,便于分析用戶行為。
- 資源初始化和銷毀:借助ServletContextListener,在Web應用啟動時初始化全局資源,如數據庫連接池;在應用關閉時釋放資源,確保資源管理得當。
- 請求日志記錄:通過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
非常感謝您的閱讀,喜歡的話記得三連哦 |