1.1-Schnittstellen-Servlet
Heute beginnen wir mit einem neuen und interessanten Thema – Servlets . Erst die Hinzufügung von Servlets zu Java führte dazu, dass Java zum De-facto-Standard für große Serveranwendungen wurde. 80 % aller Unternehmenssoftware weltweit ist in Java geschrieben. Und in China ist alles zu 100 %. Was sind Servlets?
Ein Servlet ist genau das, was ein Java-Programm in einen Webdienst verwandelt und es ihm ermöglicht, Anfragen von Clients zu verarbeiten. Und es war so...
In den 90er Jahren, unmittelbar nach dem Aufkommen des World Wide Web, erschienen Web-Clients (Browser) und Webserver. Webserver verteilen in der Regel einfach die von ihnen gespeicherten Dateien über das Internet: HTML-Seiten, Skripte, Bilder usw.
Irgendwann kamen alle zu dem Schluss, dass es notwendig sei, beide Seiten schlauer zu machen. Den HTML-Seiten wurde JavaScript hinzugefügt, und den Servern wurden Plugins hinzugefügt – spezielle Skripte, die als Reaktion auf bestimmte Anfragen aufgerufen wurden und das Verhalten des Servers flexibler und intelligenter machten.
Ein Servlet ist also ein Java-Plugin , das integriert wurde Java web-server
und es ihm ermöglichte, Java-Code auszuführen, wenn es für bestimmte Seiten angefordert wurde. Und bereits hat dieser Java-Code, dargestellt durch eine von der Servlet-Klasse geerbte Klasse, das getan, was seine Entwickler beabsichtigt hatten.
Und wie Sie bereits wissen, ist Tomcat der beliebteste Java-Webserver . Benannt übrigens zu Ehren der Katze Tom aus dem Zeichentrickfilm „Tom und Jerry“.
Wie interagiert Tomcat mit Servlets? Tatsächlich ist dieser Prozess standardisiert und wird als Servlet-Lebenszyklus bezeichnet . Darin ist ein Servlet ein ladbares Objekt und ein Webserver ein Servlet- Container .
Wenn das Servlet noch nicht geladen wurde , dann:
- Die Servlet-Klasse wird vom Container geladen.
- Der Container erstellt eine Instanz der Klasse (Objekt) des Servlets.
- Der Container ruft eine Methode
init()
für das Servlet-Objekt auf. Die Methode wird nur einmal aufgerufen.
Standardarbeitszyklus – Bearbeitung einer Kundenanfrage :
- Jede Anfrage wird in einem separaten Thread verarbeitet.
- Der Container ruft eine Methode
service()
auf dem Servlet auf und übergibt dort die Objekte ServletRequest und ServletResponse. destroy()
Um das Servlet zu beenden, wird eine Methode für das Servlet-Objekt aufgerufen . Es wird nur einmal aufgerufen.
Es kann viele Gründe geben, warum ein Servlet beendet wird:
- Der Programmierer startet den Webserver neu. Es ist notwendig, alle Servlets ordnungsgemäß herunterzufahren.
- Der Programmierer lädt eine neue Version des Servlets, die alte muss korrekt entladen werden.
- Usw.
Denken Sie an die Hauptsache: Der Webserver und seine Servlets sollten monatelang ohne Ausfälle und Neustarts funktionieren und Tausende von Anfragen pro Minute bedienen. Daher sollte der Code sowohl zum Laden als auch zum Arbeiten und Entladen eines Servlets immer von sehr hoher Qualität geschrieben sein.
1.2 HttpServlet-Klasse
Die Servlet-Klasse dient dazu, die Funktionsweise eines Servlets und eines Containers zu standardisieren. Programmierer arbeiten nicht direkt mit dieser Klasse. Nun, sie funktionieren selten. Die am häufigsten verwendete Klasse HttpServlet
wird von Servlet geerbt.
Diese Klasse verfügt über mehrere Methoden, die für uns nützlich sein werden. Sie werden sie häufig verwenden:
Methode | Beschreibung | |
---|---|---|
1 | init() |
Wird einmal aufgerufen, wenn das Servlet geladen wird |
2 | destroy() |
Wird einmal aufgerufen, wenn das Servlet entladen wird |
3 | service(HttpRequest, HttpResponse) |
Wird bei jeder neuen Anfrage an das Servlet aufgerufen |
4 | doGet(HttpRequest, HttpResponse) |
Wird bei jeder neuen GET-Anfrage an das Servlet aufgerufen |
5 | doPost(HttpRequest, HttpResponse) |
Wird bei jeder neuen POST-Anfrage an das Servlet aufgerufen |
6 | doHead(HttpRequest, HttpResponse) |
Wird für jede neue HEAD-Anfrage an das Servlet aufgerufen |
7 | doDelete(HttpRequest, HttpResponse) |
Wird bei jeder neuen DELETE-Anfrage an das Servlet aufgerufen |
8 | doPut(HttpRequest, HttpResponse) |
Wird bei jeder neuen PUT-Anfrage an das Servlet aufgerufen |
Die Methoden init()
und destroy()
werden von der Servlet-Klasse geerbt. Wenn Sie sie daher in Ihrem Servlet überschreiben möchten, müssen Sie auch deren Implementierung aus der Basisklasse aufrufen. Hierzu wird der Befehl verwendet super.method name()
.
Servlet-Beispiel:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Getting the parameter “secret” from request
String secret = request.getParameter("secret");
// Put parameter “secret” into Http-session
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Print HTML as response for browser
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Header</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet example "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3-Dienstmethode (HttpServletRequest, HttpServletResponse).
Betrachtet man die Verarbeitung einer Client-Anfrage aus der Sicht eines Servlets, dann sieht es in etwa so aus.
Für jede Clientanforderung erstellt der Container (Webserver) HttpServletRequest
Objekte HttpServletResponse
und ruft dann eine Methode service(HttpServletRequest request, HttpServletResponse response)
für das entsprechende Servlet auf. Diese Objekte werden an sie übergeben, damit die Methode die erforderlichen Daten entnehmen request
und das Ergebnis der Arbeit darin ablegen kann response
.
Die Methode service()
verfügt über eine Standardimplementierung. Wenn es nicht neu definiert wird, wird es ausgeführt. Das ist es, was er tut.
Die Methode service()
ermittelt den HTTP-Methodentyp aus der Anfrage (GET, POST, ...) und ruft die der Anfrage entsprechende Methode auf.
Methode | Beschreibung | |
---|---|---|
1 | service(HttpRequest, HttpResponse) |
Wird bei jeder neuen Anfrage an das Servlet aufgerufen |
2 | doGet(HttpRequest, HttpResponse) |
Wird bei jeder neuen GET-Anfrage an das Servlet aufgerufen |
3 | doPost(HttpRequest, HttpResponse) |
Wird bei jeder neuen POST-Anfrage an das Servlet aufgerufen |
4 | doHead(HttpRequest, HttpResponse) |
Wird für jede neue HEAD-Anfrage an das Servlet aufgerufen |
5 | doDelete(HttpRequest, HttpResponse) |
Wird bei jeder neuen DELETE-Anfrage an das Servlet aufgerufen |
6 | doPut(HttpRequest, HttpResponse) |
Wird bei jeder neuen PUT-Anfrage an das Servlet aufgerufen |
In Ihrer Klasse können Sie entweder eine Methode neu definieren service()
oder sie in Ruhe lassen, aber dann die Methoden doGet()
, doPost()
, ... nach Bedarf neu definieren.