javaWeb規範包括三個技術點:servlet 、listener 、filter;監聽器就是監聽某個對象的的狀態變化的組件。監聽器是一個java類,用來監聽其餘javaBean的變化。在javaWeb中監聽器是用來監聽三個對象(request、session、servletConfig)的狀態。監聽器的相關概念事件源:
一、被監聽的對象(三個域對象 request,session,servletContext)
二、監聽器:監聽事件源對象, 事件源對象的狀態的變化都會觸發監聽器 。
三、註冊監聽器:將監聽器與事件源進行綁定。
四、響應行爲:監聽器監聽到事件源的狀態變化時,所涉及的功能代碼(程序員編寫代碼)html
1) request
2) session
3) servletConfigjava
經過配置web.xmlwancheng程序員
servlet提供了8個監聽器web
1) 第一類:監聽三個域對象的建立和銷燬的監聽器3個spring
對象類型 | 對應的監聽器 |
---|---|
ServletContext | ServletContextListener |
HttpSession | HttpSessionListener |
HttpServletRequest | ServletRequestListener |
2) 第二類:監聽三個域對象變動的監聽器(屬性添加,屬性移除,屬性替換)3個數據庫
對象類型 | 對應的監聽器 |
---|---|
ServletContext | ServletContextAttributeListener |
HttpSession | ServletRequestAttributeListener |
HttpServletRequest | HttpSessionAttributeListener |
3) 第三類:監聽HttpSession對象中的JavaBean的狀態的改變.(綁定,解除綁定,鈍化和活化)2個
瀏覽器
對象類型 | 對應的監聽器 |
---|---|
HttpSession | HttpSessionBindingListener(綁定,解除綁定) |
HttpSession | HttpSessionActivationListener(鈍化和活化) |
ServletContextListener監聽器的主要做用(至關於監聽tongcat啓動和關閉):服務器
1) 初始化的工做:初始化對象;初始化數據。好比加載數據庫驅動,對鏈接池的初始化。
2) 加載一些初始化的配置文件;好比spring的配置文件。
3) 任務調度(定時器Timer/TimerTask)session
監聽ServletContext域的建立與銷燬的監聽器,Servlet域的生命週期:在服務器啓動建立,服務器關閉時銷燬;監聽器的編寫步驟:app
1) 編寫一個監聽器類去實現監聽器接口
2) 覆蓋監聽器的方法
3) 須要在web.xml中進行配置(註冊)
例子:
監聽Httpsession域的建立與銷燬的監聽器。HttpSession對象的生命週期:第一次調用request.getSession時建立;銷燬有如下幾種狀況(服務器關閉、session過時、 手動銷燬)
例子:統計在線人數,每個瀏覽器訪問都會記錄一次,當一個瀏覽器退出時就會讓在線人數減掉1.
在src/main/webapp下新建一個名爲web的包,並在web包下面新建兩個類,分別是:
CountLoginListen.java
package web; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class CountListener implements HttpSessionListener { private int count = 0; public void sessionCreated(HttpSessionEvent se) { count++; HttpSession session = se.getSession(); ServletContext sct = session.getServletContext(); sct.setAttribute("count", count); } public void sessionDestroyed(HttpSessionEvent se) { count--; HttpSession session = se.getSession(); ServletContext sct = session.getServletContext(); sct.setAttribute("count", count); } }
LoginOutServlet.java
package web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class LogoutServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=utf8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); session.invalidate(); out.close(); } }
2) 配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <listener> <listener-class>web.CountListener</listener-class> </listener> <servlet> <servlet-name>h</servlet-name> <servlet-class>web.LogoutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>h</servlet-name> <url-pattern>/logout</url-pattern> </servlet-mapping>
</web-app>
3) 在webapp下新建一個jsp文件,名爲:index.jsp
<%@ page language="java" contentType="text/html; charset=utf8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> 當前有<%=application.getAttribute("count").toString() %> <a href="logout">登出</a> </body> </html>
三、ServletRequestListener
一、ServletContextAttibuteListener
二、HttpSessionBindingListener
三、HttpSessionActivationListener
一、
二、
三、