Eine Java-Webanwendung ohne web.xml

1. Übersicht

In diesem Tutorial erstellen wir eine Java-Webanwendung mit Servlet 3.0+.

Wir werden uns drei Anmerkungen ansehen - @WebServlet , @WebFilter und @WebListener - die uns helfen können, unsere web.xml- Dateien zu nixen .

2. Die Maven-Abhängigkeit

Um diese neuen Anmerkungen verwenden zu können, müssen wir die Abhängigkeit javax.servlet-api einschließen :

 javax.servlet javax.servlet-api 4.0.1 

3. XML-basierte Konfiguration

Vor Servlet 3.0 haben wir eine Java-Webanwendung in einer web.xml- Datei konfiguriert :

  com.baeldung.servlets3.web.listeners.RequestListener   uppercaseServlet com.baeldung.servlets3.web.servlets.UppercaseServlet   uppercaseServlet /uppercase   emptyParamFilter com.baeldung.servlets3.web.filters.EmptyParamFilter   emptyParamFilter /uppercase  

Beginnen wir damit, jeden Konfigurationsabschnitt durch die entsprechenden in Servlet 3.0 eingeführten Anmerkungen zu ersetzen.

4. Servlets

JEE 6 wird mit Servlet 3.0 geliefert, mit dem wir Anmerkungen für Servlet-Definitionen verwenden können, wodurch die Verwendung einer web.xml- Datei für eine Webanwendung minimiert wird .

Beispielsweise können wir ein Servlet definieren und es mit der Annotation @WebServlet verfügbar machen

Definieren wir ein Servlet für das URL-Muster / Großbuchstaben . Der Wert des Eingabeanforderungsparameters wird in Großbuchstaben umgewandelt:

@WebServlet(urlPatterns = "/uppercase", name = "uppercaseServlet") public class UppercaseServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String inputString = request.getParameter("input").toUpperCase(); PrintWriter out = response.getWriter(); out.println(inputString); } }

Beachten Sie, dass wir einen Namen für das Servlet ( GroßbuchstabenServlet) definiert haben , auf das wir jetzt verweisen können. Wir werden dies im nächsten Abschnitt nutzen.

Mit der Annotation @WebServlet ersetzen wir die Abschnitte Servlet und Servlet-Mapping aus der Datei web.xml .

5. Filter

Ein Filter ist ein Objekt, mit dem Anforderungen oder Antworten abgefangen und Aufgaben vor oder nach der Verarbeitung ausgeführt werden.

Wir können einen Filter mit der Annotation @WebFilter definieren .

Erstellen wir einen Filter, um zu überprüfen, ob der Eingabeanforderungsparameter vorhanden ist:

@WebFilter(urlPatterns = "/uppercase") public class EmptyParamFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { String inputString = servletRequest.getParameter("input"); if (inputString != null && inputString.matches("[A-Za-z0-9]+")) { filterChain.doFilter(servletRequest, servletResponse); } else { servletResponse.getWriter().println("Missing input parameter"); } } // implementations for other methods }

Mit der Annotation @WebFilter ersetzen wir die Filter- und Filterzuordnungsabschnitte aus der Datei web.xml .

6. Zuhörer

Wir müssen häufig Aktionen auslösen, die auf bestimmten Ereignissen basieren. Hier kommen die Zuhörer zur Rettung. Diese Objekte warten auf ein Ereignis und führen das von uns angegebene Verhalten aus.

Wie zuvor können wir einen Listener mit der Annotation @WebListener definieren .

Erstellen wir einen Listener, der jedes Mal zählt, wenn wir eine Anforderung an den Server ausführen. Wir werden ServletRequestListener implementieren und auf ServletRequestEvent s warten :

@WebListener public class RequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent event) { HttpServletRequest request = (HttpServletRequest)event.getServletRequest(); if (!request.getServletPath().equals("/counter")) { ServletContext context = event.getServletContext(); context.setAttribute("counter", (int) context.getAttribute("counter") + 1); } } // implementations for other methods }

Beachten Sie, dass wir die Anforderungen an das URL-Muster / den URL- Zähler ausschließen .

Mit der Annotation @WebListener ersetzen wir den Listener- Abschnitt aus der Datei web.xml .

7. Erstellen und ausführen

Für diejenigen , folgende entlang, beachten Sie, dass für die Prüfung, gibt es eine zweite Servlet haben wir für den zusätzlichen / Zähler - Endpunkt , dass einfach das zurückgibt Zähler Attribut Servletkontext.

Verwenden wir also Tomcat als Anwendungsserver.

Wenn wir eine Version des Maven-War-Plugins vor 3.1.0 verwenden, müssen wir die Eigenschaft failOnMissingWebXml auf false setzen .

Jetzt können wir unsere .war- Datei für Tomcat bereitstellen und auf unsere Servlets zugreifen.

Probieren wir unseren Endpunkt / Großbuchstaben aus :

curl //localhost:8080/spring-mvc-java/uppercase?input=texttouppercase TEXTTOUPPERCASE

Und wir sollten auch sehen, wie unsere Fehlerbehandlung aussieht:

curl //localhost:8080/spring-mvc-java/uppercase Missing input parameter

Und zum Schluss noch ein kurzer Test unseres Zuhörers:

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

8. XML wird noch benötigt

Trotz aller in Servlet 3.0 eingeführten Funktionen gibt es einige Anwendungsfälle, in denen wir noch eine web.xml- Datei benötigen , darunter:

  • Wir können die Filterreihenfolge nicht mit Anmerkungen definieren - wir brauchen immer noch die Abschnitt, wenn wir mehrere Filter haben, die wir in einer bestimmten Reihenfolge anwenden müssen
  • Um ein Sitzungszeitlimit zu definieren, müssen wir weiterhin das verwenden Sektion
  • Wir brauchen noch die Element für die containergestützte Autorisierung
  • Und um Begrüßungsdateien anzugeben, benötigen wir noch eine Sektion

Mit Servlet 3.0 wurde auch eine programmatische Unterstützung über ServletContainerInitializer eingeführt , mit der auch einige dieser Lücken geschlossen werden können.

9. Fazit

In diesem Tutorial haben wir eine Java-Webanwendung ohne Verwendung der Datei web.xml konfiguriert, indem wir die entsprechenden Anmerkungen ausgeführt haben.

Der Quellcode für dieses Tutorial ist wie immer auf GitHub zu finden. Darüber hinaus finden Sie auf GitHub eine Anwendung, die die herkömmliche Datei web.xml verwendet.

Für einen Spring-basierten Ansatz besuchen Sie unser Tutorial web.xml vs. Initializer with Spring.