Was ist ein Servlet?
Lassen Sie uns zunächst herausfinden, was ein Servlet ist und warum Sie so oft davon hören. Die Java Servlet API ist eine standardisierte API, die für die Implementierung auf dem Server und die Zusammenarbeit mit dem Client mithilfe eines Anforderungs-Antwort-Schemas entwickelt wurde. Ein Servlet ist eine Klasse, die Anfragen von einem Client empfangen und Antworten darauf zurückgeben kann. Ja, Servlets in Java sind genau die Elemente, aus denen die Client-Server-Architektur aufgebaut ist. Wenn Sie sich erinnern, haben wir bereits in einem der Artikel der Serie darüber gesprochen. Reden wir nicht um den heißen Brei herum: Schreiben wir gleich Code.Was Sie zum Erstellen einer Webanwendung benötigen
Um bequem mit Servlets in Java arbeiten zu können, benötigen Sie Intellij IDEA Ultimate Edition. Es ist kostenpflichtig, aber Sie können eine 30-tägige Testphase aktivieren oder die Early-Access-Version nutzen – es ist immer kostenlos. Installieren Sie auch unseren Anwendungsserver – Apache Tomcat. Tomcat ist ein Servlet-Container: Er verarbeitet eingehende Anfragen von außen und leitet sie an unsere Anwendung weiter. Sie können Tomcat über diesen Link herunterladen .Erstellen der ersten Webanwendung
Wenn alles fertig ist, erstellen wir ein Maven-Projekt. Wenn Sie mit Maven nicht vertraut sind, lesen Sie den vorherigen Artikel . Fangen wir an!-
Fügen Sie in pom.xml die Abhängigkeit javax.servlet-api hinzu und legen Sie den Paketkrieg fest:
<?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, die URL, über die wir auf den Server zugreifen können, und den Port. Sie sollten so etwas erhalten:
-
Jetzt muss nur noch das Artefakt (das in einem JAR-Archiv zusammengestellte Projekt) angegeben werden, 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 Anwendungskontext ist standardmäßig auf servlets_war_exploded eingestellt , was bedeutet, dass auf die Anwendung zugegriffen werden muss unter: http://localhost:8080/servlets_war_exploded .
Warum brauchen wir zusätzlichen Text? Entfernen wir unnötige Dinge. Jetzt lautet unsere Anwendungsadresse: http://localhost:8080 .
-
OK klicken. Wir sehen, dass wir jetzt die Möglichkeit haben, die Anwendung zu starten:
Wenn Sie nun die Anwendung starten, sollte sich der Browser öffnen und einen 404-Fehler anzeigen. Das ist logisch, denn an der Adresse http://localhost:8080/ sollte es ein Servlet mit der Zuordnung „/“ geben, und unser einziges Servlet hat die Zuordnung „/hello“ .
-
Wir kontaktieren es unter http://localhost:8080/hello und erhalten die erwartete Antwort – die Zeichenfolge „Hallo“!
Arbeiten mit Parametern und Sitzung
Verbessern wir unser Servlet, damit es Anforderungsparameter verarbeiten und mit der 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();
}
}
Das Servlet führt derzeit die Sitzung aus und erhöht den VisitCounter bei jedem Besuch der Seite. Wenn das Attribut „visitCounter“ noch nicht erstellt wurde (beim ersten Besuch der Seite), gibt die Methode „getAttribute()“ null zurück, Sie müssen also nach „null“ suchen. Das Gleiche gilt für Anforderungsparameter. Wenn der Benutzer den Parameter „Benutzername“ nicht übergeben hat, ist sein Wert null. In diesem Fall begrüßen wir den Nutzer anonym. Um einen Parameter in einer GET-Anfrage zu übergeben, werden Pfadvariablen verwendet, das heißt, Sie müssen auf den Link http://localhost:8080/hello?username=Pavel zugreifen . Weitere Informationen zu HTTP-Anfragen finden Sie im vorherigen Artikel der Serie. Jetzt hat unsere Anwendung nur noch minimale Logik, aber der 404-Fehler im Root-Pfad ist etwas nervig. Um das Problem zu beheben, erstellen wir ein weiteres Servlet und ordnen es der Startseite @WebServlet("/") zu. Die Aufgabe dieses Servlets besteht darin, Anfragen an den Pfad „/hello“ umzuleiten. Dafür gibt es zwei Möglichkeiten: Weiterleiten oder Umleiten. Vielleicht lohnt es sich zu verstehen, was der Unterschied zwischen ihnen ist. vorwärts – delegiert die Anforderungsverarbeitung an ein anderes Servlet auf dem Server, der Client ist nicht beteiligt. Dazu müssen Sie der doGet()-Methode des neuen Servlets den folgenden Code hinzufügen:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
In diesem Code greifen wir auf den Servlet-Kontext zu, holen daraus den Request-Manager des gewünschten Servlets und bitten ihn, eine bestimmte Anfrage mit den angegebenen Parametern (req, resp) zu bearbeiten. Weiterleiten – gibt dem Kunden die Adresse zurück, an die er sich wenden muss, um seine Anfrage zu bearbeiten. Die meisten Browser rufen den übermittelten Link automatisch auf. Um die Weiterleitung zu implementieren, müssen Sie diesen Code hinzufügen:
resp.sendRedirect(req.getContextPath() + "/hello");
In HttpServletResponse rufen wir die Methode „redirect()“ auf und übergeben ihr die Adresse, die der Client kontaktieren muss. Ein wichtiges Detail: Am Ende des vollständigen Umleitungspfads müssen auch http-Parameter hinzugefügt werden, was nicht sehr praktisch ist. In unserer Situation ist die Verwendung der Weiterleitung vorzuziehen, es kommt jedoch vor, dass die Verwendung der Umleitung besser ist. Wenn Sie den Unterschied in ihrer Arbeit verstehen, werden Sie mit Ihrer Wahl nichts falsch machen. 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