是servlet規範當中定義的一種特殊的組件,用來監聽容器產生的事件並且進行相應的處理。
容器會產生兩大類事件: a,生命週期相關的事件:容器創建或者銷燬request,session,ServletContext(servlet上下文)這些對象時產生的事件。b,綁訂相關的事件:
對request,session,ServletContext(servlet上下文)調用了setAttribute,removeAttribute產生的事件。
(2)如何寫一個監聽器?
step1, 寫一個java類,實現相應的監聽器接口(要看監聽的事件類型: HttpSessionListener)。
step2, 在監聽器接口對應的方法裏面,實現監聽的處理邏輯。
step3,註冊(web.xml)
(3)ServletContext
1)什麼是Servlet上下文?
容器在啓動的時候,會爲每一個應用創建唯一的一個
符合ServletContext接口的一個對象。該對象會一直存在,
除非關閉容器。
2)如何獲得servlet上下文?
a,GenericServlet提供了getServletContext方法。
b,ServletConfig提供了getServletContext方法。
c, FilterConfig提供了getServletContext方法。
d, HttpSession提供了getServletContext方法。
3)servlet上下文的作用?
a,綁訂相關的方法
setAttribute,removeAttribute,getAttribute
request,session,ServletContext這三個對象都有綁訂
相關的方法,應該優先使用生命週期短(request<session
<servlet上下文)的。
b, 訪問全局的初始化參數
step1, 使用<context-param>來配置,該參數可以被
所有的servlet,filter訪問。
step2, 使用ServletContext提供的getInitParameter方法
來獲取參數值。
c, 獲得實際部署時的物理路徑。
String getRealPath(String path);
通過代碼先了解一下servletContext,即servlet上下文。
- //獲得ServletContext
- ServletContext sctx=getServletContext();
- sctx.setAttribute("username","user1");
- out.println("已經將username綁定"+"到了ServletContext上面");
- ServletContext sctx=getServletContext();
- String username=(String)sctx.getAttribute("username");
配置web.xml:
- <!-- 全局初始化參數 -->
- <context-param>
- <param-name>version</param-name>
- <param-value>1.0</param-value>
- </context-param>
- <listener>
- <listener-class>web.CountListener</listener-class>
- </listener>
在servlet中得到該數據:
- String version=sctx.getInitParameter("version");
- out.println("version:"+version);
最後寫一個統計在線人數的程序,利用到監聽器知識,即觸發某個事件時,對應的方法自動觸發執行:
step1
編寫servlet
- import javax.servlet.ServletContext;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpSession;
- import javax.servlet.http.HttpSessionEvent;
- import javax.servlet.http.HttpSessionListener;
- public class CountListener implements HttpSessionListener {
- //session對象一旦創建成功,會執行該方法
- private int count=0;
- public void sessionCreated(HttpSessionEvent arg0) {
- // TODO Auto-generated method stub
- count++;
- HttpSession session=arg0.getSession();
- ServletContext sctx=session.getServletContext();
- sctx.setAttribute("count", count);
- }
- //session對象被銷燬會執行該方法
- public void sessionDestroyed(HttpSessionEvent arg0) {
- // TODO Auto-generated method stub
- count--;
- HttpSession session=arg0.getSession();
- ServletContext sctx=session.getServletContext();
- sctx.setAttribute("count", count);
- }
- }
配置全局化參數:
- <listener>
- <listener-class>web.CountListener</listener-class>
- </listener>
step3,編寫jsp文件
- <body style="font-size:30px;">
- 當前系統在線人數是:
- <%=application.getAttribute("count") %>
- <%=application.getAttribute("username") %>
- </br>
- <a href="logout.jsp">退出系統</a>
- </body>
step4,編寫logout.jsp文件
- <body>
- <%
- session.invalidate();
- %>
- </body>