JavaWeb显示器
生活随笔
收集整理的這篇文章主要介紹了
JavaWeb显示器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文研究的總結。歡迎轉載,但請注明出處:http://blog.csdn.net/pistolove/article/details/44310967
A:監聽器的定義
? ? ?專門用于其它對象身上發生的事件或狀態改變進行監聽和對應事件處理的對象,當被監聽的對象發生改變時,馬上採取對應的行動。 ? ? ? ? ? ?client請求 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ServletContext --> Application ? ? ?上下文對象 由容器創建 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? web監聽器 ? ? ? ?Httpsession-->? Session ? ? ? ? 保存上下文信息的機制 保存每一個會話 ? ? ?server端操作 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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銷毀:關閉server ; 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%>。在多次點擊button請求時, 因為request在訪問結束后就銷毀了,在request域中不存有上一次獲取的參數,就會add。session和context在容器中都存有,就會直接replace。
? ? ?3.監聽綁定到HttpSession域中的某個對象的狀態的事件監聽器 ? ? ? ? ?綁定-->解除綁定? ? ? ? ? ? ? ?綁定:保存-setAttribute ? ? ? ? ? ? ?解除綁定:移除-removeAttribute
? ? ? ? ?鈍化-->活化 ? ? ? ? ? ? 鈍化:將Session對象持久化到存儲設備上 ? ? ? ? ? ? 活化:將session對象將一個存儲設備上恢復
? ? ? ? ?鈍化原因:session放在server中的。當在線對象特別多,session內存開銷非常大,session的鈍化機制就可解決。將server中臨時不使用的session對象 序列化到系統文件或數據庫中;在須要使用時反序列化到系統內存中 整個過程由server自己主動完畢。
Tomcat兩種Session鈍化管理器: <a>Session鈍化機制由SessionManager管理 ? ? ? ?org.apache.catalina.session.StandardManager 當Tomcatserver被關閉或重新啟動時 tomcatserver會將當前內存中的Session對象鈍化到server文件系統中。還有一種情況是web應用程序被又一次載入時 內存中的Session對象也會被鈍化到server的文件系統中;鈍化后的文件被保存: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;/*** 計數監聽器*/ @WebListener public 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; @WebListener public 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");} }版權聲明:本文博主原創文章,博客,未經同意不得轉載。
總結
以上是生活随笔為你收集整理的JavaWeb显示器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象设计模式
- 下一篇: 使用NuGet发布自己的类库包(Libr