JavaWeb監聽器,j2ee

來源:互聯網
上載者:User

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");}}

       


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.