Een Java-webtoepassing zonder web.xml

1. Overzicht

In deze zelfstudie maken we een Java-webtoepassing met Servlet 3.0+.

We zullen drie annotaties bekijken - @WebServlet, @WebFilter, en @WebListener - dat kan ons helpen onze web.xml bestanden.

2. De afhankelijkheid van Maven

Om deze nieuwe annotaties te kunnen gebruiken, moeten we de javax.servlet-api afhankelijkheid:

 javax.servlet javax.servlet-api 4.0.1 

3. XML-gebaseerde configuratie

Vóór Servlet 3.0 zouden we een Java-webtoepassing configureren in een web.xml het dossier:

  com.baeldung.servlets3.web.listeners.RequestListener hoofdlettersServlet com.baeldung.servlets3.web.servlets.HoofdlettersServlet hoofdlettersServlet / hoofdletters leegParamFilter com.baeldung.servlets3.web.filters.EmptyParamFilter / leeg hoofdletter 

Laten we beginnen met het vervangen van elke configuratiesectie door de respectieve annotaties die in Servlet 3.0 zijn geïntroduceerd.

4. Servetten

JEE 6 wordt geleverd met Servlet 3.0, waardoor we annotaties kunnen gebruiken voor servletdefinities, waardoor het gebruik van een web.xml bestand voor een webapplicatie.

We kunnen bijvoorbeeld een servlet definiëren en deze belichten met de @WebServlet annotatie

Laten we een servlet definiëren voor het URL-patroon / hoofdletters. Het zal de waarde van de invoer verzoek parameter in hoofdletters:

@WebServlet (urlPatterns = "/ uppercase", name = "uppercaseServlet") public class UppercaseServlet breidt HttpServlet uit {public void doGet (HttpServletRequest-verzoek, HttpServletResponse-antwoord) gooit IOException {String "inputString") (request.pperUpper) ; PrintWriter uit = response.getWriter (); out.println (inputString); }}

Merk op dat we een naam hebben gedefinieerd voor de servlet (hoofdletterServlet) waar we nu naar kunnen verwijzen. We zullen hier in de volgende sectie gebruik van maken.

Met de @WebServlet annotatie vervangen we de servlet en servlet-mapping secties uit de web.xml het dossier.

5. Filters

EEN Filter is een object dat wordt gebruikt om verzoeken of reacties te onderscheppen en pre- of postverwerkingstaken uit te voeren.

We kunnen een filter definiëren met de @WebFilter annotatie.

Laten we een filter maken om te controleren of het invoer request parameter is aanwezig:

@WebFilter (urlPatterns = "/ hoofdletters") public class EmptyParamFilter implementeert Filter {@Override public void doFilter (ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) gooit IOException, ServletException {String inputString ("servlet"); if (inputString! = null && inputString.matches ("[A-Za-z0-9] +")) {filterChain.doFilter (servletRequest, servletResponse); } else {servletResponse.getWriter (). println ("Ontbrekende invoerparameter"); }} // implementaties voor andere methoden}

Met de @WebFilter annotatie vervangen we de filter en filter-mapping secties uit de web.xml het dossier.

6. Luisteraars

We zullen vaak acties moeten activeren op basis van bepaalde gebeurtenissen. Dit is waar luisteraars te hulp schieten. Deze objecten luisteren naar een gebeurtenis en voeren het gedrag uit dat we specificeren.

Net als eerder kunnen we een luisteraar definiëren met de @WebListener annotatie.

Laten we een luisteraar maken die telt elke keer dat we een verzoek aan de server uitvoeren. We zullen implementeren ServletRequestListener, luisterend naar ServletRequestEvents:

@WebListener openbare klasse RequestListener implementeert ServletRequestListener {@Override openbare ongeldige requestDestroyed (ServletRequestEvent-gebeurtenis) {HttpServletRequest-verzoek = (HttpServletRequest) event.getServletRequest (); if (! request.getServletPath (). equals ("/ counter")) {ServletContext context = event.getServletContext (); context.setAttribute ("counter", (int) context.getAttribute ("counter") + 1); }} // implementaties voor andere methoden}

Merk op dat we de verzoeken voor het URL-patroon uitsluiten /teller.

Met de @WebListener annotatie vervangen we de luisteraar sectie van de web.xml het dossier.

7. Bouwen en rennen

Houd er rekening mee dat voor degenen die meegaan, er voor het testen een tweede servlet is die we hebben toegevoegd voor de /teller eindpunt dat eenvoudig de teller servlet context attribuut.

Dus laten we gebruiken Kater als de applicatieserver.

Als we een versie van maven-war-plugin vóór 3.1.0 moeten we de eigenschap instellen failOnMissingWebXml naar false.

Nu kunnen we onze .oorlog bestand naar Kater, en toegang tot onze servlets.

Laten we onze / hoofdletters eindpunt:

curl // localhost: 8080 / spring-mvc-java / hoofdletters? input = texttouppercase TEXTTOHOOFDLETTERS

En we moeten ook zien hoe onze foutafhandeling eruitziet:

curl // localhost: 8080 / spring-mvc-java / hoofdletters Ontbrekende invoerparameter

En tot slot een korte test van onze luisteraar:

curl // localhost: 8080 / spring-mvc-java / counter Verzoekteller: 2

8. XML is nog steeds nodig

Zelfs met alle functies die in Servlet 3.0 zijn geïntroduceerd, zijn er enkele gevallen waarin we nog steeds een web.xml bestand, waaronder:

  • We kunnen de filtervolgorde niet definiëren met annotaties - we hebben nog steeds de sectie als we meerdere filters hebben die we in een bepaalde volgorde moeten toepassen
  • Om een ​​sessietime-out te definiëren, moeten we nog steeds de sectie
  • We hebben nog steeds de element voor autorisatie op basis van containers
  • En om welkomstbestanden te specificeren, hebben we nog steeds een sectie

Of Servlet 3.0 introduceerde er ook enkele programmatische ondersteuning via ServletContainerInitializerdie ook enkele van deze hiaten kunnen opvullen.

9. Conclusie

In deze tutorial hebben we een Java-webapplicatie geconfigureerd zonder de web.xml bestand door de equivalente annotaties uit te oefenen.

Zoals altijd is de broncode voor deze tutorial te vinden op GitHub. Bovendien is een applicatie die het traditionele web.xml-bestand gebruikt, ook te vinden op GitHub.

Ga voor een op Spring gebaseerde aanpak naar onze tutorial web.xml vs. Initializer met Spring.