JavaWeb的監(jiān)聽器和過(guò)濾器你了解嗎
1.監(jiān)聽器---->Context,Session
what is listener?
監(jiān)聽器是一個(gè)接口內(nèi)容由我們實(shí)現(xiàn),會(huì)在特定時(shí)間被調(diào)用,監(jiān)聽器用于監(jiān)聽web應(yīng)用中三大域?qū)ο?request,session,application),信息的創(chuàng)建,銷毀,增加,修改,刪除等動(dòng)作的發(fā)生,然后做出相應(yīng)的響應(yīng)處理。當(dāng)范圍對(duì)象的狀態(tài)發(fā)生變化的時(shí)候,服務(wù)器自動(dòng)調(diào)用監(jiān)聽器對(duì)象中的方法。常用于統(tǒng)計(jì)在線人數(shù)和在線用戶,系統(tǒng)加載時(shí)進(jìn)行信息初始化,統(tǒng)計(jì)網(wǎng)站的訪問量等。
ContextListener
通過(guò)實(shí)現(xiàn)ServletContextListener
來(lái)進(jìn)行全局監(jiān)聽
ContextListener可以通過(guò)記錄用戶訪問網(wǎng)站的次數(shù)思路:用戶通過(guò)訪問index.jsp,來(lái)獲取存放在監(jiān)聽器中的hashmap< String,Integer>
,然后在index.jsp中進(jìn)行判斷。
ContextListener的代碼思路如下:
public class ContextListener1 implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("init"); //創(chuàng)建map集合 Map<String, Integer> map = new HashMap<String, Integer>(); // 獲取全局對(duì)象 ServletContext context = servletContextEvent.getServletContext(); context.setAttribute("map", map); System.out.println(map.isEmpty()); System.out.println(map); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("destory"); } }
index.jsp的代碼思路如下:
<% //獲取用戶ip地址 String ServerName = request.getServerName(); //獲取全局對(duì)象 Map<String, Integer> map = (Map<String, Integer>) application.getAttribute("map"); if (map.containsKey(ServerName)) { map.put(ServerName, map.get(ServerName) + 1); } else { map.put(ServerName, 1); } int count = map.get(ServerName); int size = map.size(); %> <h4>ip地址是:<%=ServerName%>,您是第<%=count%>位訪問的用戶,當(dāng)前服務(wù)器共被<%=size%>個(gè)用戶訪問過(guò)</h4>
2.監(jiān)聽器三大作用域
3.屬性監(jiān)聽器
屬性監(jiān)聽器主要監(jiān)聽屬性值的變化,例如request.setAttribute()
等這些數(shù)據(jù)的變化。
package listener; import javax.servlet.*; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; /** * @author wjs * @create 2022-02-27 15:09 */ public class AttrListener implements ServletContextAttributeListener, ServletRequestAttributeListener, HttpSessionAttributeListener { @Override public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) { // 向全局作用域中添加值的監(jiān)聽器 } @Override public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) { // 向全局作用域刪除值的監(jiān)聽器 } @Override public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) { // 向全局域?qū)ο笮薷闹档谋O(jiān)聽器 } @Override public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) { // 向request域中添加值的監(jiān)聽器 } @Override public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) { // 向request域中刪除值的監(jiān)聽器 } @Override public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) { // 向request域中修改值的監(jiān)聽器 } @Override public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) { // 向session域中添加值的監(jiān)聽器 } @Override public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) { // 向session域中刪除值的監(jiān)聽器 } @Override public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) { // 向session域中修改值的監(jiān)聽器 } }
4.過(guò)濾器
4.1過(guò)濾器的使用
1.編寫java 類實(shí)現(xiàn)Filter接口 2.重寫doFilter()方法 3.設(shè)置攔截的url
4.2過(guò)濾器的攔截路徑
/*:根目錄下所有請(qǐng)求都攔截
/*.do:所有帶.do的請(qǐng)求都攔截
/*.jsp
4.3過(guò)濾器的攔截順序
過(guò)濾器的攔截順序,取決于在配置文件web.xml的先后順序
4.4過(guò)濾器的四種攔截方式
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
java web學(xué)習(xí)_淺談request對(duì)象中g(shù)et和post的差異
下面小編就為大家?guī)?lái)一篇java web學(xué)習(xí)_淺談request對(duì)象中g(shù)et和post的差異。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05SpringBoot實(shí)現(xiàn)前后端、json數(shù)據(jù)交互以及Controller接收參數(shù)的幾種常用方式
這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)前后端、json數(shù)據(jù)交互以及Controller接收參數(shù)的幾種常用方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03Java高級(jí)之虛擬機(jī)加載機(jī)制的實(shí)例講解
下面小編就為大家分享一篇Java高級(jí)之虛擬機(jī)加載機(jī)制的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12一文學(xué)習(xí)Java NIO的ByteBuffer工作原理
很多網(wǎng)友說(shuō)JDK又在寫B(tài)ug!下面通過(guò)通過(guò)本文學(xué)習(xí)下為何Java NIO的ByteBuffer這么垃圾,涉及到ByteBuf API 的優(yōu)點(diǎn)及工作原理解析,感興趣的朋友跟隨小編一起看看吧2021-05-05SpringBoot使用@Value實(shí)現(xiàn)給靜態(tài)變量注入值
這篇文章主要介紹了SpringBoot使用@Value實(shí)現(xiàn)給靜態(tài)變量注入值的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07通過(guò)Java來(lái)測(cè)試JSON和Protocol Buffer的傳輸文件大小
這篇文章主要介紹了通過(guò)Java來(lái)測(cè)試JSON和Protocol Buffer的傳輸文件大小,Protocol Buffer(文中簡(jiǎn)稱Protobuffer)是谷歌開發(fā)的新的文件傳輸格式,需要的朋友可以參考下2015-12-12