1. Was ist ein Servlet 1.1. Erklären Sie in offiziellen Worten: Servlet ist eine von Oracle bereitgestellte Technologie zur Entwicklung dynamischer Webressourcen und eine Kernspezifikation im JavaEE -System. 2. Beginnen Sie mit der Erstellung des Servlets 2.1. Durch die vorherige Einführung wissen wir, welche Art von Klasse Objekte erstellt, auf die der Browser zugreifen kann. Gehen wir zunächst direkt zum Code: Paket com.briup.web; importiere java.io.IOException; importiere javax.servlet.Servlet; importiere javax.servlet.ServletConfig; importiere javax.servlet.ServletException; importiere javax.servlet.ServletRequest; importiere javax.servlet.ServletResponse; öffentliche Klasse FirstWay implementiert Servlet { öffentliche FirstWay() { System.out.println("Objekt erstellt"); } @Überschreiben public void init(ServletConfig config) throws ServletException { // TODO Automatisch generierter Methodenstummel System.out.println("Ich bin init: Ich wurde aufgerufen"); } @Überschreiben öffentliche ServletConfig getServletConfig() { // TODO Automatisch generierter Methodenstummel gibt null zurück; } @Überschreiben public void service(ServletRequest req, ServletResponse res) löst ServletException, IOException { aus. // TODO Automatisch generierter Methodenstummel System.out.println("Ich bin ein Dienst, ich wurde aufgerufen"); } @Überschreiben öffentliche Zeichenfolge getServletInfo() { // TODO Automatisch generierter Methodenstummel gibt null zurück; } @Überschreiben öffentliche Leere zerstören() { // TODO Automatisch generierter Methodenstummel System.out.println("Ich bin zerstört: Ich wurde gerufen"); } } Es wurde also eine Klasse erstellt, die das Servlet erfüllt, und die nächste Frage ist Wer erstellt das Servet-Objekt? Welche darin implementierten Schnittstellenmethoden werden aufgerufen, wann werden sie aufgerufen und wie oft werden sie aufgerufen? 1. Methode 1: Durch Konfigurieren von WebXML. (Dringend nicht empfohlen) Für das gesamte dynamische Webprojekt ist web.xml die erste geladene Konfigurationsdatei. Konfigurieren Sie sie daher in web.xml. <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>ersterWeg</display-name> <Servlet> <servlet-name>Erster Weg</servlet-name> <servlet-Klasse>com.briup.web.FirstWay</servlet-Klasse> <!-- <beim-Startup laden>1</beim-Startup> --> </servlet> <Servlet-Zuordnung> <servlet-name>Erster Weg</servlet-name> <url-pattern>/ErsterWeg</url-pattern> </servlet-mapping> </Web-App> erklären: Schritt 1: Tomcat starten Tomcat startet normal Schritt 2: Zugriff über den Browser (wir greifen hier 3x manuell zu) Der Browserzugriff ist normal Schritt 3: Beobachten Sie die Konsole Durch Ausführen der Ergebnisanalyse: Wenn Sie den Server zum ersten Mal starten, wird das Objekt nicht erstellt Der Browser fordert die Anfrage dreimal an, das Objekt wird jedoch nur einmal erstellt und die Methode init() wird nur einmal aufgerufen. Bei jedem Zugriff auf das Objekt wird die Methode service() aufgerufen Andere Methoden werden nicht aufgerufen Erklären Sie, warum es nicht aufgerufen wird: getServletConfig(): Ruft das ServletConfig-Objekt ab: getServletInfo(): Ruft die Vertrauenswürdigkeit des Servlets ab, etwa den Autor: destroy(): Diese Methode wird aufgerufen, wenn das Servlet zerstört wird (Beispiel: Tomcati wird normal geschlossen , ich werde es hier nicht testen. Wenn Sie es testen möchten, können Sie mit der rechten Maustaste auf den Dienst klicken und auf „Stopp“ klicken) und dann die Konsole beobachten, um es herauszufinden. 2. Methode 2: Informieren Sie Tomcat durch Anmerkungen (im Vergleich zur vorherigen Methode, empfohlen) @WebServlet(Wert = "Mapping-Pfad") öffentliches Fristservlet implementiert Servelt { } Mit dieser Annotation kann auch eingestellt werden, ob beim Starten des Servers ein Objekt erstellt werden soll. Dies wird hier nicht demonstriert. 3. Zurück zum Thema, der zweite Weg, ein Servlet zu erstellen Nach der vorherigen Erklärung gehen wir direkt zum Code und analysieren ihn dann Paket com.briup.web; importiere java.io.IOException; importiere javax.servlet.GenericServlet; importiere javax.servlet.ServletException; importiere javax.servlet.ServletRequest; importiere javax.servlet.ServletResponse; importiere javax.servlet.annotation.WebServlet; @WebServlet(Wert = "/zweiterWeg") öffentliche Klasse SecondWayCreate erweitert GenericServlet { @Überschreiben public void service(ServletRequest req, ServletResponse res) löst ServletException, IOException { aus. // TODO Automatisch generierter Methodenstummel System.out.println("Die Servicemethode wurde aufgerufen"); } } 1. Einfacher als die erste Methode, implementiert sie die Klasse GenericServlet 2. Schauen wir uns den GenericServlet-Quellcode an und analysieren ihn dann. öffentliche abstrakte Klasse GenericServlet implementiert Servlet, ServletConfig, Es ist ersichtlich, dass dies eine Schubladenklasse ist, die die Implementierungsklasse der Servlet-Schnittstelle ist, sodass GenericServlet die Servlet-Schnittstelle indirekt implementiert. 3. Konzentrieren Sie sich auf die dritte Methode (im Vergleich zu den ersten beiden empfehle ich die dritte Methode mehr) Direkt auf dem Code Paket com.briup.web; importiere java.io.IOException; importiere javax.servlet.ServletException; importiere javax.servlet.annotation.WebServlet; importiere javax.servlet.http.HttpServlet; importiere javax.servlet.http.HttpServletRequest; importiere javax.servlet.http.HttpServletResponse; @WebServlet(Wert = "/ThreeWayCreate") öffentliche Klasse ThreeWayCreate erweitert HttpServlet { @Überschreiben geschützt void doGet(HttpServletRequest req, HttpServletResponse resp) wirft ServletException, IOException { // TODO Automatisch generierter Methodenstummel super.doGet(req, resp); } @Überschreiben geschützt void doPost(HttpServletRequest req, HttpServletResponse resp) wirft ServletException, IOException { // TODO Automatisch generierter Methodenstummel super.doPost(req, resp); } } Aufgrund des obigen Codes fragen sich einige Freunde möglicherweise, ob das Servlet die Servlet-Schnittstelle nicht direkt oder indirekt implementieren muss. Muss der Browser die Servicemethode nicht für jede Anforderung einmal aufrufen? Wo ist die Methode? Steht dies nicht im Widerspruch zur bisherigen Theorie? Paket com.briup.web; importiere java.io.IOException; importiere javax.servlet.ServletException; importiere javax.servlet.annotation.WebServlet; importiere javax.servlet.http.HttpServlet; importiere javax.servlet.http.HttpServletRequest; importiere javax.servlet.http.HttpServletResponse; @WebServlet(Wert = "/ThreeWayCreate") öffentliche Klasse ThreeWayCreate erweitert HttpServlet { @Überschreiben geschützt void doGet(HttpServletRequest req, HttpServletResponse resp) wirft ServletException, IOException { // TODO Automatisch generierter Methodenstummel super.doGet(req, resp); } @Überschreiben geschützt void doPost(HttpServletRequest req, HttpServletResponse resp) wirft ServletException, IOException { // TODO Automatisch generierter Methodenstummel super.doPost(req, resp); } } analysieren: Erster Schritt: Analyse Es ist ersichtlich, dass diese abstrakte Klasse die abstrakte Klasse GennericeServlet erbt , was bedeutet, dass sie Schicht für Schicht nach unten verschoben wird und die Servle-Schnittstelle implementiert. Dann muss diese Extraktionsklasse auch die Serice-Methode erben. Zweiter Schritt: Analyse Dies ist die Servicemethode, die die Servlet-Schnittstelle erbt. Diese Methode wird bei jeder Anforderung des Browsers aufgerufen. Wie in der Abbildung gezeigt, wurde diese Methode von HttpServlet implementiert. Aus der Implementierungsklasse lässt sich schließen, dass das Anforderungsobjekt req und das Antwortobjekt res zwangsweise in HttpServletRequest und HttpServletResponse konvertiert werden (Abwärtstransformation) und die zwangsweise konvertierten Objekte dann an die überladene Servicemethode von HttpServlet übergeben und aufgerufen werden. Der dritte Schritt besteht darin, den überladenen Service (HttpRequest req, HttpResponse res) zu analysieren. Schritt 3 Analyse geschützter void-Dienst (HttpServletRequest req, HttpServletResponse resp) wirft ServletException, IOException { String-Methode = req.getMethod(); wenn (Methode.gleich(METHODE_GET)) { lange lastModified = getLastModified(req); wenn (lastModified == -1) { // Servlet unterstützt kein if-modified-since, kein Grund // um weitere teure Logik zu durchlaufen macheGet(req, resp); } anders { lange ifModifiedSince; versuchen { ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); } Fang (IllegalArgumentException iae) { // Ungültiger Datumsheader - fahren Sie fort, als wäre keiner festgelegt ifModifiedSince = -1; } wenn (wennGeändertSeit < (zuletztGeändert / 1000 * 1000)) { // Wenn die Servlet-Mod-Zeit später ist, rufen Sie doGet() auf // Für einen korrekten Vergleich auf die nächste Sekunde abrunden // Ein ifModifiedSince von -1 ist immer kleiner vielleichtSetLastModified(bzw. lastModified); macheGet(req, resp); } anders { bzw. setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } sonst wenn (Methode.equals(METHOD_HEAD)) { lange lastModified = getLastModified(req); vielleichtSetLastModified(bzw. lastModified); doHead(erfordert, resp); } sonst wenn (Methode.equals(METHOD_POST)) { doPost(erfordert, resp); } sonst wenn (Methode.equals(METHOD_PUT)) { führePut(req, resp); } sonst wenn (Methode.equals(METHOD_DELETE)) { führeLöschen durch (req, resp); } sonst wenn (Methode.equals(METHODENOPTIONEN)) { führeOptionen aus (erfordert, resp); } sonst wenn (Methode.equals(METHOD_TRACE)) { doTrace(req,resp); } anders { // // Beachten Sie, dass dies bedeutet, dass KEIN Servlet unterstützt, was auch immer // Methode wurde überall auf diesem Server angefordert. // String errMsg = lStrings.getString("http.method_not_implemented"); Objekt[] errArgs = neues Objekt[1]; errArgs[0] = Methode; errMsg = Nachrichtenformat.format(errMsg, errArgs); bzw. sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } } Die Anforderungsmethode wird durch das übergebene HttpRequest-Objekt bestimmt, und die aufzurufende Methode wird durch die Anforderungsmethode bestimmt ( wenn die Anforderungsmethode „Post“ ist, wird die Methode „doPost(HttpRequest req,HttpRestpone Res)“ aufgerufen ). Analyse des vierten Schritts: Basierend auf der obigen Analyse können wir Folgendes schlussfolgern: Tomcat erstellt ein Objekt, und wenn der Browser eine Anforderung stellt, ruft es die Methode Service(ServeltRequest req, ServletRespone res) des Servlets auf, und dann ruft diese Methode die überladene Methode Servlet(HttpServletReqeust req, HttpServletRespone res) in HttpServlet auf, und dann ruft diese Methode entsprechend der Anforderungsmethode selektiv die Methode doPost() oder doGet() auf ( natürlich gibt es noch viele andere Möglichkeiten, die hier nicht aufgeführt sind ). Daher besteht das Wesentliche der dritten Methode darin, dass, wenn der Browser eine Anforderung initiiert, die Methode Service(ServeltRequest req, ServletRespone res) in der Servlet-Schnittstelle aufgerufen wird und dann doPost() und andere Methoden indirekt über die Logik in der Implementierungsklasse aufgerufen werden. Vorteil: 1. Die entsprechende Anforderung kann über die Anforderungsmethode verarbeitet werden, wodurch die Logik klarer wird 2. Reduzieren Sie die Codemenge, um das Programm übersichtlicher zu gestalten 3. Machen Sie die Anfrage oder Antwort bedienbarer 4 … IV. Zusammenfassung: Hinweis: Der Browser muss eine Anforderung initiieren, um die Servicemethode des Servlets aufzurufen. Dies ist das Ende dieses Artikels über ein vertieftes Verständnis der Implementierung der Servlet-Erstellung in Tomcat. Weitere relevante Inhalte zur Tomcat-Servlet-Erstellung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Warum brauchen wir Map, wenn wir in JavaScript bereits Object haben?
>>: Detaillierte Erklärung zur Verbindung mit einer MySQL-Datenbank mit Java in IntelliJ IDEA
Inhaltsverzeichnis Erstellen Sie ein Vite-Projekt...
Egal wie großartig Ihre persönliche Website ist, ...
Das Problem beim Zurücksetzen des Passworts für d...
Lösung Verzichten Sie auf die Linux-VM, die mit D...
Um einen String in ein Array aufzuteilen, müssen ...
Grundlegende Netzwerkkonfiguration Obwohl Docker ...
Nginx Rewrite-Nutzungsszenarien 1. Sprung der URL...
HTML5 und jQuery implementieren die Vorschau loka...
Der spezifische Code lautet wie folgt: <!DOCTY...
Installieren Sie zuerst postcss-pxtorem: npm inst...
Vorwort: Frontend: jq+h5, um den dynamischen Neun...
Als ich heute einen Docker-Container erstellt hab...
Es gibt zwei Versionen der MySQL-Datenbankverwalt...
VMware-Vorbereitung CentOS-Vorbereitung, hier ist...
Vorwort Komponenten sind etwas, das wir sehr häuf...