JavaWeb监听器
三大組件
- Servlet
- Listener
- Filter
Listener:監聽器
監聽器:
- 它是一個接口,內容由我們來實現;
- 它需要注冊,例如注冊在按鈕上!
- 監聽器中的方法,會在特殊事件發生時被調用!
觀察者:
- 事件源:小偷
- 事件:偷東西
- 監聽器;
- 警察
- 監聽器中的方法:抓捕
JavaWeb中的監聽器
事件源:三大域
1、ServletContext
ServletContextListener
生命周期監聽,它有兩個方法,一個在出生時調用,一個在死亡時調用
- void contextInitialized(ServletContextEvent sce):創建SErvletcontext時
- void contextDestroyed(ServletContextEvent sce):銷毀Servletcontext時
ServletContextAttributeListener
屬性監聽,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最后一個是在移除屬性時調用
- void attributeAdded(ServletContextAttributeEvent event):添加屬性時
- void attributeReplaced(ServletContextAttributeEvent event):替換屬性時
- void attributeRemoved(ServletContextAttributeEvent event):移除屬性時
2、HttpSession
HttpSessionListener
生命周期監聽,它有兩個方法,一個在出生時調用,一個在死亡時調用
- void sessionCreated(HttpSessionEvent se):創建session時
- void sessionDestroyed(HttpSessionEvent se):銷毀session時
HttpSessioniAttributeListener
屬性監聽,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最后一個是在移除屬性時調用
- void attributeAdded(HttpSessionBindingEvent event):添加屬性時
- void attributeReplaced(HttpSessionBindingEvent event):替換屬性時
- void attributeRemoved(HttpSessionBindingEvent event):移除屬性時
3、ServletRequest
ServletRequestListener
生命周期監聽,它有兩個方法,一個在出生時調用,一個在死亡時調用
- void requestInitialized(ServletRequestEvent sre):創建request時
- void requestDestroyed(ServletRequestEvent sre):銷毀request時
ServletRequestAttributeListener
屬性監聽,它有三個方法,一個在添加屬性時調用,一個在替換屬性時調用,最后一個是在移除屬性時調用
- void attributeAdded(ServletRequestAttributeEvent srae):添加屬性時
- void attributeReplaced(ServletRequestAttributeEvent srae):替換屬性時
- void attributeRemoved(ServletRequestAttributeEvent srae):移除屬性時
javaWeb中完成編寫監聽器
- 寫一個監聽器類:要求必須去實現某個監聽器接口
- 注冊,是在web.xml中配置來完成注冊
事件對象
1、ServletContextEvent
ServletContext getServletContext()
2、HttpSessionEvent
HttpSession getSession()
3、ServletRequestEvent
- ServletContext getServletContext();
- ServletReques getServletRequest();
4、ServletContextAttributeEvent
- ServletContext getServletContext()
- String getName():獲取屬性名
- Object getValue():獲取屬性值
5、HttpSessionBindingEvent
6、ServletRequestAttributeEvent
感知監聽
- 都與HttpSession相關
- 它用來添加到JavaBean上,而不是添加到三大域上
- 這兩個監聽器都不需要在web.xml中注冊
HttpSessionBindingListener:添加到javabean上,javabean就知道自己是否添加到session中了。
JavaWeb監聽器概述
在JavaWeb被監聽的事件源為:ServletContext、HttpSession、ServletRequest,即三大域對象
- 監聽域對象“創建”與“銷毀”的監聽器
- 監聽域對象“操作域屬性”的監聽器
- 監聽HttpSession的監聽器
創建與銷毀監聽器
創建與銷毀監聽器一共有三個
1、ServletContextListener
Tomcat啟動和關閉時調用下面兩個方法
- public void contextInitialized(ServletContextEvent evt):ServletContext對象被創建后調用
- public void contextDestroyed(ServletContextEvent evt):ServletContext對象被銷毀前調用
2、HttpSessionListener
開始會話和結束會話時調用下面兩個方法
- public void sessionCreated(HttpSessionEvent evt):HttpSession對象被創建后調用
- public void sessionDestroyed(HttpSessionEvent evt):HttpSession對象被銷毀前調用
3、ServletRequestListener
開始請求和結束請求時調用下面兩個方法
- public void requestInitiallized(ServletRequestEvent evt):ServletRequest對象被創建后調用
- public void requestDestroyed(ServletRequestEvent evt):ServletRequest對象被銷毀前調用
事件對象
- ServletContextEvent:ServletContext getServletContext()
- HttpSeessionEvent:HttpSession getSession()
- ServletRequestEvent:
- ServletRequest getServletRequest()
- ServletContext getServletContext()
編寫測試例子
- 編寫MyServletContextListener類,實現ServletContextListener接口
- 在web.xml文件中部署監聽器
- 為了看到session銷毀的效果,在web.xml文件中設置session失效時間為1分鐘
操作域屬性的監聽器
當對域屬性進行增、刪、改時,執行的監聽器一共有三個:
1、ServletContextAttributeListener
在ServletContext域進行增、刪、改屬性時調用下面方法
- public void attributeAdded(ServletContextAttributeEvent evt)
- public void attributeRemoved(ServletContextAttributeEvent evt)
- public void attributeReplaced(ServletContextAttributeEvent evt)
2、HttpSessionAttributeListener
在HttpSession域進行增、刪、改屬性時調用下面方法
- public void attributeAdded(HttpSessionBindingEvent evt)
- public void attributeRemoved (HttpSessionBindingEvent evt)
- public void attributeReplaced (HttpSessionBindingEvent evt)
3、ServletRequestAttributeListener
在ServletRequest域進行增、刪、改屬性時調用下面方法
- public void attributeAdded(ServletRequestAttributeEvent evt)
- public void attributeRemoved (ServletRequestAttributeEvent evt)
- public void attributeReplaced (ServletRequestAttributeEvent evt)
下面對這三個監聽器的事件對象功能進行介紹:
4、ServletContextAttributeEvent
- String getName():獲取當前操作的屬性名
- Object getValue():獲取當前操作的屬性值
- ServletContext getServletContext():獲取ServletContext對象
5、HttpSessionBindingEvent
- String getName():獲取當前操作的屬性名
- Object getValue():獲取當前操作的屬性值
- HttpSession getSession():獲取當前操作的session對象
6、ServletRequestAttributeEvent
- String getName():獲取當前操作的屬性名
- Object getValue():獲取當前操作的屬性值
- ServletContext getServletContext():獲取ServletContext對象
- ServletRequest getServletRequest():獲取當前操作的ServletRequest對象
Session的序列化
服務器關閉的時候,會把session序列化到SESSION.ser文件中
不需要序列化的時候,如下設置
HttpSession的監聽器
還有兩個與HttpSession相關的特殊的監聽器,這兩個監聽器的特點如下:
- 不用在web.xml文件中部署
- 這兩個監聽器不是給session添加,而是給Bean添加。即讓Bean類實現監聽器接口,然后再把Bean對象添加到session域中
下面對這兩個監聽器介紹一下:
1、HttpSessionBindingListener
當某個類實現了該接口后,可以感知本類對象添加到session中,以及感知從session中移除。例如讓Person類實現HttpSessionBindingListener接口,那么當把Person對象添加到session中,或者把Person對象從session中移除時會調用下面兩個方法:
public void valueBound(HttpSessionBindingEvent event)
當把監聽器對象添加到session中會調用監聽器對象的本方法public void valueUnbound(HttpSessionBindingEvent event)
當把監聽器對象從session中移除時會調用監聽器對象的本方法
這里要注意,HttpSessionBindingListener監聽器的使用與前面介紹的都不相同,當該監聽器對象添加到session中,或把該監聽器對象從session移除時會調用監聽器中的方法。并且無需在web.xml文件中部署這個監聽器
示例步驟:
- 編寫Person類,讓其實現HttpSessionBindingListener監聽器接口
- 編寫Servlet類,一個方法向session中添加Person對象,另一個從session中移除Person對象
- 在index.jsp中給出兩個超鏈接,分別訪問Servlet中的兩個方法
Pseron.java
public class Person implements HttpSessionBindingListener {private String name;private int age;private String sex;public Person(String name, int age, String sex) {super();this.name = name;this.age = age;this.sex = sex;}public Person() {super();}public String toString() {return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public void valueBound(HttpSessionBindingEvent evt) {System.out.println("把Person對象存放到session中:" + evt.getValue());}public void valueUnbound(HttpSessionBindingEvent evt) {System.out.println("從session中移除Pseron對象:" + evt.getValue());} }ListenerServlet.java
public class ListenerServlet extends BaseServlet {public String addPerson(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Person p = new Person("zhangSan", 23, "male");request.getSession().setAttribute("person", p);return "/index.jsp";}public String removePerson(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.getSession().removeAttribute("person");return "/index.jsp";}index.jsp
<body><a href="<c:url value='/ListenerServlet?method=addPerson'/>">addPerson</a><br/><a href="<c:url value='/ListenerServlet?method=removePerson'/>">removePerson</a><br/></body>2、HttpSessionActivationListener
Tomcat會在session長時間不被使用時鈍化session對象,所謂鈍化session,就是把session通過序列化的方式保存到硬盤文件中。當用戶再使用session時,Tomcat還會把鈍化的對象再活化session,所謂活化就是把硬盤文件中的session在反序列化回內存。當session被Tomcat鈍化時,session中存儲的對象也被純化,當session被活化時,也會把session中存儲的對象活化。如果某個類實現了HttpSessionActiveationListener接口后,當對象隨著session被鈍化和活化時,下面兩個方法就會被調用:
- public void sessionWillPassivate(HttpSessionEvent se):當對象感知被活化時調用本方法
- public void sessionDidActivate(HttpSessionEvent se):當對象感知被鈍化時調用本方法
HttpSessionActivationListener監聽器與HttpSessionBindingListener監聽器相似,都是感知型的監聽器,例如讓Person類實現了HttpSessionActivationListener監聽器接口,并把Person對象添加到了session中后,當Tomcat鈍化session時,同時也會鈍化session中的Person對象,這時Person對象就會感知到自己被鈍化了,其實就是調用Person對象的sessionWillPassivate()方法。當用戶再次使用session時,Tomcat會活化session,這時Person會感知到自己被活化,其實就是調用Person對象的sessionDidActivate()方法。
注意,因為鈍化和活化session,其實就是使用序列化和反序列化技術把session從內存保存到硬盤,和把session從硬盤加載到內存。這說明如果Person類沒有實現Serializable接口,那么當session鈍化時就不會鈍化Person,而是把Person從session中移除再鈍化!這也說明session活化后,session中就不在有Person對象了。
示例步驟:
先不管HttpSessionActivationListener監聽器接口,先來配置Tomcat鈍化session的參數,把下面配置文件放到tomcat\conf\catalina\localhost目錄下!文件名稱為項目名稱。
<Context><Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"><Store className="org.apache.catalina.session.FileStore" directory="mysession"/></Manager> </Context>訪問項目的index.jsp頁面,這會使Tomcat創建Session對象,然后等待一分鐘后,查看Tomcat\work\Catalina\localhost\listener\mysession目錄下是否會產生文件,如果產生了,說明鈍化session的配置成功了,可以開始下一步了。
創建Person類,讓Person類實現HttpSessionActivationListener和Serializable接口
Person.java
public class Person implements HttpSessionActivationListener, Serializable {private String name;private int age;private String sex;public Person(String name, int age, String sex) {super();this.name = name;this.age = age;this.sex = sex;}public Person() {super();}public String toString() {return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public void sessionDidActivate(HttpSessionEvent evt) {System.out.println("session已經活化");}public void sessionWillPassivate(HttpSessionEvent evt) {System.out.println("session被鈍化了!");} }與上例一樣,編寫Servlet,提供兩個方法:一個向session中添加Person對象,另一個從session中移除Person對象:
Person.java
public class ListenerServlet extends BaseServlet {public String addPerson(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Person p = new Person("zhangSan", 23, "male");request.getSession().setAttribute("person", p);return "/index.jsp";}public String removePerson(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.getSession().removeAttribute("person");return "/index.jsp";} }在index.jsp頁面中給出訪問addPerson()和removePerson()的方法:
<body><a href="<c:url value='/ListenerServlet?method=addPerson'/>">addPerson</a><br/><a href="<c:url value='/ListenerServlet?method=removePerson'/>">removePerson</a><br/></body>- 打開index.jsp頁面,這時Tomcat會創建session,必須在1分鐘之前點擊addPerson鏈接,這能保證在session被鈍化之前把Person對象添加到session中
- 等待一分鐘,這時session會被鈍化,也就會調用Person的sessionWillPassivate()
- 刷新一下index.jsp頁面,這會使session活化,會調用Person的sessionDidActivate()方法
總結
以上是生活随笔為你收集整理的JavaWeb监听器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaWeb:JDBC之事务
- 下一篇: JavaWeb:上传下载文件