JavaRush /Java-Blog /Random-DE /Teil 5. Servlets, Java-Servlet-API. Schreiben einer einfa...

Teil 5. Servlets, Java-Servlet-API. Schreiben einer einfachen Webanwendung

Veröffentlicht in der Gruppe Random-DE
Dieses Material ist Teil der Reihe „Einführung in die Unternehmensentwicklung“. Vorherige Artikel: Teil 5. Servlets, Java-Servlet-API.  Eine einfache Webanwendung schreiben – 1Wissen Sie bereits, wie man Java-Anwendungen schreibt, die Text an die Konsole ausgeben, wissen aber noch nicht so richtig, wie Sie Ihre erste Webanwendung erstellen? Großartig, machen Sie es sich bequem. In diesem Artikel machen wir uns mit Servlets vertraut und schreiben eine Anwendung, die Sie Ihren Freunden zeigen können, ohne ihnen einen Jarnik zu schicken oder sie zum Herunterladen von Java zu zwingen. Schreiben wir eine Webanwendung . Wenn Sie mit den Ansätzen, die in der Webprogrammierung verwendet werden, noch nicht vertraut sind, empfehle ich Ihnen, mit der Lektüre mit dem ersten Artikel der Reihe „ Einführung in die Unternehmensentwicklung “ zu beginnen.

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!
  1. 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();
       }
    }
  2. Um die Anwendung auszuführen, müssen Sie eine Tomcat-Konfiguration erstellen:

    Teil 5. Servlets, Java-Servlet-API.  Eine einfache Webanwendung schreiben - 2 Teil 5. Servlets, Java-Servlet-API.  Eine einfache Webanwendung schreiben - 3

  3. 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:

    Teil 5. Servlets, Java-Servlet-API.  Eine einfache Webanwendung schreiben – 4
  4. 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. Teil 5. Servlets, Java-Servlet-API.  Eine einfache Webanwendung schreiben – 5

  5. 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 .

    Teil 5. Servlets, Java-Servlet-API.  Eine einfache Webanwendung schreiben – 6

  6. OK klicken. Wir sehen, dass wir jetzt die Möglichkeit haben, die Anwendung zu starten:

    Teil 5. Servlets, Java-Servlet-API.  Eine einfache Webanwendung schreiben – 7

    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“ .

  7. Wir kontaktieren es unter http://localhost:8080/hello und erhalten die erwartete Antwort – die Zeichenfolge „Hallo“!

Wenn alles funktioniert, schauen wir uns den Code an. Um ein http-Servlet aus einer regulären Klasse zu erstellen , müssen Sie es von der HttpServlet-Klasse erben. Über der Klasse geben wir die Annotation @WebServlet() an, in der wir das Servlet an einen bestimmten Pfad („/hello“) binden (zuordnen). Diese Anmerkung erschien nur in der Java Servlet API 3.0, daher gibt es im Internet viele Beispiele, bei denen die Servlet-Zuordnung über eine XML-Datei erfolgt. Das ist jetzt nicht nötig. Um GET-Anfragen zu verarbeiten , überschreiben wir die Methode doGet(). Achten Sie auf die Methodenargumente HttpServletRequest und HttpServletResponse. Aus dem HttpServletRequest-Objekt können wir alle notwendigen Informationen zur Anfrage entnehmen, in HttpServletResponse können wir unsere Antwort aufzeichnen und die notwendigen Header setzen.

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");
   }
}

Endeffekt

Ihre erste Webanwendung ist fertig. Im nächsten Artikel erfahren Sie, wie Sie es ohne Verwendung von Intellij IDEA bereitstellen. Wir haben eine Anwendung geschrieben, die nur GET-Anfragen verarbeitet. Die übrigen http-Methoden werden auf die gleiche Weise verarbeitet – wobei die entsprechenden Methoden der übergeordneten Klasse überschrieben werden. Mithilfe solch einfacher Servlets können Sie komplexe, umfangreiche Webanwendungen erstellen. Mit großen Frameworks wie Spring ist dies natürlich viel einfacher. Wenn Sie jedoch wirklich detaillierter auf alle Funktionen von Servlets eingehen möchten, können Sie die offizielle Spezifikation lesen . Teil 6. Servlet-Container Teil 7. Einführung in das MVC-Muster (Model-View-Controller) Teil 8. Schreiben einer kleinen Anwendung in Spring-Boot
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION