JavaWeb显示器
生活随笔
收集整理的這篇文章主要介紹了
JavaWeb显示器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文研究的總結(jié)。歡迎轉(zhuǎn)載,但請注明出處:http://blog.csdn.net/pistolove/article/details/44310967
A:監(jiān)聽器的定義
? ? ?專門用于其它對象身上發(fā)生的事件或狀態(tài)改變進(jìn)行監(jiān)聽和對應(yīng)事件處理的對象,當(dāng)被監(jiān)聽的對象發(fā)生改變時(shí),馬上採取對應(yīng)的行動。 ? ? ? ? ? ?client請求 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ServletContext --> Application ? ? ?上下文對象 由容器創(chuàng)建 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? web監(jiān)聽器 ? ? ? ?Httpsession-->? Session ? ? ? ? 保存上下文信息的機(jī)制 保存每一個會話 ? ? ?server端操作 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ServletHttpRequest-->?Request ? ?客戶發(fā)送請求時(shí)創(chuàng)建? ? ?監(jiān)聽器是servlet規(guī)范中定義的一種特殊類;用于監(jiān)聽ServletContext、httpsession和ServletRequest等域?qū)ο蟮膭?chuàng)建和銷毀事件;用于監(jiān)聽域?qū)ο蟮膶傩园l(fā)生改動的事件;能夠再事件發(fā)生前、發(fā)生后做一些必要的處理。
B:web監(jiān)聽器的主要用途:
? ? ?1. 統(tǒng)計(jì)在線人數(shù)和在線用戶 ? ? ?2.?系統(tǒng)啟動時(shí)載入初始化信息 ? ? ?3.?統(tǒng)計(jì)站點(diǎn)訪問量 ? ? ?4.?跟Spring結(jié)合C:一個web監(jiān)聽器實(shí)例
? ? ?步驟: ? ? ?1.?創(chuàng)建一個實(shí)現(xiàn)監(jiān)聽器接口的類 ? ? ?2. 配置web.xml文件進(jìn)行注冊? ? ?監(jiān)聽器啟動順序:多個監(jiān)聽器啟動順序依照注冊順序運(yùn)行的 ? ? ?優(yōu)先級:監(jiān)聽器 >過濾器>servlet
D:監(jiān)聽器分類
? ? ?依照監(jiān)聽的對象劃分 ? ? ?1.?用于監(jiān)聽?wèi)?yīng)用程序?qū)ο?(ServletContext)的事件監(jiān)聽器 ? ? ?2.?用于監(jiān)聽用戶會話對象(HttpSession)的事件監(jiān)聽器 ? ? ?3.?用于監(jiān)聽請求消息對象(ServletRequest)的事件監(jiān)聽器? ? ?依照監(jiān)聽的事件劃分 ? ? ?1.監(jiān)聽域?qū)ο笞陨淼膭?chuàng)建和銷毀的事件監(jiān)聽器 ? ? ? ? ? ServletContext --> ServletContextListener ? ? ? ? ??? ? ? ?主要用途:定時(shí)器 全局屬性對象
? ? ? ? ??HttpSession?-->?HttpSessionListener ? ? ? ? ??? ? ? ?主要用途:統(tǒng)計(jì)在線人數(shù) 記錄訪問日志 ? ? ? ? ? ? ? ? ? ? ??Session銷毀:關(guān)閉server ; Session超時(shí) 。 關(guān)閉瀏覽器,Session過期 ? ? ? ? ??? ? ? ?在web.xml中配置session過期時(shí)間
? ? ? ? ? ServletReqest ServletRequestListener ? ? ? ? ??? ? ? ?主要用途:讀取參數(shù) 記錄訪問歷史
? ? ?2.監(jiān)聽域?qū)ο笾械膶傩缘奶砑雍蛣h除的事件監(jiān)聽器 ? ? ? ? ??ServletContext --> servletContextAttributeListener ? ? ? ? ? 上下文 ? ? ? ? ? ? ? ? ??HttpSession-->?HttpSessionAttributeListner ? ? ? ? ? ? ? ? ? ? ?一次會話
? ? ? ? ??HttpServletRequest?-->?ServletRequestAtttibuteListener ? 一次請求
? ? ? ? ? request.getAttribute() 放在域?qū)ο笾械膮?shù) ? ? ? ? ? request.getParameter() ?request的請求參數(shù)?www.baidu.com/username=zs ? ? ? ? ? 須要將username放到Attribute中,request.setAttribute("username","zs");放在域?qū)ο笾械膶傩?直接通過EL表達(dá)式就可取出 ?<%=username%>。在多次點(diǎn)擊button請求時(shí), 因?yàn)閞equest在訪問結(jié)束后就銷毀了,在request域中不存有上一次獲取的參數(shù),就會add。session和context在容器中都存有,就會直接replace。
? ? ?3.監(jiān)聽綁定到HttpSession域中的某個對象的狀態(tài)的事件監(jiān)聽器 ? ? ? ? ?綁定-->解除綁定? ? ? ? ? ? ? ?綁定:保存-setAttribute ? ? ? ? ? ? ?解除綁定:移除-removeAttribute
? ? ? ? ?鈍化-->活化 ? ? ? ? ? ? 鈍化:將Session對象持久化到存儲設(shè)備上 ? ? ? ? ? ? 活化:將session對象將一個存儲設(shè)備上恢復(fù)
? ? ? ? ?鈍化原因:session放在server中的。當(dāng)在線對象特別多,session內(nèi)存開銷非常大,session的鈍化機(jī)制就可解決。將server中臨時(shí)不使用的session對象 序列化到系統(tǒng)文件或數(shù)據(jù)庫中;在須要使用時(shí)反序列化到系統(tǒng)內(nèi)存中 整個過程由server自己主動完畢。
Tomcat兩種Session鈍化管理器: <a>Session鈍化機(jī)制由SessionManager管理 ? ? ? ?org.apache.catalina.session.StandardManager 當(dāng)Tomcatserver被關(guān)閉或重新啟動時(shí) tomcatserver會將當(dāng)前內(nèi)存中的Session對象鈍化到server文件系統(tǒng)中。還有一種情況是web應(yīng)用程序被又一次載入時(shí) 內(nèi)存中的Session對象也會被鈍化到server的文件系統(tǒng)中;鈍化后的文件被保存:Tomcat安裝路徑/work/Catalina/hostname/applicationname/SESSION.ser
<b>org.apache.catalina.session.Persistentmanager 在鈍化基礎(chǔ)上進(jìn)行擴(kuò)張,能夠配置主流內(nèi)存的Session對象數(shù)目,將不常使用的Session對象保存到文件系統(tǒng)或數(shù)據(jù)庫,當(dāng)使用時(shí)再又一次載入默認(rèn)情況下 tomcat提供兩個鈍化驅(qū)動類:org.apache.Catalina.FileStore 和 org.apache.Catalina.JDBCStore
HttpSessionBindingListener類 ? 綁定:valueBound方法 ??解除綁定:valueUnbound方法?
HttpSessionActivationListener類 ??鈍化:sessionWillPassivate方法 ??活化:sessionDidActivate方法
不須要在web.xml中注冊;鈍化和活化必須實(shí)現(xiàn)序列化serializable接口才行。
E:監(jiān)聽器的實(shí)例--在線人數(shù)統(tǒng)計(jì)
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;/*** 計(jì)數(shù)監(jiān)聽器*/ @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");} }版權(quán)聲明:本文博主原創(chuàng)文章,博客,未經(jīng)同意不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的JavaWeb显示器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象设计模式
- 下一篇: Java Web项目的发布