ServletContextListener is een van de vele Servlet Listeners die we hebben. Dit is het vijfde artikel in de serie van Java Web Applicatie, je zou ook de eerdere vier artikelen kunnen bekijken.
Servlet Listener
In deze tutorial zullen we kijken naar servlet listener, voordelen van servlet listeners, enkele veelvoorkomende taken die we met listeners kunnen uitvoeren, servlet API listener interfaces en Event objects. Aan het einde zullen we een eenvoudig webproject maken om een voorbeeld te laten zien van een veelgebruikte Listener-implementatie voor ServletContext, Session en ServletRequest.
We weten dat we met ServletContext
een attribuut met toepassingsscope kunnen maken dat door alle andere servlets kan worden benaderd, maar we kunnen ServletContext-initiële parameters alleen als String initialiseren in het inzetbeschrijvingsbestand (web.xml). Wat als onze applicatie database-georiënteerd is en we een attribuut in ServletContext willen instellen voor databaseverbinding. Als uw applicatie één invoerpunt heeft (gebruikersaanmelding), kunt u dit doen bij het eerste servletverzoek. Maar als we meerdere invoerpunten hebben, zal dit overal doen leiden tot veel codeherhaling. Ook als de database niet beschikbaar is of niet correct is geconfigureerd, weten we dat pas wanneer het eerste clientverzoek bij de server binnenkomt. Om met deze scenario’s om te gaan, biedt de Servlet API Listener-interfaces die we kunnen implementeren en configureren om naar een gebeurtenis te luisteren en bepaalde bewerkingen uit te voeren. Event is het optreden van iets, in de wereld van webapplicaties kan een gebeurtenis de initialisatie van de applicatie zijn, het vernietigen van een applicatie, een verzoek van de client, het creëren/vernietigen van een sessie, attribuutwijziging in een sessie, enzovoort. Servlet API biedt verschillende soorten Listener-interfaces die we kunnen implementeren en configureren in web.xml om iets te verwerken wanneer een bepaalde gebeurtenis zich voordoet. Bijvoorbeeld, in het bovenstaande scenario kunnen we een Listener maken voor het starten van de applicatie om context-initiële parameters te lezen, een databaseverbinding te maken en deze in te stellen als een contextattribuut voor gebruik door andere bronnen.
8. ### Servlet Listener Interfaces en Event Objects
De Servlet API biedt verschillende soorten luisteraars voor verschillende typen gebeurtenissen. Luisteraarinterfaces verklaren methoden om te werken met een groep vergelijkbare gebeurtenissen, bijvoorbeeld hebben we ServletContext Listener om te luisteren naar het opstarten en afsluiten van de context. Elke methode in de luisteraarinterface neemt een Event object als invoer. Het Event object fungeert als een wrapper om specifieke objecten aan de luisteraars te verstrekken. De Servlet API biedt de volgende event objecten.
- javax.servlet.AsyncEvent – Gebeurtenis die wordt afgevuurd wanneer de asynchrone bewerking geïnitieerd op een ServletRequest (via een oproep naar ServletRequest#startAsync of ServletRequest#startAsync(ServletRequest, ServletResponse)) is voltooid, verlopen is of een fout heeft opgeleverd.
- javax.servlet.http.HttpSessionBindingEvent – Gebeurtenissen van dit type worden verzonden naar een object dat HttpSessionBindingListener implementeert wanneer het aan een sessie wordt gebonden of daarvan wordt losgemaakt, of naar een HttpSessionAttributeListener die is geconfigureerd in de web.xml wanneer een attribuut wordt gebonden, losgemaakt of vervangen in een sessie. De sessie bindt het object door een oproep naar HttpSession.setAttribute en maakt het object los door een oproep naar HttpSession.removeAttribute. We kunnen dit evenement gebruiken voor opruimactiviteiten wanneer het object uit de sessie wordt verwijderd.
- javax.servlet.http.HttpSessionEvent – Dit is de klasse die gebeurtenismeldingen vertegenwoordigt voor wijzigingen in sessies binnen een webtoepassing.
- javax.servlet.ServletContextAttributeEvent – Gebeurtenisklasse voor meldingen over wijzigingen in de attributen van de ServletContext van een webtoepassing.
- javax.servlet.ServletContextEvent – Dit is de gebeurtenisklasse voor meldingen over wijzigingen in de servletcontext van een webtoepassing.
- javax.servlet.ServletRequestEvent – Gebeurtenissen van dit type geven levenscyclusgebeurtenissen aan voor een ServletRequest. De bron van de gebeurtenis is de ServletContext van deze webtoepassing.
- javax.servlet.ServletRequestAttributeEvent – Dit is de gebeurtenisklasse voor meldingen van wijzigingen aan de attributen van het servletverzoek in een toepassing.
De Servlet API biedt de volgende luisteraarinterfaces.
-
javax.servlet.AsyncListener – Luisteraar die wordt geïnformeerd in het geval dat een asynchrone bewerking die is gestart op een ServletRequest waarop de luisteraar was toegevoegd, is voltooid, verlopen is of heeft geleid tot een fout.
-
javax.servlet.ServletContextListener – Interface voor het ontvangen van meldingsgebeurtenissen over ServletContext-levenscycluswijzigingen.
-
javax.servlet.ServletContextAttributeListener – Interface voor het ontvangen van meldingsgebeurtenissen over wijzigingen in ServletContext-attributen.
-
javax.servlet.ServletRequestListener – Interface om meldingsgebeurtenissen te ontvangen over binnenkomende en uitgaande verzoeken van een webtoepassing.
-
javax.servlet.ServletRequestAttributeListener – Interface om meldingsgebeurtenissen te ontvangen over wijzigingen van ServletRequest-attributen.
-
javax.servlet.http.HttpSessionListener – Interface om meldingsgebeurtenissen te ontvangen over wijzigingen in de levenscyclus van HttpSession.
-
javax.servlet.http.HttpSessionBindingListener – Zorgt ervoor dat een object wordt gemeld wanneer het aan een sessie wordt gebonden of losgekoppeld.
-
javax.servlet.http.HttpSessionAttributeListener – Interface om meldingsgebeurtenissen te ontvangen over wijzigingen van HttpSession-attributen.
-
javax.servlet.http.HttpSessionActivationListener – Objecten die aan een sessie zijn gebonden, kunnen luisteren naar containergebeurtenissen die hen informeren dat sessies zullen worden gepassiveerd en dat de sessie zal worden geactiveerd. Een container die sessies migreert tussen VM’s of sessies persisteert, is verplicht om alle aan sessies gebonden attributen te informeren die HttpSessionActivationListener implementeren.
-
Servlet Listener Configuratie
We kunnen de @WebListener annotatie gebruiken om een klasse als luisteraar te declareren, maar de klasse moet een of meer van de luisteraarinterfaces implementeren. We kunnen een luisteraar definiëren in web.xml als:
<listener>
<listener-class>
com.journaldev.listener.AppContextListener
</listener-class>
</listener>
Laten we een eenvoudige webtoepassing maken om de servlet luisteraar in actie te zien. We zullen een dynamisch webproject aanmaken in Eclipse ServletListenerVoorbeeld waarvan de projectstructuur eruit zal zien zoals hieronder afgebeeld. web.xml: In het inzetbeschrijvingsbestand zal ik enkele context-init-parameters en luisteraarconfiguraties definiëren.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ServletListenerExample</display-name>
<context-param>
<param-name>DBUSER</param-name>
<param-value>pankaj</param-value>
</context-param>
<context-param>
<param-name>DBPWD</param-name>
<param-value>password</param-value>
</context-param>
<context-param>
<param-name>DBURL</param-name>
<param-value>jdbc:mysql://localhost/mysql_db</param-value>
</context-param>
<listener>
<listener-class>com.journaldev.listener.AppContextListener</listener-class>
</listener>
<listener>
<listener-class>com.journaldev.listener.AppContextAttributeListener</listener-class>
</listener>
<listener>
<listener-class>com.journaldev.listener.MySessionListener</listener-class>
</listener>
<listener>
<listener-class>com.journaldev.listener.MyServletRequestListener</listener-class>
</listener>
</web-app>
DBConnectionManager: Dit is de klasse voor databaseconnectiviteit. Voor eenvoud geef ik geen code voor daadwerkelijke databaseverbinding. We zullen dit object instellen als attribuut van de servletcontext.
package com.journaldev.db;
import java.sql.Connection;
public class DBConnectionManager {
private String dbURL;
private String user;
private String password;
private Connection con;
public DBConnectionManager(String url, String u, String p){
this.dbURL=url;
this.user=u;
this.password=p;
//maak nu een db-verbinding
}
public Connection getConnection(){
return this.con;
}
public void closeConnection(){
//sluit hier de DB-verbinding
}
}
MyServlet: Een eenvoudige servletklasse waarin ik zal werken met sessie, attributen, etc.
package com.journaldev.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext ctx = request.getServletContext();
ctx.setAttribute("User", "Pankaj");
String user = (String) ctx.getAttribute("User");
ctx.removeAttribute("User");
HttpSession session = request.getSession();
session.invalidate();
PrintWriter out = response.getWriter();
out.write("Hi "+user);
}
}
Nu zullen we luisteraar klassen implementeren. Ik geef voorbeelden van luisteraarklassen voor veelgebruikte luisteraars – ServletContextListener, ServletContextAttributeListener, ServletRequestListener en HttpSessionListener.27. ## ServletContextListener
We zullen servletcontext init parameters lezen om het DBConnectionManager object te maken en het als attribuut in te stellen op het ServletContext object.
package com.journaldev.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import com.journaldev.db.DBConnectionManager;
@WebListener
public class AppContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext ctx = servletContextEvent.getServletContext();
String url = ctx.getInitParameter("DBURL");
String u = ctx.getInitParameter("DBUSER");
String p = ctx.getInitParameter("DBPWD");
//maak databaseverbinding vanuit init parameters en stel het in op de context
DBConnectionManager dbManager = new DBConnectionManager(url, u, p);
ctx.setAttribute("DBManager", dbManager);
System.out.println("Database connection initialized for Application.");
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext ctx = servletContextEvent.getServletContext();
DBConnectionManager dbManager = (DBConnectionManager) ctx.getAttribute("DBManager");
dbManager.closeConnection();
System.out.println("Database connection closed for Application.");
}
}
A simple implementation to log the event when attribute is added, removed or replaced in servlet context.
package com.journaldev.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class AppContextAttributeListener implements ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext attribute added::{"+servletContextAttributeEvent.getName()+","+servletContextAttributeEvent.getValue()+"}");
}
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext attribute replaced::{"+servletContextAttributeEvent.getName()+","+servletContextAttributeEvent.getValue()+"}");
}
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext attribute removed::{"+servletContextAttributeEvent.getName()+","+servletContextAttributeEvent.getValue()+"}");
}
}
A simple implementation to log the event when session is created or destroyed.
package com.journaldev.listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MySessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent sessionEvent) {
System.out.println("Session Created:: ID="+sessionEvent.getSession().getId());
}
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
System.out.println("Session Destroyed:: ID="+sessionEvent.getSession().getId());
}
}
A simple implementation of ServletRequestListener interface to log the ServletRequest IP address when request is initialized and destroyed.
package com.journaldev.listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
ServletRequest servletRequest = servletRequestEvent.getServletRequest();
System.out.println("ServletRequest destroyed. Remote IP="+servletRequest.getRemoteAddr());
}
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
ServletRequest servletRequest = servletRequestEvent.getServletRequest();
System.out.println("ServletRequest initialized. Remote IP="+servletRequest.getRemoteAddr());
}
}
Wanneer we onze applicatie implementeren en MyServlet in de browser openen met de URL https://localhost:8080/ServletListenerExample/MyServlet
, zullen we de volgende logboeken zien in het serverlogbestand.
ServletContext attribute added::{DBManager,com.journaldev.db.DBConnectionManager@4def3d1b}
Database connection initialized for Application.
ServletContext attribute added::{org.apache.jasper.compiler.TldLocationsCache,org.apache.jasper.compiler.TldLocationsCache@1594df96}
ServletRequest initialized. Remote IP=0:0:0:0:0:0:0:1%0
ServletContext attribute added::{User,Pankaj}
ServletContext attribute removed::{User,Pankaj}
Session Created:: ID=8805E7AE4CCCF98AFD60142A6B300CD6
Session Destroyed:: ID=8805E7AE4CCCF98AFD60142A6B300CD6
ServletRequest destroyed. Remote IP=0:0:0:0:0:0:0:1%0
ServletRequest initialized. Remote IP=0:0:0:0:0:0:0:1%0
ServletContext attribute added::{User,Pankaj}
ServletContext attribute removed::{User,Pankaj}
Session Created:: ID=88A7A1388AB96F611840886012A4475F
Session Destroyed:: ID=88A7A1388AB96F611840886012A4475F
ServletRequest destroyed. Remote IP=0:0:0:0:0:0:0:1%0
Database connection closed for Application.
Let op de volgorde van de logboeken en het is in de volgorde van uitvoering. Het laatste logboek verschijnt wanneer u de applicatie afsluit of de container afsluit.
Dat is alles voor de luisteraar in servlet, we zullen nu kijken naar cookies en enkele veelvoorkomende voorbeelden van servlets. U kunt het project downloaden vanaf onderstaande link en ermee experimenteren om meer te leren.
Download Servlet Listener Voorbeeldproject
Bekijk het volgende artikel in de serie over Cookies in Servlet.
Source:
https://www.digitalocean.com/community/tutorials/servletcontextlistener-servlet-listener-example