CodeGym/Java-Blog/Random-DE/Teil 5. Servlets und die Java-Servlet-API. Schreiben eine...
John Squirrels
Level 41
San Francisco

Teil 5. Servlets und die 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 und die Java-Servlet-API.  Eine einfache Webanwendung schreiben – 1Wissen Sie bereits, wie man Java-Anwendungen schreibt, die Text auf der Konsole anzeigen, 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, mit der Sie Ihren Freunden gegenüber prahlen können, ohne ihnen eine JAR-Datei zu schicken und ohne sie zum Herunterladen von Java zu zwingen. Schreiben wir eine einfache Webanwendung . Wenn Sie mit den Ansätzen der Webentwicklung noch nicht vertraut sind, empfehle ich Ihnen, zunächst den ersten Artikel der Reihe „ Einführung in die Unternehmensentwicklung “ zu lesen.

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

    Teil 5. Servlets und die Java-Servlet-API.  Eine einfache Webanwendung schreiben - 2Teil 5. Servlets und die Java-Servlet-API.  Eine einfache Webanwendung schreiben – 3

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

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

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

    Teil 5. Servlets und die Java-Servlet-API.  Eine einfache Webanwendung schreiben – 6
  6. OK klicken. Wir sehen, dass wir die Anwendung jetzt starten können:

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

    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 .

  7. Wir können unter http://localhost:8080/hello darauf zugreifen . Sobald wir das tun, erhalten wir die erwartete Antwort – die Zeichenfolge „Hallo“!

Wenn alles funktioniert, analysieren wir den Code. Um aus einer gewöhnlichen Klasse ein HTTP-Servlet zu machen , muss es die Klasse HttpServlet erben. Über der Klassendeklaration geben wir die @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: HttpServletRequestund HttpServletResponse. Das HttpServletRequestObjekt liefert uns alle notwendigen Informationen zur Anfrage. Im HttpServletResponseschreiben 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 visitCounterjedes Mal, wenn die Seite besucht wird. Wenn das visitCounterAttribut 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 HttpServletResponseParameter 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 redirectist 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");
   }
}

Zusammenfassung

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 ähnliche Weise gehandhabt – indem die entsprechenden Methoden der übergeordneten Klasse überschrieben werden. Mit einfachen Servlets wie diesem können Sie anspruchsvolle, vielseitige Webanwendungen erstellen. Die Verwendung großer Frameworks wie Spring macht dies natürlich viel einfacher. Wenn Sie jedoch wirklich tiefer in alle Funktionen von Servlets eintauchen möchten, können Sie die offizielle Spezifikation lesen . Teil 6. Servlet-Container Teil 7. Einführung in das MVC-Muster (Model-View-Controller).
Kommentare
  • Beliebt
  • Neu
  • Alt
Du musst angemeldet sein, um einen Kommentar schreiben zu können
Auf dieser Seite gibt es noch keine Kommentare