1. Concepts de base
L'auditeur de Javaweb est implémenté via le modèle de conception de l'observateur. En ce qui concerne le mode observateur, je ne donnerai pas trop d'introduction ici, donc je vais parler à peu près de ce que cela signifie.
Le mode observateur est également appelé mode d'abonnement publié ou mode d'écoute. Il y a deux caractères dans ce mode: l'observateur et l'observateur (généralement également appelé le sujet). L'observateur enregistre un événement d'intérêt pour le sujet. Lorsque cet événement se produit, le sujet informera l'observateur via une interface de rappel.
Permettez-moi de vous donner un exemple dans la vie: abonnez-vous aux journaux. Toute famille ou individu peut s'abonner aux journaux avec le journal. Ici, le journal est le "thème" et la famille est "l'observateur". Par exemple, si une famille doit s'abonner au journal demain matin, il s'agit d'un "événement". Le lendemain matin, le journal a été produit, et c'était "l'événement". Lorsque l'incident se produit, le journal envoie le journal à la boîte aux lettres domestique, qui est "l'interface de rappel".
Pour les auditeurs de Javaweb, la spécification du servlet définit certaines colonnes de classes d'interface d'écoute, exposant des événements à l'application via des classes d'interface. Si une demande souhaite écouter les événements d'intérêt, il n'a pas à enregistrer directement l'événement correspondant. Au lieu de cela, il écrit son propre auditeur pour implémenter la classe d'interface correspondante et enregistre son propre auditeur au conteneur servlet. Lorsqu'un événement qui se soucie du programme se soucie, le conteneur servlet informera l'auditeur et rappellera les méthodes de l'auditeur. L'auditeur personnalisé ici est l'observateur, et le conteneur servlet est le thème.
2. Analyse des échantillons
Comme mentionné ci-dessus, le conteneur servlet expose des événements à l'application via la classe d'interface de l'écoute. Nous ne sommes donc pas tant sur le fait d'enregistrer des événements, mais plutôt d'enregistrer les auditeurs. Les étapes de programmation correspondantes sont: 1. Écrivez votre propre écouteur et implémentez une interface d'écoute spécifique. 2. Enregistrez votre auditeur dans web.xml. Voici un exemple de l'interface d'écoute la plus simple ServletContextListener:
1.TestListener.java
classe publique TestListener implémente ServletContextListener {public TestListener () {} public void contextinitialialized (servletContextevent scce) {System.out.println ("ServletContextListener.Contextinitialized");} public void contextDestRoyed (servletContexTevent SCCE); {System.out.println ("ServletContextListener.ContextDestRoyed");}}2.Web.xml
<disener> <écouteur-classe> com.nantang.Listener.testListener </ écouteur-classe> </diner>
Lorsque le conteneur démarre, "ServletContextListener.ContextInitialized" sera sorti dans le journal, et lorsque le conteneur est fermé, "ServletContextListener.ContextDestRoyed" sera sorti. Une explication détaillée sera analysée plus loin plus tard.
Il convient de noter ici que si vous démontrez l'exemple ci-dessus dans l'IDE (Eclipse, Sts, etc.), lors du démarrage du serveur, vous pouvez voir "ServletContextListener.contextInitialialialized" dans la console, et lorsque vous fermez le serveur, vous ne pouvez pas voir "ServletContextListener.ContextDestRoyed". Ce n'est pas que la méthode ContextDestroyed n'est pas exécutée, mais que l'IDE ne l'implémente pas parfaitement. Pour vérifier que ContextDestRoyed est en effet appelé, vous pouvez écrire un morceau de code dans ContextDestRoyed pour sortir le contenu du fichier au lieu de le sortir sur la console.
3. Analyse du code source
Analyons maintenant les événements que la spécification du servlet définit pour nous. Plus précisément, que les interfaces d'écoute sont définies. Les introductions suivantes sont basées sur la spécification Servlet 3.0.
Servlet3.0 nous fournit 8 interfaces auditeurs, qui peuvent être divisées en trois catégories en fonction de leur portée:
1.Servlet Interfaces d'écoute liée au contexte, y compris: servletContextListener et servletContextAttutTributleListener.
2. Interfaces d'écoute liées à la session HTTP, y compris: httpSessionListener, httpSessionActivationListener, httpSessionAttributeListener et httSessessionBindingListener.
3. L'interface d'écoute était liée à la demande de servlet, y compris: servletRequestListener et servletRequestAttutLeListener.
En fait, de la dénomination de l'interface, vous devriez pouvoir deviner ses fonctions de base. Expliquons-le par la catégorie ci-dessous.
1. interface d'écoute liée au contexte de la merde
Lors de l'introduction de servlets auparavant, nous avons expliqué qu'une application Web correspond à un contexte de servlet. Par conséquent, la gamme Life of Events écoutée par ServletContextListener et ServletContextAtTributEListener exécute l'ensemble de l'application Web. Vous trouverez ci-dessous la relation de hiérarchie du diagramme de classe entre ces deux interfaces.
1.1 EventListener
EventListener est une interface de balise et tous les écouteurs d'événements doivent hériter de cette interface. Il s'agit de la spécification du servlet, et il n'y a aucune explication.
1.2 EventObject
Semblable à EventListener, EventObject est une classe au niveau de l'événement, et toutes les classes d'événements spécifiques doivent hériter de EventObject.
classe publique EventObject implémente Java.io.Serializable {Source d'objet transitoire protégé; public EventObject (Source d'objet) {if (source == null) Throw New illégalArgumentException ("Null Source"); this.source = Source;} public objet getSource () {return Source;} public String toSTring () {return GetClass (). "]";}}Cette classe est très simple, son essence n'est qu'une chose: la source. Grâce au nom de classe EventObject et à la source de nom de propriété, vous pouvez voir que cette classe fait une chose, tenant le "Objet Source d'événement".
1.3 ServletContextevent
classe publique ServletContexTevent étend java.util.eventObject {public servLetContexTevent (servletContext Source) {super (source);} public servletContext getServletContext () {return (servletContext) super.getsource ();}}Événement de contexte de servlet, cette classe d'événements est un simple héritage de EventObject. L'instance ServletContext est fournie comme source d'événement dans le constructeur. Étant donné que la source d'événement est un contexte de servlet, un GetservletContext est fourni pour obtenir l'instance ServletContext.
Lorsque nous expliquons d'autres classes d'événements à l'avenir, ils sont tous de la même moisissure. Chaque classe d'événements fournit la méthode de construction correspondante, passe dans l'objet de source d'événement correspondante et fournit des méthodes supplémentaires pour obtenir la source d'événement. Par conséquent, EventObject est la classe de base de la source d'événements. L'essence de toutes les sous-classes d'événements fait une chose, déterminez l'objet de source d'événement spécifique.
Ainsi, l'endroit où nous expliquerons l'incident passe plus tard.
1.4 ServletContextListener
Interface publique ServletContextListener étend EventListener {public void contextinitialialized (servletContextevent sce); public void contextDestRoyed (servletContextevent sce);}L'interface de l'auditeur de contextes de servlet correspond à deux événements: l'événement d'initialisation du contexte du servlet et l'événement de clôture de contexte de servlet.
Lorsque l'application Web est initialisée, le conteneur servlet construira l'instance ServletContexteven et rappellera la méthode de contextinialiser.
Lorsque le contexte du servlet est sur le point d'être fermé, généralement avant de fermer le serveur, le conteneur servlet construira l'instance ServletContexTeven et rappellera la méthode ContextDestroyed. Il convient de noter ici que l'exécution de la méthode ContextDestroyed sera effectuée après que tous les servlets et filtres ont terminé la méthode de détruire.
Donc, si nous voulons faire quelque chose lorsque l'application démarre ou se ferme, nous écrivons notre propre auditeur pour implémenter l'interface.
Tous les auditeurs d'événements sont également le même modèle. La méthode d'interface de rappel d'événements correspondante est définie en fonction de la spécification du servlet. Le paramètre d'entrée de méthode est l'instance de source d'événement correspondante. Nous passerons donc également par l'endroit où nous expliquerons le moniteur plus tard.
1.5 ServletContextAttributeevent
classe publique ServletContextAttributeEvent étend ServletContexTevent {Nom de chaîne privée; valeur d'objet privé; public servletContextAttributeEvent (ServletContext Source, String Name, Value) {Super (source); this.name = name; this.value = valeur;} public String getName () {return this.Name;} public Object GetValue () {return this.Value; }}ServletContextAtTributeevent représente un événement lié à l'attribut de contexte de servlet. Généralement, l'événement sera déclenché lorsque l'attribut change. Cette classe hérite de ServletContexTeven, et la source d'événement est également une instance ServletContext. Des méthodes supplémentaires pour obtenir des noms d'attribut et des valeurs d'attribut sont fournies.
1.6 ServletContextAttributeListener
Interface publique ServletContextAttributeListener étend EventListener {public void AttributeAdded (servletContextAttributeevent Scab); public void attributeReMoved (ServletContextAttraTutEevent Scab); Public Void AttributelAlplaced (ServletContextAtTrutEevent Scab);}Lorsque les attributs ci-dessus du servlet sont ajoutés, supprimés ou modifiés, le conteneur de servlet construit l'objet d'événement ServletContextAttributeevent et rappelle respectivement l'attribution, attribuéemioved et attribution.
Ce que vous devez noter ici est la méthode attribuée. À l'heure actuelle, si vous appelez servletContextAttributeevent.getValue (), le retour est de remplacer la valeur d'attribut précédente.
2 interface d'écoute liée à la session HTTP
2.1 HttpSessionEvent
La classe publique httpSessionEvent étend java.util.eventObject {public httScessionEvent (httpSession Source) {super (source);} public httpSession getSession () {return (httpSession) super.getsource ();}}Événement lié à la session HTTP, qui sera déclenché lorsque la session changera. La source d'événement est une instance HTTPSESSION et fournit des méthodes d'acquisition HTTPSES de HTTPSE supplémentaires.
2.2 httpSessionListener
Interface publique httSSessionListener étend EventListener {public void SessionCreed (httpSessionEvent SE); public void SessionDestRoyed (httpSessionEvent SE);}Lorsque la session est créée et détruite, le conteneur servlet construit l'objet d'événement HTTPSessionEvent et rappelle les méthodes de session créatisées et de session.
2.3 httpSessionActivationListener
Interface publique httpSessionActivationListener étend EventListener {public void sessionwillpassivate (httpSessionEvent se); public void SessionDidActivate (httpSessionEvent se);}Lorsque la session est sur le point d'être passivue ou a été activée, le conteneur servlet construit l'objet d'événement HTTPSessionEvent, Session de rappelwillPassivate et sessiondIdActivate.
La passivation et l'activation sont expliquées ici: la passivation se réfère à la mémoire du serveur est insuffisante ou le délai d'activité de la session est arrivé, et la session récemment inactive est sérialisée en disque. L'activation signifie qu'une session passive est à nouveau accessible, désérialisant la session du disque à la mémoire.
On peut voir ici que pour passiver et activer, la session doit être sérialisée et désérialisée en premier. Dans le même temps, pendant le processus de programmation, nous essayons d'utiliser autant que possible des objets simples tels que String et Integer, et essayons de ne pas utiliser de collections telles que la liste et la carte.
2.4 HttpSessionBindingEvent
classe publique httpSessionBindingEvent étend httpSessionEvent {name de chaîne privée; valeur d'objet privé; public httpSessionBindingEvent (httpSession session, nom de chaîne) {super (session); this.name = name;} public httpSessionBindingEvent (httpssion session, nom de chaîne, valeur d'objet) {super (session); this.name = this. valeur;} public httpSession getSession () {return super.getSession ();} public String getName () {Nom de retour;} Objet public getValue () {return this.value; }}L'événement lié à l'attribut de session HTTP est déclenché lorsque l'attribut de session change. La source d'événement est une instance HTTPSESSION et fournit des méthodes supplémentaires pour obtenir HTTPSession, le nom d'attribut et la valeur d'attribut.
2.5 HttpSessionAttributeleListener
Interface publique httpSessionAttributeleListEner étend EventListener {public void attributeAdded (httpSessionBindingEvent SE); public void attributereMoved (httpSessionBindingEvent se); public void attributereplace (httpSessionBindingEvent se);}Lorsque l'attribut de session est ajouté, supprimé ou modifié, le conteneur servlet construit l'objet d'événement HTTPSessionBindingEvent et rappelle respectivement les méthodes attribuées, attributionmioved et attribution.
Ce que vous devez noter ici est la méthode attribuée. À l'heure actuelle, si vous appelez servletContextAttributeevent.getValue (), le retour est de remplacer la valeur d'attribut précédente.
Lorsque la méthode invalidate de la session est appelée ou que la session échoue, la méthode AttributeRemioved sera également rappelée.
2.6 HttpSessionBindingListener
Interface publique httpSessionBindingListener étend EventListener {public void ValueBound (événement httpSessionBindingEvent); public void vaxBound (événement httpSessionBindingEvent);}Cet auditeur écoute également les modifications de l'attribut de la session. Lorsque l'attribut de session est ajouté et supprimé, c'est-à-dire que lorsque la valeur d'attribut est liée et que la valeur d'attribut est non insensée, le conteneur du servlet construit l'objet d'événement HTTPSessionBindingEvent et rappelle respectivement les méthodes de valeur et de valeur
Il ne semble pas différent de httpSessionAttributeleListener, mais ce n'est pas le cas. Une différence essentielle entre les deux est la condition de déclenchement des événements.
Lorsqu'il y a un changement dans la propriété de session, le conteneur servlet informera le HTTPSessionAttributeleListener. Mais pour httpSessionBindingListener, le conteneur servlet ne notivera que si la valeur de propriété liée ou non liée est une instance de l'auditeur. Par exemple:
classe publique TestListener implémente httpSessionBindingListener {@OverRidePublic void Valuebound (httpSessionBindingEvent Event) {System.out.println ("httpSessionBindingListener.ValueBound");} @ overdepublic VODAM VALATUND (HTTPSESSESSBINDINGEVENTEM {System.out.println ("httpSessionBindingListener.ValueUnbound");}}Nous personnalisons l'écouteur TestListener pour implémenter HTTPSessionBindingListener. Définissons l'attribut de session suivant dans le code:
HttpSession session = request.getSession (); testListener TestListener = new TestListener (); session.setAttribute ("écouteur", testListener); session.reMoveAtTribute ("écouteur");Ici, la valeur d'attribut de la session est notre instance TestListener auditeur. Ainsi, lorsque ce code est exécuté, le conteneur servlet informera le TestListener et rappellera les méthodes Valuebound et ValueUnbound.
Il convient de noter ici que lorsque la méthode invalidate de la session est appelée ou que la session échoue, la méthode ValueUnbound sera également rappelée.
3 Interface d'écoute liée à la demande du servlet
3.1 ServletRequestEvent
classe publique ServLetRequestEvent étend Java.util.EventObject {requête privée servletRequest; public servleTrequevant (servletContex super.getsource ();}}L'événement lié à la demande de servlet sera déclenché lorsque la demande modifie. La source d'événement est une instance ServletContext et fournit une récupération supplémentaire des méthodes ServletContext et ServletRequest.
3.2 ServletRequestListener
Interface publique ServLetRequestListener étend EventListener {public void requestDestRoyed (servletRequestEvent sre); public void requestInitialialialized (servletRequestEvent sre);}Lorsque la demande est initialisée ou détruite, le client demande à saisir l'application Web (entrez le servlet ou le premier filtre) ou l'application Web renvoie une réponse au client (quittez le servlet ou le premier filtre). Le conteneur servlet construit l'instance ServletRequestEvent et rappelle les méthodes de demande et de demande de destruction.
3.3 ServletRequestAttributeevent
classe publique ServLetRequestAttributeevent étend servletRequestEvent {nom de chaîne privée; valeur d'objet privé; Public ServLetRequestAttutEevent (ServletContext SC, servletRequest, nom de chaîne, valeur de l'objet) {super (sc, demande); this.name = name; this.value = valeur;} String public GetName () {return this.name;} public objet getValue GetVal cette valeur; }}L'événement lié au servlet demande l'attribut, qui sera déclenché lorsque l'attribut de demande modifie. La source d'événement est une instance ServletContext et fournit des méthodes supplémentaires pour obtenir des noms d'attribut et des valeurs d'attribut.
3.4 ServletRequestAttributeListener
Interface publique ServletRequestAttributeListener étend EventListener {public void attributeAdded (ServleTrequestAttutEevent srae); public void attributereMoved (servleTrequestAttributeevent srae);}Lorsque les attributs demandés sont ajoutés, supprimés ou modifiés, le conteneur servlet construit l'objet d'événement ServletRequestAttributeevent et rappelle respectivement l'attribution, attribuéemioved et attribution.
Ce que vous devez noter ici est la méthode attribuée. À l'heure actuelle, si vous appelez ServletRequestAttributeevent.getValue (), le retour est de remplacer la valeur d'attribut précédente.
4. Résumé
À ce stade, l'auditeur a fini de parler. Nous pouvons constater que l'auditeur, le servlet et le filtre ont une chose en commun, les deux sont planifiés par des conteneurs. Nous avons juste besoin d'écrire notre propre auditeur pour implémenter l'interface de l'écoute dont nous nous soucions et nous inscrivons. Le reste du travail est d'écrire une logique commerciale dans notre propre auditeur.
L'auditeur introduit dans cet article de blog est formulé par la spécification Servlet 3.0. 3.1 a ajouté quelques interfaces d'écoute d'événements, et les principes sont similaires, les lecteurs peuvent les comprendre par eux-mêmes.