-
@監聽器分類: 1.按監聽器的對象劃分: a 用戶監聽應用程序環境對象(ServletContext)的事件監聽器 b 用于監聽用戶會話對象(HttpSession)的事件監聽器 c 用于監聽請求消息對象(ServletRequest)的事件監聽器 2.按事件劃分 a 監聽域對象自身的創建和銷毀的事件監聽器 b 監聽域對象中的屬性的增加和刪除的事件監聽器 c 監聽綁定到HttpSession域中的某個對象的狀態的事件監聽器。對ServletContext的監聽:ServletContextListener<br> 有兩個方法:初始化方法和銷毀方法<br> 用途:定時器 加載全局屬性
[email protected] public class FirstListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent arg0) { System.out.println("contextDestroyed"); } public void contextInitialized(ServletContextEvent arg0) { String user = arg0.getServletContext().getInitParameter("user"); System.out.println("contextInitialized:" + user); } } @web.xml <context-param> <param-name>user</param-name> <param-value>admin</param-value> </context-param>
查看全部 -
有多個監聽器的時候,按web.xml中注冊順序啟動 監聽器>過濾器>servlet的啟動順序
查看全部 -
@FirstListener.java public class FirstListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent arg0) { System.out.println("contextDestroyed"); } public void contextInitialized(ServletContextEvent arg0) { System.out.println("contextInitialized"); } } @web.xml <listener> ? ? ? ?<listener-class>com.imooc.listener.FirstListener</listener-class> ? ?</listener> @輸出: //Tomcat啟動 contextInitialized //Tomcat關閉 contextDestroyed
查看全部 -
Web監聽器由Servlet規范提供的,可以監聽客戶端的請求以及服務端的操作,即監聽ServletContext、HttpSession、ServletRequest對象.(這三個對象稱為域對象).監聽事件分為這三個對象的創建、銷毀事件以及這三個對象屬性的變化事件.與監聽綁定到HttpSession域中的某個對象的狀態的時間,分別要實現不同的監聽器接口. ServletContext-->對應jsp的application對象. HttpSession-->對應jsp的session對象. ServletRequest-->對應jsp的request對象.
?application:是上下文對象,由容器創建并初始化的。范圍整個web應用,只會有一個存在,服務器關閉時銷毀。 ? ?session:保存上下文的機制,針對每一個會話,放在服務器端通過sessionId區分的,瀏覽器和服務器關閉后,銷毀。 ? ?request:當客戶 發送請求時,容器創建對象,用來封裝請求數據,同時會創建ServletResponse對象來封裝響應數據。訪問結束請求時銷毀。 ? ?監聽器是servlet定義的一種特殊類。監聽域對象的創建銷毀以及屬性變化的事件。
查看全部 -
查看全部
-
查看全部
-
監聽器總結:
一、監聽器分類
在Servlet規范中定義了多種類型的監聽器,它們用于監聽的事件源分別為SerlvetConext,HttpSession和ServletRequest這三個域對象。
Servlet規范針對這三個對象上的操作,又把這多種類型的監聽器劃分為三種類型:
1>監聽三個域對象創建和銷毀的事件監聽器
2>監聽域對象中屬性的增加和刪除的事件監聽器
3>監聽綁定到HttpSession域中的某個對象的狀態的時間監聽器。
a、如三個域對象的創建與銷毀方法簽名:
ServletRequestListener有以下兩個方法
void requestDestroyed(ServletRequestEvent sre)
void requestInitialized(ServletRequestEvent sre)
HttpSessionListener有以下兩個方法
void sessionCreated(HttpSessionEvent se)
void sessionDestroyed(HttpSessionEvent se)
ServletContextListener
void contextDestroyed(ServletContextEvent sce)
void contextInitialized(ServletContextEvent sce)
b、三個類型對象域中屬性增、刪、改的監聽器(3個)
ServletContextAttributeListener,
HttpSessionAttributeListener,
ServletRequestAttributeListener
c、感知型監聽器(2個):監聽自己何時被幫到session上,何時解綁;何時被鈍化,何時被活化(序列化到某個存儲設置中)。
注意:這種監聽器不需要注冊。某個javabean實現這些接口后就可以監聽何時被綁定、解綁或被激活或鈍化。
HttpSessionBindingListener:實現該接口的類,能檢測自己何時被Httpsession綁定和解綁
HttpSessionActivationListener:實現該接口的類(要求些javabean必須是實現了Serializable接口的),能監測自己何時隨著HttpSession一起激活和鈍化。查看全部 -
@統計在線用戶及人數——(下)
@MyServletRequestListener.java
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
private ArrayList<User> userList;//在線用戶List
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
userList = (ArrayList<User>)arg0.getServletContext().getAttribute("userList");
if(userList==null)
userList = new ArrayList<User>();
HttpServletRequest request = (HttpServletRequest) arg0.getServletRequest();
String sessionIdString = request.getSession().getId();
if(SessionUtil.getUserBySessionId(userList,sessionIdString)==null){
User user = new User();
user.setSessionIdString(sessionIdString);
user.setFirstTimeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
user.setIpString(request.getRemoteAddr());
userList.add(user);
}
arg0.getServletContext().setAttribute("userList", userList);
}
}查看全部 -
@統計在線用戶及人數——(中)
@MyHttpSessionListener.java
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
private int userNumber = 0;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
userNumber++;
arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
userNumber--;
arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);
ArrayList<User> userList = null;//在線用戶List
userList = (ArrayList<User>)arg0.getSession().getServletContext().getAttribute("userList");
if(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId())!=null){
userList.remove(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId()));
}
}
}查看全部 -
@統計在線用戶及人數——(上)
@index.jsp
當前在線用戶人數:${userNumber}
<hr>
<%
ArrayList<User> userList = (ArrayList<User>) request.getServletContext().getAttribute("userList");
if (userList != null) {
for (int i = 0; i < userList.size(); i++) {
User user = userList.get(i);
%>
IP:<%=user.getIpString()%>
<hr>
FirstTime:<%=user.getFirstTimeString()%>
<hr>
SessionId:<%=user.getSessionIdString()%>
<hr>
<%
}
}
%>
@SessionUtil.java
public class SessionUtil {
public static Object getUserBySessionId(ArrayList<User> userList, String sessionIdString) {
for (int i = 0; i < userList.size(); i++) {
User user = userList.get(i);
if (user.getSessionIdString().equals(sessionIdString)) {
return user;
}
}
return null;
}
}
@User.java
public class User {
private String sessionIdString;
private String ipString;
private String firstTimeString;
//setter、getter...
}
Ps:session是沒有獲取IP地址方法,但request有。查看全部 -
2、監聽綁定到HttpSession域中的某個對象的狀態的事件監聽器<br>
鈍化:1,由Session.StandardManager:Tocat服務器關閉或Web應用程序被重新加載時把當前內存中的Session序列化到文件或數據庫中。<br>
2,由Session.Persistentmanager:除了1,中的兩種,第3種可以將不常用的Session序列化到文件或數據庫中。<br>
(默認Tocat兩種鈍化驅動:org.apache.Catalina.FileStore和org.apache.Catalina.JDBCStore)<br>
活化:服務器啟動是把鈍化的Seesion反序列化到服務器上
前提:先綁定session<br>? 綁定就是session.setAttribute()把屬性保存到Session對象當中,解除綁定:session.getAttribute()
(1)HttpSession【Binding】Listener //綁定、解除綁定<br>
a) 創建一個javabean類,實現接口【HttpSessionBindingListener,】無需到Web.xml注冊<br>
b) 2個方法<br>
1) void valueBound 綁定 JSP: request.getsession.setattribute("ab",new javabean全名);<br>
2) void valueUnbound 解除綁定 JSP: request.getsession().removeAttribute("ab")<br>
(2)HttpSessionActivationListener //鈍化(持久化到存儲設備時)、活化(從存儲設備恢復)<br>
a) 在已經創建的javabean類,實現接口HttpSessionActivationListener無需到Web.xml注冊<br>
b) 2個方法<br>
1) void sessionWillPassivate 鈍化 JSP: 無需寫,前提javabean進行綁定了<br>
2) void sessionDidActivate 活化 JSP:request.getSession.getAttribute("ab");<br>
需要【活化必須】再繼承一個接口:【Serializable】public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("valueBound:" + arg0.getName());
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("valueUnbound:" + arg0.getName());
}
// 活化
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("sessionDidActivate:" + se.getSource());
}
// 鈍化
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("sessionWillPassivate:" + se.getSource());
}
要想實現鈍化和活化,除了需實現HttpSessionActivationListener接口還需要實現Serializable接口。查看全部 -
還好查看全部
-
servet 3.0 下監聽器的用法
查看全部 -
1
查看全部 -
2
查看全部
舉報