JavaWeb監聽器,j2ee
本文是在學習中的總結,歡迎轉載但請註明出處:http://blog.csdn.net/pistolove/article/details/44310967
A:監聽器的定義 專門用於其他對象身上發生的事件或狀態改變進行監聽和相應事件處理的對象,當被監聽的對象發生改變時,立即採取相應的行動。 用戶端請求 ServletContext --> Application 內容物件 由容器建立 web監聽器 Httpsession--> Session 儲存上下文資訊的機制 儲存每個會話 伺服器端操作 ServletHttpRequest--> Request 客戶發送請求時建立
監聽器是servlet規範中定義的一種特殊類;用於監聽ServletContext、httpsession和ServletRequest等域對象的建立和銷毀事件;用於監聽域對象的屬性發生修改的事件;可以再事件發生前、發生後做一些必要的處理。
B:web監聽器的主要用途: 1. 統計線上人數和線上使用者 2. 系統啟動時載入初始化資訊 3. 統計網站訪問量 4. 跟Spring結合
C:一個web監聽器執行個體 步驟: 1. 建立一個實現監聽器介面的類 2. 配置web.xml檔案進行註冊
監聽器啟動順序:多個監聽器啟動順序按照註冊順序執行的 優先順序:監聽器 >過濾器>servlet
D:監聽器分類 按照監聽的對象劃分 1. 用於監聽應用程式物件 (ServletContext)的事件監聽器 2. 用於監聽使用者會話對象(HttpSession)的事件監聽器 3. 用於監聽請求訊息對象(ServletRequest)的事件監聽器
按照監聽的事件劃分 1.監聽域對象自身的建立和銷毀的事件監聽器 ServletContext --> ServletContextListener 主要用途:定時器 全域屬性對象
HttpSession --> HttpSessionListener 主要用途:統計線上人數 記錄訪問日誌 Session銷毀:關閉伺服器 ; Session逾時 ; 關閉瀏覽器,Session到期 在web.xml中配置session到期時間
ServletReqest ServletRequestListener 主要用途:讀取參數 記錄訪問曆史
2.監聽域對象中的屬性的增加和刪除的事件監聽器 ServletContext --> servletContextAttributeListener 上下文 HttpSession--> HttpSessionAttributeListner 一次會話
HttpServletRequest --> ServletRequestAtttibuteListener 一次請求
request.getAttribute() 放在域對象中的參數 request.getParameter() request的請求參數 www.baidu.com/username=zs 需要將username放到Attribute中,request.setAttribute("username","zs");放在域對象中的屬性 直接通過EL運算式就可取出 <%=username%>。在多次點擊按鈕請求時, 由於request在訪問結束後就銷毀了,在request域中不存有上一次擷取的參數,就會add;session和context在容器中都存有,就會直接replace。
3.監聽綁定到HttpSession域中的某個對象的狀態的事件監聽器 綁定-->解除綁定 綁定:儲存-setAttribute 解除綁定:移除-removeAttribute
鈍化-->活化 鈍化:將Session對象持久化到存放裝置上 活化:將session對象將一個存放裝置上恢複
鈍化原因:session放在伺服器中的,當線上對象特別多,session記憶體開銷很大,session的鈍化機制就可解決;將伺服器中暫時不使用的session對象 序列化到系統檔案或資料庫中;在需要使用時還原序列化到系統記憶體中 整個過程由伺服器自動完成。
Tomcat兩種Session鈍化管理器:<a>Session鈍化機制由SessionManager管理 org.apache.catalina.session.StandardManager當Tomcat伺服器被關閉或重啟時 tomcat伺服器會將當前記憶體中的Session對象鈍化到伺服器檔案系統中;另一種情況是web應用程式被重新載入時 記憶體中的Session對象也會被鈍化到伺服器的檔案系統中;鈍化後的檔案被儲存:Tomcat安裝路徑/work/Catalina/hostname/applicationname/SESSION.ser
<b>org.apache.catalina.session.Persistentmanager在鈍化基礎上進行擴張,可以配置主流記憶體的Session對象數目,將不常使用的Session對象儲存到檔案系統或資料庫,當使用時再重新載入預設情況下 tomcat提供兩個鈍化驅動類:org.apache.Catalina.FileStore 和 org.apache.Catalina.JDBCStore
HttpSessionBindingListener類 綁定:valueBound方法 解除綁定:valueUnbound方法
HttpSessionActivationListener類 鈍化:sessionWillPassivate方法 活化:sessionDidActivate方法
不需要在web.xml中註冊;鈍化和活化必須實現序列化serializable介面才行。
E:監聽器的執行個體--線上人數統計
import java.util.ArrayList;import javax.servlet.annotation.WebListener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import com.my.entity.User;import com.my.util.SessionUtil;/** * 計數監聽器 */@WebListenerpublic class MyHttpSessionListener implements HttpSessionListener {private int userNumber = 0;@Overridepublic void sessionCreated(HttpSessionEvent arg0) {userNumber++;arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);}@Overridepublic void sessionDestroyed(HttpSessionEvent arg0) {userNumber--;arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);ArrayList<User> userList = null;//線上使用者ListuserList = (ArrayList<User>)arg0.getSession().getServletContext().getAttribute("userList");if(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId())!=null){userList.remove(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId()));}}}
import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import javax.servlet.ServletRequestEvent;import javax.servlet.ServletRequestListener;import javax.servlet.annotation.WebListener;import javax.servlet.http.HttpServletRequest;import com.my.entity.User;import com.my.util.SessionUtil;@WebListenerpublic class MyServletRequestListener implements ServletRequestListener {private ArrayList<User> userList;//線上使用者List@Overridepublic void requestDestroyed(ServletRequestEvent arg0) {}@Overridepublic 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);}}
import java.util.ArrayList;import com.my.entity.User;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;}}
public class User {private String sessionIdString;private String ipString;private String firstTimeString;public String getSessionIdString() {return sessionIdString;}public void setSessionIdString(String sessionIdString) {this.sessionIdString = sessionIdString;}public String getIpString() {return ipString;}public void setIpString(String ipString) {this.ipString = ipString;}public String getFirstTimeString() {return firstTimeString;}public void setFirstTimeString(String firstTimeString) {this.firstTimeString = firstTimeString;}}F:servlet3.0下的使用:只需要增加註解即可
import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;@WebListener("This is My Servlet 3.0 Listener")public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextDestroyed(ServletContextEvent arg0) {System.out.println("contextDestroyed");}@Overridepublic void contextInitialized(ServletContextEvent arg0) {System.out.println("contextInitialized");}}