(1)什麼是監聽器?
是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上下文。
[java] //獲得ServletContext
ServletContext sctx=getServletContext();
sctx.setAttribute("username","user1");
out.println("已經將username綁定"+"到了ServletContext上面");
//獲得ServletContext
ServletContext sctx=getServletContext();
sctx.setAttribute("username","user1");
out.println("已經將username綁定"+"到了ServletContext上面");輸出通過servletContext得到的內容:
[java] ServletContext sctx=getServletContext();
String username=(String)sctx.getAttribute("username");
ServletContext sctx=getServletContext();
String username=(String)sctx.getAttribute("username");
配置web.xml:
[html] <!-- 全局初始化參數 -->
<context-param>
<param-name>version</param-name>
<param-value>1.0</param-value>
</context-param>
<listener>
<listener-class>web.CountListener</listener-class>
</listener>
<!-- 全局初始化參數 -->
<context-param>
<param-name>version</param-name>
<param-value>1.0</param-value>
</context-param>
<listener>
<listener-class>web.CountListener</listener-class>
</listener>
在servlet中得到該數據:
[java] String version=sctx.getInitParameter("version");
out.println("version:"+version);
String version=sctx.getInitParameter("version");
out.println("version:"+version);
最後寫一個統計在線人數的程序,利用到監聽器知識,即觸發某個事件時,對應的方法自動觸發執行:
step1
編寫servlet
[java] 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);
}
}
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);
}
}step2
配置全局化參數:
[html] <listener>
<listener-class>web.CountListener</listener-class>
</listener>
<listener>
<listener-class>web.CountListener</listener-class>
</listener>
step3,編寫jsp文件
[html] <body style="font-size:30px;">
當前系統在線人數是:
<%=application.getAttribute("count") %>
<%=application.getAttribute("username") %>
</br>
<a href="logout.jsp">退出系統</a>
</body>
<body style="font-size:30px;">
當前系統在線人數是:
<%=application.getAttribute("count") %>
<%=application.getAttribute("username") %>
</br>
<a href="logout.jsp">退出系統</a>
</body>
step4,編寫logout.jsp文件
[html] <body>
<%
session.invalidate();
%>
</body>
<body>
<%
session.invalidate();
%>
</body>