Einführung in Java Servlets

1. Übersicht

In diesem Artikel werden wir einen Kernaspekt der Webentwicklung in Java - Servlets betrachten.

2. Das Servlet und der Container

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

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 gesteuert, die als Servlet-Container bezeichnet wird. Wenn eine Anwendung, die auf einem Webserver ausgeführt wird, eine Anforderung empfängt , übergibt der Server die Anforderung an den Servlet-Container, der sie wiederum an das Ziel-Servlet weiterleitet.

3. Maven-Abhängigkeiten

Um die Servlet-Unterstützung in unserer Web-App, dem Javax , hinzuzufügen . Servlet-API- Abhängigkeit ist erforderlich:

 javax.servlet javax.servlet-api 3.1.0 

Die neueste Maven-Abhängigkeit finden Sie hier.

Natürlich müssen wir auch einen Servlet-Container konfigurieren, für den unsere App bereitgestellt werden soll. Dies ist ein guter Ausgangspunkt für die Bereitstellung eines WAR auf Tomcat.

4. Servlet-Lebenszyklus

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

4.1. drin()

Die init- Methode kann nur einmal aufgerufen werden. Wenn keine Instanz des Servlets vorhanden ist, wird der Webcontainer:

  1. Lädt die Servlet-Klasse
  2. Erstellt eine Instanz der Servlet-Klasse
  3. Initialisiert es durch Aufrufen der init- Methode

Die init- Methode muss erfolgreich abgeschlossen werden, bevor das Servlet Anforderungen empfangen kann. Der Servlet-Container kann das Servlet nicht in Betrieb nehmen, wenn die init- Methode entweder eine ServletException auslöst oder nicht innerhalb eines vom Webserver festgelegten Zeitraums zurückgibt .

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

4.2. Bedienung()

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

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

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

4.3. zerstören()

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

Diese Methode wird nur aufgerufen, wenn alle Threads innerhalb der Servicemethode des Servlets beendet wurden oder nachdem eine Zeitüberschreitung verstrichen ist. Nachdem der Container diese Methode aufgerufen hat, wird die Servicemethode im Servlet nicht erneut aufgerufen .

public void destroy() { // }

5. Beispielservlet

Lassen Sie uns nun ein vollständiges Beispiel für den Umgang mit Informationen mithilfe eines Formulars einrichten.

Definieren wir zunächst ein Servlet mit einem Mapping / berechneServlet, das die vom Formular geposteten Informationen erfasst und das Ergebnis mit einem RequestDispatcher 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, mit kommentierten Klassen @WebServlet müssen erweitern javax.servlet.http.HttpServlet Klasse. Es ist wichtig zu beachten, dass die @ WebServlet- Annotation nur 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 Anmerkung zum Definieren von URL-Mustern die Verwendung des XML-Bereitstellungsdeskriptors web.xml für unsere Servlet-Zuordnung vermeiden können .

Wenn wir das Servlet ohne Anmerkung zuordnen möchten, können wir stattdessen die traditionelle Datei web.xml verwenden:

  FormServlet com.root.FormServlet   FormServlet /calculateServlet  

Als nächstes erstellen wir ein einfaches HTML- Formular :


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

${bmi}

Zum Schluss - um sicherzustellen, dass alles wie erwartet funktioniert, schreiben wir auch einen kurzen Test:

public class FormServletLiveTest { @Test public void whenPostRequestUsingHttpClient_thenCorrect() throws Exception { HttpClient client = new DefaultHttpClient(); HttpPost method = new HttpPost( "//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, dass die Servlet-Technologie nicht auf das HTTP-Protokoll beschränkt ist.

In der Praxis ist dies fast immer der Fall , aber Servlet ist eine generische Schnittstelle und das HttpServlet ist eine Erweiterung dieser Schnittstelle, die HTTP-spezifische Unterstützung wie doGet und doPost usw. hinzufügt .

Schließlich ist die Servlet-Technologie auch der Haupttreiber einer Reihe anderer Webtechnologien wie JSP - 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 so wie es ist als GitHub-Projekt heruntergeladen und ausgeführt werden.