1. Grundkonzepte
Der Hörer in Javaweb wird durch das Observer -Designmuster implementiert. In Bezug auf den Observer -Modus werde ich hier nicht zu viel Einführung geben, daher werde ich grob darüber sprechen, was es bedeutet.
Der Beobachtermodus wird auch als Abonnementmodus oder Listener -Modus bezeichnet. In diesem Modus gibt es zwei Zeichen: Der Beobachter und der Beobachter (normalerweise auch als Subjekt bezeichnet). Der Beobachter registriert ein Interesse an dem Thema. Wenn dieses Ereignis auftritt, benachrichtigt das Thema den Beobachter über eine Rückrufschnittstelle.
Lassen Sie mich ein Beispiel im Leben geben: Abonnieren Sie Zeitungen. Jede Familie oder Person kann Zeitungen mit der Zeitung abonnieren. Hier ist die Zeitung das "Thema" und die Familie ist der "Beobachter". Wenn beispielsweise eine Familie morgen früh die Zeitung abonnieren muss, ist dies ein "Ereignis". Am nächsten Morgen wurde die Zeitung produziert, und dies war das "Ereignis". Wenn der Vorfall erfolgt, sendet die Zeitung die Zeitung an den Postfach, der die "Callback -Schnittstelle" ist.
Für Zuhörer in Javaweb definiert die Servlet -Spezifikation einige Spalten der Hörer -Schnittstellenklassen, die Ereignisse der Anwendung über Schnittstellenklassen ausstellen. Wenn eine Bewerbung auf Ereignisse von Interesse anhören möchte, muss sie das entsprechende Ereignis nicht direkt registrieren. Stattdessen schreibt es seinen eigenen Hörer, um die entsprechende Schnittstellenklasse zu implementieren und seinen eigenen Hörer in den Servlet -Container zu registrieren. Wenn ein Ereignis, über das sich das Programm kümmert, auftritt, benachrichtigt der Servlet -Container den Hörer und ruft die Methoden im Hörer zurück. Der angepasste Hörer hier ist der Beobachter, und der Servlet -Container ist das Thema.
2. Probenanalyse
Wie oben erwähnt, setzt der Servlet -Container Ereignisse der Anwendung über die Listener -Schnittstellenklasse auf. Wir sind also nicht so sehr darum, Ereignisse zu registrieren, sondern die Hörer zu registrieren. Die entsprechenden Programmierschritte sind: 1. Schreiben Sie Ihren eigenen Hörer und implementieren Sie eine bestimmte Höreroberfläche. 2. Registrieren Sie Ihren Hörer in web.xml. Hier ist ein Beispiel für die einfachste Listener -Schnittstelle ServletContextListener:
1.TestListener.java
public class TestListener implementiert servletContextListener {public testListener () {} public void contextInitialized (ServletContexevent Scce) {System.out.println ("servletContexTener.contextinitialized"); {System.out.println ("ServletContextListener.ContextDestroyed");}}2.Web.xml
<Hörer> <Hörer-Klasse> com.nantang.listener.TestListener </Listener-Klasse> </Listener>
Wenn der Container startet, wird "ServletContextListener.ContextInitialized" an das Protokoll ausgegeben, und wenn der Container geschlossen ist, wird "ServletContextListener.ContextDestroyed" ausgegeben. Eine detaillierte Erklärung wird später weiter analysiert.
Es ist hier zu beachten, dass Sie beim Starten des Servers, wenn Sie das obige Beispiel in der IDE (Eclipse, STS usw.) demonstrieren, "ServletContextListener.ContextInitialized" in der Konsole sehen können, und wenn Sie den Server schließen, können Sie "servletContextListener.ContextDeFroyed" nicht sehen ". Dies ist nicht so, dass die kontextdestroyierte Methode nicht ausgeführt wird, sondern dass die IDE sie nicht perfekt implementiert. Um zu überprüfen, ob kontextdestroyed tatsächlich aufgerufen wird, können Sie ein Stück Code in Kontext schreiben, um den Inhalt der Datei auszugeben, anstatt ihn an die Konsole auszugeben.
3. Quellcodeanalyse
Lassen Sie uns nun analysieren, welche Ereignisse die Servlet -Spezifikation für uns definiert. Genauer gesagt, welche Hörschnittstellen definiert sind. Die folgenden Einführungen basieren auf der SERVLET 3.0 -Spezifikation.
Servlet3.0 bietet uns 8 Höreroberflächen, die nach ihrem Umfang in drei Kategorien unterteilt werden können:
1.Servlet Kontextbezogene Hörschnittstellen, einschließlich: ServletContextListener und ServletContextAttributelistener.
2. HTTP Session-bezogene Hörschnittstellen, einschließlich: HttpSessionListener, httpSessionActivationListener, httpSessionattributelistener und httpSessionBindingListener.
3. Die Hörschnittstelle im Zusammenhang mit der Servlet -Anfrage, einschließlich: ServletRequestListener und ServletRequestattributelistener.
Tatsächlich sollten Sie aus der Benennung der Schnittstelle in der Lage sein, seine grundlegenden Funktionen zu erraten. Erklären wir es nach der Kategorie unten.
1. SERVLET-Kontext-bezogene Hörschnittstelle
Bei der Einführung von Servlets zuvor haben wir erklärt, dass eine Webanwendung einem Servlet -Kontext entspricht. Daher wird die Lebensdauer der Ereignisse, die von ServletContextListener und ServletContextAttributelistener angehört werden, die gesamte Webanwendung durchlaufen. Nachfolgend finden Sie die Beziehung zwischen den Klassendiagrammhierarchien zwischen diesen beiden Schnittstellen.
1.1 EventListener
EventListener ist eine Tag -Schnittstelle, und alle Event -Hörer müssen diese Schnittstelle erben. Dies ist die Servlet -Spezifikation, und es gibt keine Erklärung.
1.2 EventObject
Ähnlich wie EventListener ist EventObject eine Klasse für Ereignisebene, und alle spezifischen Ereignisklassen müssen EventObject erben.
public class EventObject implementiert java.io.serializable {Protected Transient Object Source; public eventObject (Objektquelle) {if (source == null) neue illegalArgumentException ("null source"); "]";}}Diese Klasse ist sehr einfach, ihre Essenz ist nur eine Sache: Quelle. Über den Klassennamen EventObject und die Quelle des Eigenschaftsnamens können Sie sehen, dass diese Klasse eine Sache macht und das "Ereignisquellobjekt" hält.
1.3 servletContexevent
public class ServletContextEvent extends java.util.EventObject { public ServletContextEvent(ServletContext source) {super(source);}public ServletContext getServletContext () { return (ServletContext) super.getSource();}}Das Ereignisklassen von Servlet -Kontext ist eine einfache Vererbung von EventObject. Die ServletContext -Instanz wird als Ereignisquelle im Konstruktor bereitgestellt. Da die Ereignisquelle ein Servlet -Kontext ist, wird ein GetServletContext bereitgestellt, um die ServletContext -Instanz zu erhalten.
Wenn wir in Zukunft andere Ereignisklassen erklären, sind sie alle die gleiche Form. Jede Ereignisklasse liefert die entsprechende Baumethode, übergibt das entsprechende Ereignisquellenobjekt und bietet zusätzliche Methoden, um die Ereignisquelle zu erhalten. Daher ist EventObject die Basisklasse der Ereignisquelle. Die Essenz aller Ereignis -Unterklassen macht eine Sache, die das spezifische Ereignisquellobjekt bestimmt.
Der Ort, an dem wir den Vorfall später erklären werden.
1.4 ServletContextListener
öffentliche Schnittstelle ServletContextListener erweitert EventListener (public void contextInitialized (servletContexevent SCE); public void contextdestroyed (ServletContexevent SCE);}
Die Servlet Context Listener -Schnittstelle entspricht zwei Ereignissen: dem Servlet Context Initialisierungsereignis und dem Servlet -Kontextschließereignis.
Wenn die Webanwendung initialisiert wird, konstruiert der Servlet -Container die ServletContexteven -Instanz und ruft die kontextinitialisierende Methode zurück.
Wenn der Servlet -Kontext kurz vor dem Schließen des Servers geschlossen wird, konstruiert der Servlet -Container die ServletContexteven -Instanz und ruft die kontextdestryed -Methode zurück. Es ist hier zu beachten, dass die Ausführung der kontextdestryed -Methode durchgeführt wird, nachdem alle Servlets und Filter die Zerstörungsmethode abgeschlossen haben.
Wenn wir also etwas tun möchten, wenn die Anwendung startet oder schließt, werden wir unseren eigenen Hörer schreiben, um die Schnittstelle zu implementieren.
Alle Event -Hörer sind auch das gleiche Modell. Die entsprechende Ereignisrückruf -Schnittstelle wird gemäß der Servlet -Spezifikation definiert. Der Methodeneintragsparameter ist die entsprechende Ereignisquelleninstanz. Wir werden also auch an dem Ort vorbeigehen, an dem wir den Monitor später erklären werden.
1.5 ServletContextAttributeEvent
public class servletContextAttributeEvent erweitert servletContexevent {private String name; privater Objektwert; public ServletContextAtTributeEvent (ServletContext Quelle, String -Name, Objektwert) {Super (Quelle); this.name = name; }}ServletContextAttributeeEvent stellt ein Ereignis im Zusammenhang mit dem Servlet -Kontextattribut dar. Im Allgemeinen wird das Ereignis ausgelöst, wenn sich das Attribut ändert. Diese Klasse erbt servletContexteven, und die Ereignisquelle ist auch eine ServletContext -Instanz. Zusätzliche Methoden zum Erhalten von Attributnamen und Attributwerten werden bereitgestellt.
1.6 ServletContextAttributelistener
public interface ServletContextAttributelistener erweitert EventListener (public void Attributededed (servletContextAttributeEvent scab); public void AttruterMoved (ServletContextTributeEvent Scab); öffentlicher Void AttributePlated (servletContextAtTributeEvent);};
Wenn die obigen Attribute des Servlets hinzugefügt, gelöscht oder geändert werden, konstruiert der Servlet -Container das Ereignisobjekt des ServletContextTributeEvent und ruft die Methoden der Attribute -Leadded-, Attributer- und AttribututePlaced -Methoden zurück.
Was Sie hier beachten müssen, ist die Attributereplaced -Methode, die zurückgerufen wird, wenn der Wert des Attributs ersetzt wird. Wenn Sie zu diesem Zeitpunkt ServletContextAttributeEvent.GetValue () -Methode aufrufen, wird die Rückgabe den vorherigen Attributwert ersetzen.
2 HTTP Session Related Hörschnittstelle
2.1 httpSessionEvent
öffentliche Klasse httpSessionEvent erweitert java.util.eventObject {public httpSessionEvent (httpSession Quelle) {Super (Quelle);} public httpSession getSession () {return (httpSession) Super.getSource ();}}}}}}}}}}}HTTP-Session-bezogenes Ereignis, das bei Änderungen der Sitzung ausgelöst wird. Die Ereignisquelle ist eine HTTPSession -Instanz und liefert zusätzliche Methoden zur Erfassungsvermittlung von HTTPSession.
2.2 httpSessionListener
öffentliche Schnittstelle HttpSessionListener erweitert EventListener {public void sessioncreated (httpSessionEvent SE); public void sessionDestroyed (httpSessionEvent SE);}Wenn die Sitzung erstellt und zerstört wird, konstruiert der Servlet -Container das Ereignisobjekt httpSessionEvent und ruft die Sessioncreated- und SessionDestroyed -Methoden zurück.
2.3 httpSessionActivationListener
public interface httpSessionActivationListener erweitert EventListener {public void sessionsWillsivate (httpSessionEvent SE); public void sessionDidactivate (httpSessionEvent SE);}Wenn die Sitzung passiviert wird oder aktiviert wurde, konstruiert der Servlet -Container das Ereignisobjekt von HttpSessionEvent, Callback Session -Willivate und SessionDidactivate -Methoden.
Passivierung und Aktivierung werden hier erläutert: Die Passivierung bezieht sich auf den Speicher des Servers ist unzureichend oder die Aktivitätszeitüberschreitung der Sitzung ist eingetroffen, und die kürzlich inaktive Sitzung ist auf Festplatte serialisiert. Aktivierung bedeutet, dass erneut auf eine passive Sitzung zugegriffen wird, wodurch die Sitzung von der Festplatte zum Speicher wird.
Hier ist zu sehen, dass die Sitzung zuerst serialisiert und deserialisiert werden muss, um zu passivieren und zu aktivieren. Gleichzeitig versuchen wir während des Programmiervorgangs, einfache Objekte wie String und Ganzzahl so weit wie möglich zu verwenden und keine Sammlungen wie List und Karte zu verwenden.
2.4 httpSessionBindingEvent
public class HttpSessionBindingEvent extends HttpSessionEvent {private String name;private Object value;public HttpSessionBindingEvent(HttpSession session, String name) {super(session);this.name = name;}public HttpSessionBindingEvent(HttpSession session, String name, Object value) {super(session);this.name = name;this.value = value;} public httpSession getSession () {return Super.getSession ();} public String getName () {return name;} public Object getValue () {return this.Value; }}Das Ereignis im Zusammenhang mit dem HTTP -Sitzungsattribut wird ausgelöst, wenn sich das Sitzungsattribut ändert. Die Ereignisquelle ist eine HTTPSession -Instanz und bietet zusätzliche Methoden, um HTTPSession, Attributname und Attributwert zu erhalten.
2,5 httpSessionattributelistener
öffentliche Schnittstelle httpSessionAttributelistener erweitert EventListener {public void Attributeded (httpSessionBindingEvent SE); public void Attruteremoved (httpSessionBindingEvent SE); public void AttributerePlate (httpSessionBindingEvent SE);};};};};};};}Wenn das Sitzungsattribut hinzugefügt, gelöscht oder geändert wird, konstruiert das Servlet -Container das Ereignisobjekt von httpSessionBindingEvent und ruft die Methoden der Attribute -Leadded-, Attributer- und AttribututePlaced zurück.
Was Sie hier beachten müssen, ist die Attributereplaced -Methode, die zurückgerufen wird, wenn der Wert des Attributs ersetzt wird. Wenn Sie zu diesem Zeitpunkt ServletContextAttributeEvent.GetValue () -Methode aufrufen, wird die Rückgabe den vorherigen Attributwert ersetzen.
Wenn die Ungültigheitsmethode der Sitzung aufgerufen wird oder die Sitzung fehlschlägt, wird auch die Attribututer -Methode zurückgerufen.
2.6 httpSessionBindingListener
Öffentliche Schnittstelle HttpSessionBindingListener erweitert EventListener {public void ValueBound (httpSessionBindingEvent Ereignis); public void valueUnbound (httpSessionBindingEvent Ereignis);}Dieser Hörer hört auch nach Änderungen im Attribut der Sitzung. Wenn das Sitzungsattribut hinzugefügt und gelöscht wird, dh wenn der Attributwert gebunden ist und der Attributwert nicht ist, konstruiert der Servlet -Container das Ereignisobjekt von httpSessionBindingingEvent und ruft die Valuebound- und ValueUnbound -Methoden zurück.
Es sieht nicht anders aus als httpSessionattributelistener, aber es ist nicht der Fall. Ein wesentlicher Unterschied zwischen den beiden ist der Zustand des Ereignisauslösens.
Wenn sich die Sitzungseigenschaft ändert, benachrichtigt der Servlet -Container den httpSessionAttributelistener. Für httpSessionBindingListener wird der Servlet -Container nur dann benachrichtigt, wenn der Wert der gebundenen oder ungehörten Eigenschaften eine Instanz des Hörers ist. Zum Beispiel:
public class TestListener implementiert httpSessionBindingListener {@Overridepublic void ValueBound (httpSessionBindingEvent Ereignis) {System.out.println ("httpSessionBindingListener.ValuEbound"); {System.out.println ("httpSessionBindingListener.ValueUnbound");}}Wir passen den Listener testistener an, um httpSessionBindingListener zu implementieren. Setzen wir das folgende Sitzungsattribut im Code fest:
HttpSession Session = Request.GetSession (); testListener testRistener = new TestListener (); session.setAttribute ("Listener", testListener); Session.RemoveAttribute ("Listener");Hier ist der Attributwert der Sitzung unsere Instanz des Listener TestListener. Wenn dieser Code ausgeführt wird, benachrichtigt der Servlet -Container den Test -Listener und ruft die Valuebound- und ValueUnbound -Methoden zurück.
Es ist hier zu beachten, dass die ValueUnbound -Methode auch zurückgerufen wird.
3 Servlet Request-bezogene Hörschnittstelle
3.1 ServletRequestEvent
public class servletRequestEvent erweitert java.util.eventObject (private servletRequest request; public servletRequestEvent (servletContext sc, servletRequest request {super (sc); (ServletContext) Super.getSource ();}}Das Ereignis im Zusammenhang mit der Servlet -Anfrage wird ausgelöst, wenn sich die Anfrage ändert. Die Ereignisquelle ist eine ServletContext -Instanz und bietet zusätzliche Abholung von ServletContext- und ServletRequest -Methoden.
3.2 ServletRequestListener
öffentliche Schnittstelle ServletRequestListener erweitert EventListener (public void RequestDestroyed (ServletRequestevent Sre); public void RequestInitialized (ServletRequestevent Sre);}
Wenn die Anfrage initialisiert oder zerstört wird, wird der Client anfordert, die Webanwendung einzugeben (geben Sie das Servlet oder den ersten Filter ein) oder die Webanwendung gibt eine Antwort an den Client zurück (beenden Sie das Servlet oder den ersten Filter). Der Servlet Container konstruiert die ServletRequestEvent -Instanz und ruft die Anforderungs- und RequestDestroyed -Methoden zurück.
3.3 ServletRequestattributeEvent
public class servletRequestattributeEvent erweitert servletRequestEvent {privater String -Name; privater Objektwert; public servletRequestAttributeEvent (ServletContext sc, ServletRequest -Anfrage, String -Name, Objektwert) {Super (sc, request); this.name = name; {return this.Value; }}Das Ereignis im Zusammenhang mit dem Servlet fordert das Attribut an, das bei ändert, wenn sich das Anforderungattribut ändert. Die Ereignisquelle ist eine ServletContext -Instanz und bietet zusätzliche Methoden, um Attributnamen und Attributwerte zu erhalten.
3.4 ServletRequestattributelistener
Public Interface ServletRequestAttributelistener erweitert EventListener (public void Attributeded (servletRequestattributeEvent srae); öffentliche void AttruterMoved (servletrequestattributeEvent srae); öffentlicher Void -Attribute (servletrequestatTributeEvent Srae);
Wenn die angeforderten Attribute hinzugefügt, gelöscht oder geändert werden, konstruiert der Servlet -Container das Ereignisobjekt des ServletRequestAttributeEvent und rufen Sie die Methoden für Attribute -Leadded, Attributer und Attribututeeplaced zurück.
Was Sie hier beachten müssen, ist die Attributereplaced -Methode, die zurückgerufen wird, wenn der Wert des Attributs ersetzt wird. Wenn Sie zu diesem Zeitpunkt ServletRequestAttributeEvent.GetValue () -Methode aufrufen, wird die Rückgabe den vorherigen Attributwert ersetzen.
4. Zusammenfassung
Zu diesem Zeitpunkt spricht Hörer. Wir können feststellen, dass Hörer, Servlet und Filter eines gemeinsam haben, beide sind von Containern geplant. Wir müssen nur unseren eigenen Hörer schreiben, um die Listener -Schnittstelle zu implementieren, die uns wichtig ist, und uns registrieren. Der Rest der Aufgabe ist es, Business Logic in unseren eigenen Zuhörer zu schreiben.
Der in diesem Blog -Beitrag vorgestellte Hörer wird in der SERBLOT 3.0 -Spezifikation formuliert. 3.1 hat einige Ereignishörer -Schnittstellen hinzugefügt, und die Prinzipien sind ähnlich, die Leser können sie selbst verstehen.