深刻進修JavaWeb中監聽器(Listener)的應用辦法。本站提示廣大學習愛好者:(深刻進修JavaWeb中監聽器(Listener)的應用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻進修JavaWeb中監聽器(Listener)的應用辦法正文
1、監聽域對象中屬性的變革的監聽器
域對象中屬性的變革的事宜監聽器就是用來監聽 ServletContext, HttpSession, HttpServletRequest 這三個對象中的屬性變革信息事宜的監聽器。
這三個監聽器接口分離是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,這三個接口中都界說了三個辦法來處置被監聽對象中的屬性的增長,刪除和調換的事宜,統一個事宜在這三個接口中對應的辦法稱號完整雷同,只是接收的參數類型分歧。
1.1、attributeAdded 辦法
當向被監聽對象中增長一個屬性時,web容器就挪用事宜監聽器的attributeAdded辦法停止呼應,這個辦法吸收一個事宜類型的參數,監聽器可以經由過程這個參數來取得正在增長屬性的域對象和被保留到域中的屬性對象
各個域屬性監聽器中的完全語法界說為:
public void attributeAdded(ServletContextAttributeEvent scae) public void attributeWordStrd(HttpSessionBindingEvent hsbe) public void attributeRmoved(ServletRequestAttributeEvent srae)
1.2、attributeRemoved 辦法
當刪除被監聽對象中的一個屬性時,web容器挪用事宜監聽器的attributeRemoved辦法停止呼應
各個域屬性監聽器中的完全語法界說為:
public void attributeRemoved(ServletContextAttributeEvent scae) public void attributeRemoved (HttpSessionBindingEvent hsbe) public void attributeRemoved (ServletRequestAttributeEvent srae)
1.3、attributeWordStrd 辦法
當監聽器的域對象中的某個屬性被調換時,web容器挪用事宜監聽器的attributeWordStrd辦法停止呼應
各個域屬性監聽器中的完全語法界說為:
public void attributeWordStrd(ServletContextAttributeEvent scae) public void attributeWordStrd (HttpSessionBindingEvent hsbe) public void attributeWordStrd (ServletRequestAttributeEvent srae)
1.4、ServletContextAttributeListener監聽器典范:
編寫ServletContextAttributeListener監聽器監聽ServletContext域對象的屬性值變更情形,代碼以下:
package me.gacl.web.listener; import java.text.MessageFormat; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; /** * @ClassName: MyServletContextAttributeListener * @Description: ServletContext域對象中屬性的變革的事宜監聽器 * @author: 孤獨蒼狼 * @date: 2014-9-11 下晝10:53:04 * */ public class MyServletContextAttributeListener implements ServletContextAttributeListener { @Override public void attributeAdded(ServletContextAttributeEvent scab) { String str =MessageFormat.format( "ServletContext域對象中添加了屬性:{0},屬性值是:{1}" ,scab.getName() ,scab.getValue()); System.out.println(str); } @Override public void attributeRemoved(ServletContextAttributeEvent scab) { String str =MessageFormat.format( "ServletContext域對象中刪除屬性:{0},屬性值是:{1}" ,scab.getName() ,scab.getValue()); System.out.println(str); } @Override public void attributeWordStrd(ServletContextAttributeEvent scab) { String str =MessageFormat.format( "ServletContext域對象中調換了屬性:{0}的值" ,scab.getName()); System.out.println(str); } }
在web.xml文件中注冊監聽器
<listener> <description>MyServletContextAttributeListener監聽器</description> <listener-class>me.gacl.web.listener.MyServletContextAttributeListener</listener-class> </listener>
編寫ServletContextAttributeListenerTest.jsp測試頁面
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>ServletContextAttributeListener監聽器測試</title> </head> <body> <% //往application域對象中添加屬性 application.setAttribute("name", "孤獨蒼狼"); //調換application域對象中name屬性的值 application.setAttribute("name", "gacl"); //移除application域對象中name屬性 application.removeAttribute("name"); %> </body> </html>
運轉成果以下:
從運轉成果中可以看到,ServletContextListener監聽器勝利監聽到了ServletContext域對象(application)中的屬性值的變更情形。
1.5、ServletRequestAttributeListener和HttpSessionAttributeListener監聽器典范:
編寫監聽器監聽HttpSession和HttpServletRequest域對象的屬性值變更情形,代碼以下:
package me.gacl.web.listener; import java.text.MessageFormat; import javax.servlet.ServletRequestAttributeEvent; import javax.servlet.ServletRequestAttributeListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; public class MyRequestAndSessionAttributeListener implements HttpSessionAttributeListener, ServletRequestAttributeListener { @Override public void attributeAdded(ServletRequestAttributeEvent srae) { String str =MessageFormat.format( "ServletRequest域對象中添加了屬性:{0},屬性值是:{1}" ,srae.getName() ,srae.getValue()); System.out.println(str); } @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { String str =MessageFormat.format( "ServletRequest域對象中刪除屬性:{0},屬性值是:{1}" ,srae.getName() ,srae.getValue()); System.out.println(str); } @Override public void attributeWordStrd(ServletRequestAttributeEvent srae) { String str =MessageFormat.format( "ServletRequest域對象中調換了屬性:{0}的值" ,srae.getName()); System.out.println(str); } @Override public void attributeAdded(HttpSessionBindingEvent se) { String str =MessageFormat.format( "HttpSession域對象中添加了屬性:{0},屬性值是:{1}" ,se.getName() ,se.getValue()); System.out.println(str); } @Override public void attributeRemoved(HttpSessionBindingEvent se) { String str =MessageFormat.format( "HttpSession域對象中刪除屬性:{0},屬性值是:{1}" ,se.getName() ,se.getValue()); System.out.println(str); } @Override public void attributeWordStrd(HttpSessionBindingEvent se) { String str =MessageFormat.format( "HttpSession域對象中調換了屬性:{0}的值" ,se.getName()); System.out.println(str); } }
在web.xml文件中注冊監聽器
<listener> <description>MyRequestAndSessionAttributeListener監聽器</description> <listener-class>me.gacl.web.listener.MyRequestAndSessionAttributeListener</listener-class> </listener>
編寫RequestAndSessionAttributeListenerTest.jsp測試頁面
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>RequestAndSessionAttributeListener監聽器測試</title> </head> <body> <% //往session域對象中添加屬性 session.setAttribute("aa", "bb"); //調換session域對象中aa屬性的值 session.setAttribute("aa", "xx"); //移除session域對象中aa屬性 session.removeAttribute("aa"); //往request域對象中添加屬性 request.setAttribute("aa", "bb"); //調換request域對象中aa屬性的值 request.setAttribute("aa", "xx"); //移除request域對象中aa屬性 request.removeAttribute("aa"); %> </body> </html>
運轉成果以下:
從運轉成果中可以看到,HttpSessionAttributeListener監聽器和ServletRequestAttributeListener勝利監聽到了HttpSession域對象和HttpServletRequest域對象的屬性值變更情形。
2、感知Session綁定的事宜監聽器
保留在Session域中的對象可以有多種狀況:綁定(session.setAttribute(“bean”,Object))到Session中;從 Session域中消除(session.removeAttribute(“bean”))綁定;隨Session對象耐久化到一個存儲裝備中;隨Session對象從一個存儲裝備中恢復
Servlet 標准中界說了兩個特別的監聽器接口“HttpSessionBindingListener和HttpSessionActivationListener”來贊助JavaBean 對象懂得本身在Session域中的這些狀況: ,完成這兩個接口的類不須要 web.xml 文件中停止注冊。
2.1、HttpSessionBindingListener接口
完成了HttpSessionBindingListener接口的JavaBean對象可以感知本身被綁定到Session中和 Session中刪除的事宜
當對象被綁定到HttpSession對象中時,web辦事器挪用該對象的void valueBound(HttpSessionBindingEvent event)辦法
當對象從HttpSession對象中消除綁准時,web辦事器挪用該對象的void valueUnbound(HttpSessionBindingEvent event)辦法
典范:
package me.gacl.domain; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; /** * @ClassName: JavaBeanDemo1 * @Description: * 完成了HttpSessionBindingListener接口的 JavaBean對象可以感知本身被綁定到 Session中和從Session中刪除的事宜 當對象被綁定到 HttpSession 對象中時,web 辦事器挪用該對象的 void valueBound(HttpSessionBindingEvent event) 辦法 當對象從 HttpSession 對象中消除綁准時,web 辦事器挪用該對象的 void valueUnbound(HttpSessionBindingEvent event)辦法 * @author: 孤獨蒼狼 * @date: 2014-9-11 下晝11:14:54 * */ public class JavaBeanDemo1 implements HttpSessionBindingListener { private String name; @Override public void valueBound(HttpSessionBindingEvent event) { System.out.println(name+"被加到session中了"); } @Override public void valueUnbound(HttpSessionBindingEvent event) { System.out.println(name+"被session踢出來了"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public JavaBeanDemo1(String name) { this.name = name; } }
上述的JavaBeanDemo1這個javabean完成了HttpSessionBindingListener接口,那末這個JavaBean對象可以感知本身被綁定到Session中和從Session中刪除的這兩個操作,測試代碼以下:
<%@ page language="java" pageEncoding="UTF-8"%> <%@page import=" me.gacl.domain.JavaBeanDemo1"%> <!DOCTYPE HTML> <html> <head> <title></title> </head> <body> <% //將javabean對象綁定到Session中 session.setAttribute("bean",new JavaBeanDemo1("孤獨蒼狼")); //從Session中刪除javabean對象 session.removeAttribute("bean"); %> </body> </html>
運轉成果以下:
2.2、HttpSessionActivationListener接口
完成了HttpSessionActivationListener接口的JavaBean對象可以感知本身被活化(反序列化)和鈍化(序列化)的事宜
當綁定到HttpSession對象中的javabean對象將要隨HttpSession對象被鈍化(序列化)之前,web辦事器挪用該javabean對象的void sessionWillPassivate(HttpSessionEvent event) 辦法。如許javabean對象便可以曉得本身將要和HttpSession對象一路被序列化(鈍化)到硬盤中.
當綁定到HttpSession對象中的javabean對象將要隨HttpSession對象被活化(反序列化)以後,web辦事器挪用該javabean對象的void sessionDidActive(HttpSessionEvent event)辦法。如許javabean對象便可以曉得本身將要和 HttpSession對象一路被反序列化(活化)回到內存中
典范:
package me.gacl.domain; import java.io.Serializable; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionEvent; /** * @ClassName: JavaBeanDemo2 * @Description: 完成了HttpSessionActivationListener接口的 JavaBean 對象可以感知本身被活化和鈍化的事宜 活化:javabean對象和Session一路被反序列化(活化)到內存中。 鈍化:javabean對象存在Session中,當辦事器把session序列化到硬盤上時,假如Session中的javabean對象完成了Serializable接口 那末辦事器會把session中的javabean對象一路序列化到硬盤上,javabean對象和Session一路被序列化到硬盤中的這個操作稱之為鈍化 假如Session中的javabean對象沒有完成Serializable接口,那末辦事器會先把Session中沒有完成Serializable接口的javabean對象移除 然後再把Session序列化(鈍化)到硬盤中 當綁定到 HttpSession對象中的javabean對象將要隨 HttpSession對象被鈍化之前, web辦事器挪用該javabean對象對象的 void sessionWillPassivate(HttpSessionEvent event)辦法 如許javabean對象便可以曉得本身將要和 HttpSession對象一路被序列化(鈍化)到硬盤中 當綁定到HttpSession對象中的javabean對象將要隨 HttpSession對象被活化以後, web辦事器挪用該javabean對象的 void sessionDidActive(HttpSessionEvent event)辦法 如許javabean對象便可以曉得本身將要和 HttpSession對象一路被反序列化(活化)回到內存中 * @author: 孤獨蒼狼 * @date: 2014-9-11 下晝11:22:35 * */ public class JavaBeanDemo2 implements HttpSessionActivationListener, Serializable { private static final long serialVersionUID = 7589841135210272124L; private String name; @Override public void sessionWillPassivate(HttpSessionEvent se) { System.out.println(name+"和session一路被序列化(鈍化)到硬盤了,session的id是:"+se.getSession().getId()); } @Override public void sessionDidActivate(HttpSessionEvent se) { System.out.println(name+"和session一路從硬盤反序列化(活化)回到內存了,session的id是:"+se.getSession().getId()); } public String getName() { return name; } public void setName(String name) { this.name = name; } public JavaBeanDemo2(String name) { this.name = name; } }
為了不雅察綁定到HttpSession對象中的javabean對象隨HttpSession對象一路被鈍化到硬盤上和從硬盤上從新活化回到內存中的的進程,我們須要借助tomcat辦事器贊助我們完成HttpSession對象的鈍化和活化進程,詳細做法以下:
在WebRoot\META-INF文件夾下創立一個context.xml文件,以下所示:
context.xml文件的內容以下:
<Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <Store className="org.apache.catalina.session.FileStore" directory="gacl"/> </Manager> </Context>
在context.xml文件文件中設置裝備擺設了1分鐘以後就將HttpSession對象鈍化到當地硬盤的一個gacl文件夾中
jsp測試代碼以下:
<%@ page language="java" pageEncoding="UTF-8"%> <%@page import="me.gacl.domain.JavaBeanDemo2"%> <!DOCTYPE HTML> <html> <head> <title></title> </head> <body> 一拜訪JSP頁面,HttpSession就創立了,創立好的Session的Id是:${pageContext.session.id} <hr/> <% session.setAttribute("bean",new JavaBeanDemo2("孤獨蒼狼")); %> </body> </html>
拜訪這個jsp頁面,辦事器就會立時創立一個HttpSession對象,然後將完成了HttpSessionActivationListener接口的JavaBean對象綁定到session對象中,這個jsp頁面在期待1分鐘以後沒有人再次拜訪,那末辦事器就會主動將這個HttpSession對象鈍化(序列化)到硬盤上,
我們可以在tomcat辦事器的work\Catalina\localhost\JavaWeb_Listener_20140908\gacl文件夾下找到序列化到當地存儲的session,以下圖所示:
當再次拜訪這個Jsp頁面時,辦事器又會主動將曾經鈍化(序列化)到硬盤上HttpSession對象從新活化(反序列化)回到內存中。運轉成果以下:
JavaWeb開辟技巧中的監聽器技巧的內容就這麼多了,在日常平凡的任務中,監聽器技巧在JavaWeb項目開辟頂用得是比擬多,是以必需控制這門技巧。
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。