1.8(学习笔记)监听器(Listener)
一、監聽器簡介
監聽器是web容器對某一些對象的監聽,當某些對象發生創建、修改、刪除的動作時,
web容器會自動調用對應的監聽器中的方法。
例如A是監聽器,B是被監聽對象,A的監聽任務是B回家時來開門。
那么當B一回家,監聽器A就會執行開門的操作。
?
二、監聽器用法
2.1.1 ServletContextListener
用于監聽ServletContext對象的創建及銷毀,實際上就是監聽Web應用的生命周期。
首先我們要創建一個類,實現ServletContextListener接口,實現里面的兩個方法:
public void contextInitialized(ServletContextEvent sce)//web程序初始化時執行
public void contextDestroyed(ServletContextEvent sce)//web程序銷毀時執行
?
ContextListener:
import java.io.PrintStream;import javax.servlet.ServletContextEvent;public class ServletContextListener implements javax.servlet.ServletContextListener{PrintStream out = System.out;@Overridepublic void contextInitialized(ServletContextEvent sce) {// TODO Auto-generated method stubout.println("ContextInit");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// TODO Auto-generated method stubout.println("ContextDestroyed");} }web.xml
<listener><listener-class>com.listener.ServletContextListener</listener-class></listener>當打開Tomcat時,監聽器監聽到ServletContext開始初始化,會執行contextInitialized(),
打印出ContextInit。當關閉Tomcat時,監聽器監聽到ServeltContext已關閉,會執行contextDestroyed(),
打印出ContextDestroyed.
? ? ??
?
2.1.2ServletContextAttrubute
監聽ServletContext屬性列表發送更改。
比如屬性的添加(setAttrubute("a","a")、
修改(setAttribute("a","A"))、刪除(removeAttribute("a"))。
ServletContextAttribute中有三個方法:
attributeAdded(ServletContextAttributeEvent scae);//監聽添加屬性
attributeRemoved(ServletContextAttributeEvent scae)//監聽刪除屬性
attributeReplaced(ServletContextAttributeEvent scae)//監聽修改屬性
?
import java.io.PrintStream;import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.ServletContextEvent;public class ServletContextListener implements ServletContextAttributeListener{PrintStream out = System.out;@Overridepublic void attributeAdded(ServletContextAttributeEvent scae) {// TODO Auto-generated method stubout.println("AddAttribute");}@Overridepublic void attributeRemoved(ServletContextAttributeEvent scae) {// TODO Auto-generated method stubout.println("RemovedAttribute");}@Overridepublic void attributeReplaced(ServletContextAttributeEvent scae) {// TODO Auto-generated method stubout.println("ReplacedAddAttribute");} }?
LoginServlet:
import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import com.util.HttpPageUtil;public class LoginServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter out = response.getWriter();String username = request.getParameter("username");ServletContext sc = this.getServletContext();//添加sc.setAttribute("Attribute", "addAttribute");//修改sc.setAttribute("Attribute", "reAttribute");//刪除sc.removeAttribute("Attribute");HttpPageUtil.printHtmlPage(out, true);out.println("SerlvetContextAttribute");HttpPageUtil.printHtmlPage(out, false);System.out.println("Servlet");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub doGet(request, response);} }控制臺輸出:
當LoginServlet中向ServletContext添加屬性時,對應監聽器監聽到添加動作,
執行方法attributeAdded()方法輸出AddAttribute,修改屬性時執行attributeReplaced()方法
輸出ReplacedAddAttribute,刪除屬性時執行attributeRemoved()方法,輸出RemoveAttribute。
?
2.2.1HttpSessionListener
HttpSessionnLister主要用于監聽Session的創建及銷毀。
? ? ?public void sessionCreated(HttpSessionEvent se)//session創建時執行。
public void sessionDestroyed(HttpSessionEvent se)//session銷毀時執行。
?
import java.io.PrintStream;import javax.servlet.http.HttpSessionEvent;public class HttpSessionListener implements javax.servlet.http.HttpSessionListener{PrintStream out = System.out;@Overridepublic void sessionCreated(HttpSessionEvent se) {// TODO Auto-generated method stubout.println("SeesionCreater");}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// TODO Auto-generated method stubout.println("SeesionDestroy");}}控制臺輸出:
但Session創建銷毀時,監聽器會監聽到對應的動作并執行對方法。
?
2.2.2HttpSessionAttributeListener
主要監聽Session對象屬性的添加、修改、刪除操作。
public void attributeAdded(HttpSessionBindingEvent se);//添加session中屬性時執行
public void attributeRemoved(HttpSessionBindingEvent se);//刪除session中屬性時執行
public void attributeReplaced(HttpSessionBindingEvent se);//修改session中屬性時執行
?
HttpSessionAttributeListener public class HttpSessionListener implements javax.servlet.http.HttpSessionAttributeListener{PrintStream out = System.out;@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {// TODO Auto-generated method stubout.println("SessionAttributeAdd");}@Overridepublic void attributeRemoved(HttpSessionBindingEvent se) {// TODO Auto-generated method stubout.println("SessionAttributeRemove");}@Overridepublic void attributeReplaced(HttpSessionBindingEvent se) {// TODO Auto-generated method stubout.println("SessionAttributeReplace");}}?
LoginServlet?
import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import com.util.HttpPageUtil;;// http://localhost:8080/TestServlet/Filter/Login public class LoginServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter out = response.getWriter();String username = request.getParameter("username");HttpSession session = request.getSession();//添加session.setAttribute("attribute", "add");//修改session.setAttribute("attribute", "replace");//刪除session.removeAttribute("attribute");HttpPageUtil.printHtmlPage(out, true);out.println("SessionAttributeListener");HttpPageUtil.printHtmlPage(out, false);System.out.println("Servlet");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub doGet(request, response);} }控制臺輸出:
監聽器會添加session中屬性的增加、修改、刪除,并執行對應方法
輸出對應方法中的語句。
?
2.3.1ServletRequestListener
ServletRequestListener主要監聽request的初始化和銷毀。
public void requestDestroyed(ServletRequestEvent sre);//request初始化時執行。
public void requestInitialized(ServletRequestEvent sre);//request銷毀時執行。
?
import java.io.PrintStream;import javax.servlet.ServletRequestEvent;public class ServletRequest implements javax.servlet.ServletRequestListener{PrintStream out = System.out;@Overridepublic void requestDestroyed(ServletRequestEvent sre) {// TODO Auto-generated method stubout.println("RequestDestroy");}@Overridepublic void requestInitialized(ServletRequestEvent sre) {// TODO Auto-generated method stubout.println("RequestInit");} }?
LoginServlet:
import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import com.util.HttpPageUtil;;// http://localhost:8080/TestServlet/Filter/Login public class LoginServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("intoServlet");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub doGet(request, response);} }但在地址欄通過URL訪問LoginServlet時:
控制臺輸出結果:
當發送一個訪問請求時,請求初始化被監聽器監聽到,執行對應方法輸出“RequestInit”。
然后到達LoginServlet進行輸出"intoServlet",最后請求結束被監聽器監聽到,執行requestDestroyed方法
輸出“RequestDestroy”。
?
2.3.2 ServletRequestAttributeListener
ServletResqeustAttributerListener主要監聽reques中屬性的創建、修改、刪除。
public void attributeAdded(HttpSessionBindingEvent se);//添加session中屬性時執行
public void attributeRemoved(HttpSessionBindingEvent se);//刪除session中屬性時執行
public void attributeReplaced(HttpSessionBindingEvent se);//修改session中屬性時執行
?
RequestAttributeListener:
import java.io.PrintStream;import javax.servlet.ServletRequestAttributeEvent;public class ServletRequest implements javax.servlet.ServletRequestAttributeListener{PrintStream out = System.out;@Overridepublic void attributeAdded(ServletRequestAttributeEvent srae) {// TODO Auto-generated method stubout.println("AddAttribute");}@Overridepublic void attributeRemoved(ServletRequestAttributeEvent srae) {// TODO Auto-generated method stub out.println("RemoveAttribute");}@Overridepublic void attributeReplaced(ServletRequestAttributeEvent srae) {// TODO Auto-generated method stubout.println("ReplaceAttribute");} }?
LoginServlet:
?
import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import com.util.HttpPageUtil;; public class LoginServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//添加request.setAttribute("attribute", "add");//修改request.setAttribute("attribute", "replace");//刪除request.removeAttribute("attribute");}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub doGet(request, response);} }通過URL調用LoginServlet,
控制臺輸出:
當在reques中設置屬性時,對應監聽器會監聽到,并調用attributeAdded()方法,輸出"AddAttribute".
當修改reqest中屬性時,會調用attributeReplaced()方法,輸出“ReplaceAttribute”.
當刪除reques中屬性時會嗲用attributeRemoved()方法,輸出“RemoveAttribute”。
?
三、監聽器實例(在線人數統計)
? 首先在線人數應該是全站可見的,所以人數應該存放在作用域最大的ServletContexte中。
每登入一個用戶我們就創建一個Session,Session監聽器中人數+1。當一個session銷毀時
監聽器中人數-1.
?
OnLineListener:
import java.util.Set; import java.util.TreeSet;import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.http.HttpSessionEvent;public class OnLineListener implements javax.servlet.ServletContextListener, javax.servlet.http.HttpSessionListener{private ServletContext sc = null;private int count = 0;//記錄登陸人數 @Overridepublic void sessionCreated(HttpSessionEvent se) {// TODO Auto-generated method stub//當創建用戶session時,count++count++;//將人數設置在ServletContext中sc.setAttribute("count", new Integer(this.count));}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// TODO Auto-generated method stub//當ession銷毀時,count--count--;//將人數設置在ServletContext中sc.setAttribute("count", new Integer(this.count));}@Overridepublic void contextInitialized(ServletContextEvent sce) {// TODO Auto-generated method stub//Tomcat啟動時獲取ServletContext,并設置一個登陸人數(初值為0);this.sc = sce.getServletContext();this.sc.setAttribute("count", new Integer(this.count));}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// TODO Auto-generated method stubsc = null;} }?
LoginServlet:
import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import com.util.*;// http://localhost:8080/TestServlet/Filter/Login public class LoginServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter out = response.getWriter();String username = request.getParameter("username");HttpSession session = request.getSession();//獲取ServletContextServletContext sc = this.getServletContext();HttpPageUtil.printHtmlPage(out, true);//從ServletContext中獲取人數。out.println("歡迎" + username + "當前在線人數" + ((Integer)sc.getAttribute("count")).intValue());HttpPageUtil.printHtmlPage(out, false);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub doGet(request, response);} }?
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body><!--在.../Page/下重定向 不加 /的相對路徑 --><!-- http://localhost:8080/TestServlet/Page/Filter/Login --><form name = f1 action ="/TestServlet/Filter/Login" method = "post">username:<input type = "text" name = "username" value = "${un}"></input><br>password:<input type = "password" name = "password" value = "${pw}"></input><br><!-- 記住密碼 :<input type = "radio" name = "SavePassword" value = "1"><br> --><input type = "submit" value = "登錄"></form> </body> </html>每登錄一個用戶都會為其創建一個Session,這里測試時最好用不同的瀏覽器。
如果是一個瀏覽器,此例中多次登錄會被認為是一個session,不會觸發Session創建監聽。
?
轉載于:https://www.cnblogs.com/huang-changfan/p/10320746.html
總結
以上是生活随笔為你收集整理的1.8(学习笔记)监听器(Listener)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 妈妈对女儿说的暖心句239个
- 下一篇: 大户型住宅使用Mesh组网技术Wi