Einführung in Java Servlets

Einführung in Java Servlets

1. Überblick

In diesem Artikel befassen wir uns mit einem Kernaspekt der Webentwicklung in Java - Servlets.

2. Das Servlet und der Container

Einfach ausgedrückt ist ein Servlet eine Klasse, die Anforderungen verarbeitet und mit einer Antwort beantwortet.

Beispielsweise können wir ein Servlet verwenden, um Eingaben von einem Benutzer über ein HTML-Formular zu sammeln, Datensätze aus einer Datenbank abzufragen und Webseiten dynamisch zu erstellen.

Servlets werden von einer anderen Java-Anwendung namensServlet Container. gesteuert. Wenn eine auf einem Webserver ausgeführte Anwendung eine Anforderung, empfängt, übergibt der Server die Anforderung an den Servlet-Container, der sie wiederum an das Ziel weiterleitet Servlet.

3. Maven-Abhängigkeiten

Um die Servlet-Unterstützung in unserer Web-App hinzuzufügen, ist die Abhängigkeit vonjavax.servlet-apierforderlich:


    javax.servlet
    javax.servlet-api
    3.1.0

Die neueste Maven-Abhängigkeit isthere.

Natürlich müssen wir auch einen Servlet-Container konfigurieren, für den unsere App bereitgestellt werden soll. this is a good place to start on how to deploy a WAR on Tomcat.

4. Servlet-Lebenszyklus

Lassen Sie uns die Methoden durchgehen, die den Lebenszyklus eines Servlets definieren.

4.1. init()

Dieinit-Methode kann nur einmal aufgerufen werden. Wenn eine Instanz des Servlets nicht vorhanden ist, führt der Webcontainer Folgendes aus:

  1. Lädt die Servlet-Klasse

  2. Erstellt eine Instanz der Servlet-Klasse

  3. Initialisiert es durch Aufrufen der Methodeinit

Die Methodeinitmuss erfolgreich abgeschlossen werden, bevor das Servlet Anforderungen empfangen kann. Der Servlet-Container kann das Servlet nicht in Betrieb nehmen, wenn die Methodeinit entwederServletException auslöst oder nicht innerhalb eines vom Webserver festgelegten Zeitraums zurückkehrt.

public void init() throws ServletException {
    // Initialization code like set up database etc....
}

4.2. service()

Diese Methode wird erst aufgerufen, nachdem dieinit()-Methode des Servlets. erfolgreich abgeschlossen wurde

Der Container ruft die Methodeservice() auf, um vom Client kommende Anforderungen zu verarbeiten, interpretiert den HTTP-Anforderungstyp (GET,POST,PUT,DELETE usw. ) und ruftdoGet,doPost,doPut,doDelete usw. auf. geeignete Methoden.

public void service(ServletRequest request, ServletResponse response)
  throws ServletException, IOException {
    // ...
}

4.3. destroy()

Wird vom Servlet-Container aufgerufen, um das Servlet außer Betrieb zu setzen.

Diese Methode wird nur aufgerufen, wenn alle Threads in derservice-Methode des Servlets beendet wurden oder nachdem eine Zeitüberschreitung verstrichen ist. Nachdem der Container diese Methode aufgerufen hat, ruft er dieservice-Methode im Servlet nicht erneut auf.

public void destroy() {
    //
}

5. Beispiel Servlet

Let’s now setup a full example der Verarbeitung von Informationen mithilfe eines Formulars.

Definieren wir zunächst ein Servlet mit einer Zuordnung/calculateServlet, das die vom Formular geposteten Informationen erfasst und das Ergebnis mitRequestDispatcher zurückgibt:

@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet")
public class FormServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request,
      HttpServletResponse response)
      throws ServletException, IOException {

        String height = request.getParameter("height");
        String weight = request.getParameter("weight");

        try {
            double bmi = calculateBMI(
              Double.parseDouble(weight),
              Double.parseDouble(height));

            request.setAttribute("bmi", bmi);
            response.setHeader("Test", "Success");
            response.setHeader("BMI", String.valueOf(bmi));

            RequestDispatcher dispatcher
              = request.getRequestDispatcher("index.jsp");
            dispatcher.forward(request, response);
        } catch (Exception e) {
            response.sendRedirect("index.jsp");
        }
    }

    private Double calculateBMI(Double weight, Double height) {
        return weight / (height * height);
    }
}

Wie oben gezeigt, müssen mit@WebServlet annotierte Klassen die Klassejavax.servlet.http.HttpServlet erweitern. Es ist wichtig zu beachten, dass die Annotation von@WebServletnur ab Java EE 6 verfügbar ist.

Die Annotation@WebServlet wird vom Container zur Bereitstellungszeit verarbeitet und das entsprechende Servlet unter den angegebenen URL-Mustern verfügbar gemacht. Es ist zu beachten, dass wir durch die Verwendung der Annotation zum Definieren von URL-Mustern die Verwendung des XML-Bereitstellungsdeskriptorsweb.xml für unsere Servlet-Zuordnung vermeiden können.

Wenn wir das Servlet ohne Annotation zuordnen möchten, können wir stattdessen die traditionellenweb.xml verwenden:



    
       FormServlet
       com.root.FormServlet
    
    
        FormServlet
        /calculateServlet
    

Als nächstes erstellen wir ein grundlegendes HTMLform:

Your Weight (kg) :
Your Height (m) :

${bmi}

Um sicherzustellen, dass alles wie erwartet funktioniert, schreiben wir zum Schluss noch einen kurzen Test:

public class FormServletLiveTest {

    @Test
    public void whenPostRequestUsingHttpClient_thenCorrect()
      throws Exception {

        HttpClient client = new DefaultHttpClient();
        HttpPost method = new HttpPost(
          "http://localhost:8080/calculateServlet");

        List nvps = new ArrayList<>();
        nvps.add(new BasicNameValuePair("height", String.valueOf(2)));
        nvps.add(new BasicNameValuePair("weight", String.valueOf(80)));

        method.setEntity(new UrlEncodedFormEntity(nvps));
        HttpResponse httpResponse = client.execute(method);

        assertEquals("Success", httpResponse
          .getHeaders("Test")[0].getValue());
        assertEquals("20.0", httpResponse
          .getHeaders("BMI")[0].getValue());
    }
}

6. Servlet, HttpServlet und JSP

Es ist wichtig zu verstehen, dassthe Servlet technology is not limited to the HTTP protocol.

In der Praxis ist dies fast immer der Fall, aberServlet ist eine generische Schnittstelle undHttpServlet ist eine Erweiterung dieser Schnittstelle, die HTTP-spezifische Unterstützung hinzufügt, z. B.doGet unddoPost. usw.

Schließlich ist die Servlet-Technologie auch der Haupttreiber einer Reihe anderer Webtechnologien wieJSP – JavaServer Pages, Spring MVC usw.

7. Fazit

In diesem kurzen Artikel haben wir die Grundlagen von Servlets in einer Java-Webanwendung vorgestellt.

Das Beispielprojekt kann heruntergeladen und ina GitHub project ausgeführt werden.