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