
Was ist ein Servlet?
Lassen Sie uns zunächst herausfinden, was Servlets sind und warum Sie so oft davon hören. Die Java Servlet API ist eine standardisierte API, die auf dem Server implementiert werden soll. Es interagiert mit Clients nach einem Anfrage-Antwort-Schema. Ein Servlet ist eine Klasse, die Anfragen von einem Client empfangen und Antworten an den Client zurückgeben kann. Tatsächlich sind Servlets genau die Bausteine, die wir verwenden, um eine Client-Server-Architektur in Java zu erstellen. Sie erinnern sich vielleicht, dass wir bereits in einem anderen Artikel der Serie über diese Architektur gesprochen haben. Wir reden nicht um den heißen Brei herum: Schreiben wir gleich Code.Was Sie zum Erstellen einer Webanwendung benötigen
Für größtmöglichen Komfort bei der Arbeit mit Java-Servlets benötigen Sie die IntelliJ IDEA Ultimate Edition. Es handelt sich um ein kostenpflichtiges Produkt, Sie können jedoch eine 30-Tage-Testversion aktivieren oder die Early-Access-Version nutzen, die immer kostenlos ist. Installieren Sie außerdem Apache Tomcat – den Server unserer Anwendung. Tomcat ist ein Servlet-Container: Er verarbeitet eingehende Anfragen und leitet sie an unsere Anwendung weiter. Laden Sie Tomcat hier herunter .Lassen Sie uns unsere erste Webanwendung erstellen
Wenn alles fertig ist, erstellen Sie ein Maven-Projekt. Wenn Sie mit Maven nicht vertraut sind, schauen Sie sich den vorherigen Artikel an . Lass uns anfangen!-
Fügen Sie in pom.xml eine javax.servlet-api-Abhängigkeit hinzu und geben Sie die WAR-Verpackung an:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>servlets</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> </dependencies> </project>
Einfache Servlet-Klasse:
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 java.io.IOException; import java.io.PrintWriter; @WebServlet("/hello") public class MainServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter printWriter = resp.getWriter(); printWriter.write("Hello!"); printWriter.close(); } }
-
Um die Anwendung auszuführen, müssen Sie eine Tomcat-Konfiguration erstellen:
-
Als nächstes geben wir an, welche Version von Tomcat wir verwenden werden, sowie die URL und den Port für die Kommunikation mit dem Server. Sie sollten so etwas haben:
-
Jetzt müssen wir nur noch das Artefakt (das zusammengestellte Projekt in einem JAR-Archiv) angeben, das im Container bereitgestellt wird. Sie können auf die Schaltfläche „Reparieren“ klicken und „Krieg explodiert“ auswählen : Dies bedeutet, dass das Artefakt nach der Neuerstellung des Projekts automatisch im Servlet-Container platziert wird.
-
Der Standardwert für den Anwendungskontext ist servlets_war_exploded . Das bedeutet, dass wir auf die Anwendung zugreifen unter: http://localhost:8080/servlets_war_exploded .
Warum sollten wir zusätzlichen Text wollen? Lasst uns das Unnötige löschen. Jetzt lautet die Adresse unserer Webanwendung: http://localhost:8080 .
-
OK klicken. Wir sehen, dass wir die Anwendung jetzt starten können:
Wenn Sie nun die Anwendung in Ihrem Browser öffnen, sollte die Fehlermeldung 404 angezeigt werden. Dies ist sinnvoll, da die Adresse http://localhost:8080/ ein Servlet benötigt, das auf „/“ abgebildet wird, unser einziges Servlet jedoch auf „/hello“ abgebildet wird .
-
Wir können unter http://localhost:8080/hello darauf zugreifen . Sobald wir das tun, erhalten wir die erwartete Antwort – die Zeichenfolge „Hallo“!
@WebServlet()
Annotation an. Hier binden wir das Servlet an einen bestimmten Pfad („/hello“) (oder ordnen es ihm zu). Diese Anmerkung erschien nur in Java Servlet API 3.0, daher gibt es im Internet viele Beispiele, bei denen die Servlet-Zuordnung über eine XML-Datei erfolgt. Dies ist nicht mehr notwendig. Um GET-Anfragen zu verarbeiten , überschreiben wir die doGet()
Methode. Achten Sie auf die Parameter der Methode: HttpServletRequest
und HttpServletResponse
. Das HttpServletRequest
Objekt liefert uns alle notwendigen Informationen zur Anfrage. Im HttpServletResponse
schreiben wir unsere Antwort und setzen die notwendigen Header.
Arbeiten mit Parametern und einer Sitzung
Verbessern wir unser Servlet, damit es Anforderungsparameter verarbeiten und mit einer Sitzung arbeiten kann:
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;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Integer visitCounter = (Integer) session.getAttribute("visitCounter");
if (visitCounter == null) {
visitCounter = 1;
} else {
visitCounter++;
}
session.setAttribute("visitCounter", visitCounter);
String username = req.getParameter("username");
resp.setContentType("text/html");
PrintWriter printWriter = resp.getWriter();
if (username == null) {
printWriter.write("Hello, Anonymous" + "<br>");
} else {
printWriter.write("Hello, " + username + "<br>");
}
printWriter.write("Page was visited " + visitCounter + " times.");
printWriter.close();
}
}
Jetzt arbeitet das Servlet mit einer Sitzung und erhöht den Wert visitCounter
jedes Mal, wenn die Seite besucht wird. Wenn das visitCounter
Attribut noch nicht erstellt wurde (beim ersten Besuch der Seite), gibt die getAttribute()
Methode null zurück, wir müssen also nach null suchen. Das Gleiche gilt für Anforderungsparameter. Wenn der Benutzer den Parameter „Benutzername“ nicht übergibt, ist sein Wert null. In diesem Fall begrüßen wir den Nutzer als anonymen Besucher. Um einen Parameter in einer GET-Anfrage zu übergeben, wird eine Abfragezeichenfolge verwendet. Beispielsweise könnten wir die folgende URL verwenden: http:// localhost:8080/hello? Benutzername=Paul. Weitere Informationen zu HTTP-Anfragen finden Sie im vorherigen Artikelin der Serie. Unsere Anwendung verfügt derzeit nicht über viel Logik, aber es ist etwas ärgerlich, dass wir im Root-Pfad einen 404-Fehler erhalten. Um dies zu beheben, erstellen wir ein weiteres Servlet und ordnen es der Startseite zu: @WebServlet("/")
. Der Zweck dieses Servlets besteht darin, Anfragen an den Pfad „/hello“ umzuleiten. Dafür gibt es zwei Möglichkeiten: „Weiterleiten“ oder „Umleiten“. Vielleicht lohnt es sich, den Unterschied zwischen ihnen zu verstehen. Eine Weiterleitung delegiert die Verarbeitung der Anfrage an ein anderes Servlet auf dem Server. Der Kunde ist nicht beteiligt. Fügen Sie dazu den folgenden Code zur doGet()-Methode des neuen Servlets hinzu:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
In diesem Code greifen wir auf den Servlet-Kontext zu, rufen den Anforderungs-Dispatcher für das entsprechende Servlet ab und bitten ihn, eine bestimmte Anforderung mit den angegebenen Argumenten (req bzw. req) zu verarbeiten. Eine Umleitung gibt dem Client die Adresse zurück, die der Client zum Verarbeiten seiner Anfrage verwenden muss. Die meisten Browser navigieren automatisch zur zurückgegebenen URL. Um eine Weiterleitung zu implementieren, müssen Sie diesen Code hinzufügen:
resp.sendRedirect(req.getContextPath() + "/hello");
Wir rufen die redirect()
Methode für den HttpServletResponse
Parameter auf und übergeben ihr die Adresse, die der Client verwenden muss. Hier ist ein wichtiges Detail: HTTP-Parameter müssen auch am Ende des vollständigen Umleitungspfads hinzugefügt werden, was nicht sehr praktisch ist. In unserer Situation ist die Verwendung vorzuziehen forward
, aber manchmal redirect
ist die Verwendung besser. Wenn Sie den Unterschied in ihrer Funktionsweise verstehen, werden Sie keine falsche Wahl treffen. Der Code für das neue Servlet sieht folgendermaßen aus:
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 java.io.IOException;
@WebServlet("/")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// getServletContext().getRequestDispatcher("/hello").forward(req, resp);
resp.sendRedirect(req.getContextPath() + "/hello");
}
}
GO TO FULL VERSION