Tiefgreifendes Verständnis der Erstellung und Implementierung von Servlets in Tomcat

Tiefgreifendes Verständnis der Erstellung und Implementierung von Servlets in Tomcat

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.
Einfach ausgedrückt : Eine von unseren Entwicklern geschriebene Klasse muss die Kernspezifikation von JavaEE direkt oder indirekt implementieren, d. h. die Servlet-Schnittstelle implementieren. Da die von dieser Klasse generierten Objekte vom Browser aufgerufen werden können, wird sie als Servlet bezeichnet, und JavaEE legt fest, dass nur von der Servlet-Implementierungsklasse generierte Objekte vom Browser aufgerufen werden können, d. h. Servlet. (Das heißt, diese Klasse muss die Servlet-Schnittstelle direkt oder indirekt implementieren.)

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?
Die erste Frage lautet: Da es sich um eine Servlet-Klasse handelt, ist es für unsere Entwickler offensichtlich nicht sinnvoll, das Objekt manuell zu erstellen. Daher wird die Erstellung dieses Objekts an Tomcat übergeben. Unsere Entwickler müssen Tomcat nur anweisen , es zu erstellen, und es jederzeit erstellen lassen.
Wie erkennt man das?

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:
1. servlet-name: Der Name des Servlets. Bitte beachten Sie, dass er dem Namen entsprechen muss, den Sie in der Zuordnung unten festgelegt haben.
2. serlvet-class: der vollqualifizierte Name von serlvet
3. load-on-startup: Gibt an, ob beim Start von Tomcat ein Servlet-Objekt erstellt werden soll. Übergeben Sie eine Ganzzahl größer als 0'' ( standardmäßig wird ein Servlet-Objekt erstellt, wenn der Browser es zum ersten Mal anfordert ).
4. Servlet-Mapping: Wie der Name schon sagt, legen Sie das Browser-Zugriffsmapping fest
5. Servlet-Name: entspricht dem oben genannten
6. URL-Muster: Browser-Zugriffszuordnung (vorausgesetzt, die Standardeinstellung ist die lokale Maschine und die Portnummer von Tomcat ist 8080, dann lautet der Pfad für den Browser zum Zugriff auf dieses Servlet: localhost:8080/Projektname/FirstWay )
Nachdem wir diese Grundlagen gelegt haben, wollen wir einen Blick darauf werfen;

Schritt 1: Tomcat starten

Bildbeschreibung hier einfügen

Tomcat startet normal

Schritt 2: Zugriff über den Browser (wir greifen hier 3x manuell zu)

Bildbeschreibung hier einfügen

Der Browserzugriff ist normal

Schritt 3: Beobachten Sie die Konsole

Bildbeschreibung hier einfügen

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.
Hinweis: ( Sobald Sie Tomcat mithilfe von Anmerkungen anweisen, ein Objekt zu erstellen, können Sie nicht mehr auf das Servlet in web.xml zugreifen und es festlegen .)

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.
Im Vergleich zur ersten Methode: Entwickler müssen in einigen Schnittstellen keine unnötigen Methoden implementieren, können selektiv vorgehen und die Codemenge reduzieren. Es ist jedoch nicht so nützlich wie oben, es gibt nur vor, B zu sein

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?
Schauen wir uns den Quellcode weiter an. Der Quellcode ist die Wahrheit. <br /> Ich werde die Kernteile des Quellcodes unten auflisten. Freunde, die tiefere Einblicke benötigen, können direkt zum Quellcode gehen. Tomcat ist Open Source

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

Bildbeschreibung hier einfügen

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

Bildbeschreibung hier einfügen

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:
  • Die Lösung des MavenWeb-Projekts kann ideell kein Servlet erstellen
  • Detaillierte Erklärung der Lösung für das Problem, dass beim Rechtsklick auf die Ideendatei kein „Neues Servlet erstellen“ angezeigt wird
  • Detailliertes Tutorial zum Erstellen eines Maven-Projekt-Servlets in IDEA
  • IDEA erstellt ein Servlet und konfiguriert die Implementierung von web.xml
  • IntelliJ IDEA2020.2.2 erstellt Servlet-Methode und 404-Problem
  • myeclipse erstellt Servlet_PowerNode Java Academy
  • Wie erstelle ich ein Servlet-Projekt (Tomcat+Java) ohne Editor?

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

Artikel empfehlen

Vue3.0+vite2 implementiert dynamisches asynchrones Lazy Loading von Komponenten

Inhaltsverzeichnis Erstellen Sie ein Vite-Projekt...

Detaillierte Erklärung der Meta-Tags (die Rolle der Meta-Tags)

Egal wie großartig Ihre persönliche Website ist, ...

Über Zabbix Admin-Login vergessen Passwort zurücksetzen

Das Problem beim Zurücksetzen des Passworts für d...

Mysql teilt Zeichenfolge durch gespeicherte Prozedur in Array auf

Um einen String in ein Array aufzuteilen, müssen ...

Analyse der Nutzungsszenarien und Konfigurationsmethoden von Nginx Rewrite

Nginx Rewrite-Nutzungsszenarien 1. Sprung der URL...

Löschen von zwei Bildern mit derselben ID im Docker

Als ich heute einen Docker-Container erstellt hab...

So importieren, registrieren und verwenden Sie Komponenten in Stapeln in Vue

Vorwort Komponenten sind etwas, das wir sehr häuf...