疾速進修JavaWeb中監聽器(Listener)的應用辦法。本站提示廣大學習愛好者:(疾速進修JavaWeb中監聽器(Listener)的應用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是疾速進修JavaWeb中監聽器(Listener)的應用辦法正文
1、監聽器引見
1.1、監聽器的概念
監聽器是一個專門用於對其他對象身上產生的事宜或狀況轉變停止監聽和響應處置的對象,當被監督的對象產生情形時,立刻采用響應的行為。監聽器其實就是一個完成特定接口的通俗java法式,這個法式專門用於監聽另外一個java對象的辦法挪用或屬性轉變,當被監聽對象產生上述事宜後,監聽器某個辦法立刻被履行。
1.2、監聽器案例——監聽window窗口的事宜監聽器
package me.gacl.listener.demo; import java.awt.Frame; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; public class Demo1 { /** *java的事宜監聽機制 *1、事宜監聽觸及到三個組件:事宜源、事宜對象、事宜監聽器 *2、當事宜源上產生某一個舉措時,它會挪用事宜監聽器的一個辦法,並在挪用該辦法時把事宜對象傳遞出來, * 開辟人員在監聽器中經由過程事宜對象,便可以拿到事宜源,從而對事宜源停止操作。 */ public static void main(String[] args) { Frame f = new Frame(); f.setSize(400, 400); f.setVisible(true); //注冊事宜監聽器 f.addWindowListener(new WindowListener(){ public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { } /** * 當window窗體封閉時就會WindowListener這個監聽器監聽到, * 監聽器就會挪用windowClosing辦法處置window窗體封閉時的舉措 */ public void windowClosing(WindowEvent e) { //經由過程事宜對象e來獲得事宜源對象 Frame f = (Frame) e.getSource(); System.out.println(f+"窗體正在封閉"); f.dispose(); } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { } }); } }
1.3、設計一個可以被其余對象監聽的對象
我們日常平凡做開辟的時刻,我們是寫監聽器去監聽其他對象,那末我們假如想設計一個對象,讓這個對象可以被其余對象監聽又該怎樣做呢,可以依照嚴厲的事宜處置模子來設計一個對象,這個對象便可以被其余對象監聽,事宜處置模子觸及到三個組件:事宜源、事宜對象、事宜監聽器。
上面我們來依照事宜處置模子來設計一個Person對象,詳細代碼以下:
package me.gacl.observer; /** * @ClassName: Person(事宜源) * @Description: 設計一個Person類作為事宜源,這個類的對象的行動(好比吃飯、跑步)可以被其他的對象監聽 * @author: 孤獨蒼狼 * @date: 2014-9-9 下晝9:26:06 * */ public class Person { /** * @Field: listener * 在Person類中界說一個PersonListener變量來記住傳遞出去的監聽器 */ private PersonListener listener; /** * @Method: eat * @Description: 設計Person的行動:吃 * @Anthor:孤獨蒼狼 * */ public void eat() { if (listener != null) { /** * 挪用監聽器的doeat辦法監聽Person類對象eat(吃)這個舉措,將事宜對象Event傳遞給doeat辦法, * 事宜對象封裝了事宜源,new Event(this)中的this代表的就是事宜源 */ listener.doeat(new Event(this)); } } /** * @Method: run * @Description: 設計Person的行動:跑 * @Anthor:孤獨蒼狼 * */ public void run() { if (listener != null) { /** * 挪用監聽器的dorun辦法監聽Person類對象run(跑)這個舉措,將事宜對象Event傳遞給doeat辦法, * 事宜對象封裝了事宜源,new Event(this)中的this代表的就是事宜源 */ listener.dorun(new Event(this)); } } /** * @Method: registerListener * @Description: 這個辦法是用來注冊對Person類對象的行動停止監聽的監聽器 * @Anthor:孤獨蒼狼 * * @param listener */ public void registerListener(PersonListener listener) { this.listener = listener; } } /** * @ClassName: PersonListener(事宜監聽器) * @Description: 設計Person類(事宜源)的監聽器接口 * @author: 孤獨蒼狼 * @date: 2014-9-9 下晝9:28:06 * */ interface PersonListener { /** * @Method: doeat * @Description: 這個辦法是用來監聽Person對象eat(吃)這個行動舉措, * 當完成類完成doeat辦法時便可以監聽到Person類對象eat(吃)這個舉措 * @Anthor:孤獨蒼狼 * * @param e */ void doeat(Event e); /** * @Method: dorun * @Description: 這個辦法是用來監聽Person對象run(跑)這個行動舉措, * 當完成類完成dorun辦法時便可以監聽到Person類對象run(跑)這個舉措 * @Anthor:孤獨蒼狼 * * @param e */ void dorun(Event e); } /** * @ClassName: Event(事宜對象) * @Description:設計事宜類,用來封裝事宜源 * @author: 孤獨蒼狼 * @date: 2014-9-9 下晝9:37:56 * */ class Event { /** * @Field: source * 事宜源(Person就是事宜源) */ private Person source; public Event() { } public Event(Person source) { this.source = source; } public Person getSource() { return source; } public void setSource(Person source) { this.source = source; } }
經由如許的設計以後,Peron類的對象就是可以被其他對象監聽了。測試代碼以下:
package me.gacl.observer; public class PersonTest { /** * @Method: main * @Description: 測試Person類 * @Anthor:孤獨蒼狼 * * @param args */ public static void main(String[] args) { // Person p = new Person(); //注冊監聽p對象行動的監聽器 p.registerListener(new PersonListener() { //監聽p吃器械這個行動 public void doeat(Event e) { Person p = e.getSource(); System.out.println(p + "在吃器械"); } //監聽p跑步這個行動 public void dorun(Event e) { Person p = e.getSource(); System.out.println(p + "在跑步"); } }); //p在吃器械 p.eat(); //p在跑步 p.run(); } }
運轉成果:
me.gacl.observer.Person@4a5ab2在吃器械
me.gacl.observer.Person@4a5ab2在跑步
2、JavaWeb中的監聽器
2.1、根本概念
JavaWeb中的監聽器是Servlet標准中界說的一種特別類,它用於監聽web運用法式中的ServletContext, HttpSession和 ServletRequest等域對象的創立與燒毀事宜,和監聽這些域對象中的屬性產生修正的事宜。
2.2、Servlet監聽器的分類
在Servlet標准中界說了多品種型的監聽器,它們用於監聽的事宜源分離為ServletContext,HttpSession和ServletRequest這三個域對象
Servlet標准針對這三個對象上的操作,又把多品種型的監聽器劃分為三品種型:
•監聽域對象本身的創立和燒毀的事宜監聽器。
•監聽域對象中的屬性的增長和刪除的事宜監聽器。
•監聽綁定到HttpSession域中的某個對象的狀況的事宜監聽器。
2.3、監聽ServletContext域對象的創立和燒毀
ServletContextListener接口用於監聽ServletContext對象的創立和燒毀事宜。完成了ServletContextListener接口的類都可以對ServletContext對象的創立和燒毀停止監聽。
•當ServletContext對象被創立時,激起contextInitialized (ServletContextEvent sce)辦法。
•當ServletContext對象被燒毀時,激起contextDestroyed(ServletContextEvent sce)辦法。
•ServletContext域對象創立和燒毀機會:
創立:辦事器啟動針對每個Web運用創立ServletContext
燒毀:辦事器封閉前先封閉代表每個web運用的ServletContext
典范:編寫一個MyServletContextListener類,完成ServletContextListener接口,監聽ServletContext對象的創立和燒毀
1、編寫監聽器,代碼以下:
package me.gacl.web.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * @ClassName: MyServletContextListener * @Description: MyServletContextListener類完成了ServletContextListener接口, * 是以可以對ServletContext對象的創立和燒毀這兩個舉措停止監聽。 * @author: 孤獨蒼狼 * @date: 2014-9-9 下晝10:26:16 * */ public class MyServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContext對象創立"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("ServletContext對象燒毀"); } }
2、在web.xml文件中注冊監聽器
我們在下面的中講到,要想監聽事宜源,那末必需將監聽器注冊到事宜源上能力夠完成對事宜源的行動舉措停止監聽,在JavaWeb中,監聽的注冊是在web.xml文件中停止設置裝備擺設的,以下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 注冊針對ServletContext對象停止監聽的監聽器 --> <listener> <description>ServletContextListener監聽器</description> <!--完成了ServletContextListener接口的監聽器類 --> <listener-class>me.gacl.web.listener.MyServletContextListener</listener-class> </listener> </web-app>
經由這兩個步調,我們就完成了監聽器的編寫和注冊,Web辦事器在啟動時,就會主動把在web.xml中設置裝備擺設的監聽器注冊到ServletContext對象上,如許開辟好的MyServletContextListener監聽器便可以對ServletContext對象停止監聽了。
2.4、監聽HttpSession域對象的創立和燒毀
HttpSessionListener 接口用於監聽HttpSession對象的創立和燒毀
創立一個Session時,激起sessionCreated (HttpSessionEvent se) 辦法
燒毀一個Session時,激起sessionDestroyed (HttpSessionEvent se) 辦法。
典范:編寫一個MyHttpSessionListener類,完成HttpSessionListener接口,監聽HttpSession對象的創立和燒毀
1、編寫監聽器,代碼以下:
package me.gacl.web.listener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * @ClassName: MyHttpSessionListener * @Description: MyHttpSessionListener類完成了HttpSessionListener接口, * 是以可以對HttpSession對象的創立和燒毀這兩個舉措停止監聽。 * @author: 孤獨蒼狼 * @date: 2014-9-9 下晝11:04:33 * */ public class MyHttpSessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println( se.getSession() + "創立了!!"); } /* HttpSession的燒毀機會須要在web.xml中停止設置裝備擺設,以下: * <session-config> <session-timeout>1</session-timeout> </session-config> 如許設置裝備擺設就表現session在1分鐘以後就被燒毀 */ @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session燒毀了!!"); } }
2、在web.xml文件中注冊監聽器
<!--注冊針對HttpSession對象停止監聽的監聽器--> <listener> <description>HttpSessionListener監聽器</description> <listener-class>me.gacl.web.listener.MyHttpSessionListener</listener-class> </listener> <!-- 設置裝備擺設HttpSession對象的燒毀機會 --> <session-config> <!--設置裝備擺設HttpSession對象的1分鐘以後燒毀 --> <session-timeout>1</session-timeout> </session-config>
當我們拜訪jsp頁面時,HttpSession對象就會創立,此時便可以在HttpSessionListener不雅察到HttpSession對象的創立進程了,我們可以寫一個jsp頁面不雅察HttpSession對象創立的進程。
以下:index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <!DOCTYPE HTML> <html> <head> <title>HttpSessionListener監聽器監聽HttpSession對象的創立</title> </head> <body> 一拜訪JSP頁面,HttpSession就創立了,創立好的Session的Id是:${pageContext.session.id} </body> </html>
運轉成果以下:
2.5、監聽ServletRequest域對象的創立和燒毀
ServletRequestListener接口用於監聽ServletRequest 對象的創立和燒毀
Request對象被創立時,監聽器的requestInitialized(ServletRequestEvent sre)辦法將會被挪用
Request對象被燒毀時,監聽器的requestDestroyed(ServletRequestEvent sre)辦法將會被挪用
ServletRequest域對象創立和燒毀機會:
創立:用戶每次拜訪都邑創立request對象
燒毀:以後拜訪停止,request對象就會燒毀
典范:編寫一個MyServletRequestListener類,完成ServletRequestListener接口,監聽ServletRequest對象的創立和燒毀
1、編寫監聽器,代碼以下:
package me.gacl.web.listener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; /** * @ClassName: MyServletRequestListener * @Description: MyServletRequestListener類完成了ServletRequestListener接口, * 是以可以對ServletRequest對象的創立和燒毀這兩個舉措停止監聽。 * @author: 孤獨蒼狼 * @date: 2014-9-9 下晝11:50:08 * */ public class MyServletRequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent sre) { System.out.println(sre.getServletRequest() + "燒毀了!!"); } @Override public void requestInitialized(ServletRequestEvent sre) { System.out.println(sre.getServletRequest() + "創立了!!"); } }
2、在web.xml文件中注冊監聽器
<!--注冊針對ServletRequest對象停止監聽的監聽器--> <listener> <description>ServletRequestListener監聽器</description> <listener-class>me.gacl.web.listener.MyServletRequestListener</listener-class> </listener>
測試成果以下:
從運轉成果中可以看到,用戶每次拜訪都邑創立request對象,當拜訪停止後,request對象就會燒毀。
以上就是對監聽器的一些簡略講授。