1. Servlet -Überblick
1. Dynamische Webressourcenentwicklungstechnologie von Sun Company. Die Essenz ist das vorherige Java -Applet, für das dieses Applet die Servlet -Schnittstelle implementiert muss, damit der Server sie aufrufen kann.
2. Zwei Schritte zur Entwicklung eines Servlets
*Experiment: Kurzer Beginn des Servlets
(1) Schritt 1: Schreiben Sie ein Java -Programm, um die Servlet -Schnittstelle zu implementieren (hier erbt direkt die Standard -Implementierungsklasse GenericServlet))
Paket cn.itheima; import Java.io.*; Import Javax.Servlet.
(2) Zusätzlich zum Einstellen der zusammengestellten .klasse mit Paketen unter Web-Inf/Klassen müssen Sie auch den Web.xml-Registrierungsservlet der Webanwendung konfigurieren.
<servlet> <servlet-name> firstServlet </Servlet-name> <Servlet-Class> cn.itheima.FirstServlet </Servlet-Class> </Servlet> <Servlet-Mapping> <Servlet-name> FirstServlet </servlet-name> <URL-PATTERN>/FirstServlet </url-patter>
3.. Entwickeln Sie Servlets mit MyeClipse
2. detaillierte Beschreibung des Servlets
1. Lebenszyklus: Wenn etwas geboren und stirbt, was es während seiner Existenz unweigerlich tun wird. Zusammenzusetzen ist der Erklärungszyklus der Sache.
2. Servlet Life Cycle: Wenn das Servlet zum ersten Mal zugegriffen wird, wird im Speicher ein Objekt erstellt, und die Init () -Methode wird unmittelbar nach der Erstellung aufgerufen, um zu initialisieren. Für jede Anfrage wird die Methode des Dienstes (REQ, Resp.) Verwendet, um die Anforderung zu verarbeiten. Zu diesem Zeitpunkt werden die Anforderungsinformationen mit dem Anforderungsobjekt eingekapselt, und das Antwortobjekt (ursprünglich leer) repräsentiert die Antwortmeldung, die zur Verwendung in die Dienstmethode übergeben wird. Wenn die Servicemethode verarbeitet wird, organisiert der Rückgabeserver eine Antwortmeldung, die basierend auf den Informationen in der Antwort an den Browser zurückgegeben werden soll. Das Servlet wird nicht zerstört, nachdem die Antwort abgeschlossen ist und im Speicher bleibt und auf die nächste Anfrage wartet. Bis der Server geschlossen ist oder die Webanwendung aus dem virtuellen Host entfernt wird, wird das Servlet -Objekt zerstört und die Methode Destroy () wird aufgerufen, bevor es zerstört wird, um danach etwas zu tun.
3. Vererbungsstruktur der Servlet -Schnittstelle
Servlet -Schnittstelle: Definiert die Methode, die ein Servlet haben sollte, und alle Servlets sollten diese Schnittstelle direkt oder indirekt implementieren.
|
|.
|
| ----- httpServlet: Ein für das HTTP-Protokoll optimiertes Servlet wird von der GenericServlet-Klasse geerbt, und die Service-Abstract-Methode wird implementiert. Die Standardimplementierung bestimmt die Anforderungsmethode der Anforderung und ruft verschiedene Doxxx () -Methoden gemäß den verschiedenen Anforderungsmethoden auf. Normalerweise können wir httpServlet direkt erben
V.
4.1 Registrieren Sie ein Servlet mit dem <Servlet> <Servlet-Mapping> Tag
<servlet> <servlet-name> firstServlet </servlet-name> <Servlet-Klasse> cn.itheima.Firstservlet </Servlet-Klasse>
HINWEIS: Was Sie hier wollen, ist der vollständige Klassenname eines Servlets, nicht der Dateipfad, der .Java- oder .class -Erweiterungen enthält
</servlet> <Servlet-Mapping> <Servlet-name> FirstServlet </servlet-name> <URL-Pattern>/FirstServlet </url-pattern> </Servlet-Mapping>
4.2 Ein <servlet> kann mehreren <Servlet-Mapping> entsprechen
4.3 Sie können das *Übereinstimmungszeichen verwenden, um <Serlvet-Mapping> zu konfigurieren, aber achten Sie darauf, dass es sich um einen Pfad handelt, der mit *.do oder / / / *endet.
~ Aufgrund der Einführung von Match-Zeichen ist es möglich, dass ein virtueller Pfad mehreren Servlet-Mappings entspricht. Zu diesem Zeitpunkt ähnelt man am ähnlichsten, nach dem Servlet sucht, und der *.do -Level ist der niedrigste.
4.4 Sie können das Sub-Label <Load-on-Startups für <Servlet> konfigurieren und angeben, dass das Servlet mit dem Server-Start geladen wird, und die konfigurierten Werte geben die Reihenfolge des Starts an
Servlet> <Servlet-Name> Invoker </Servlet-name> <Servlet-Class> org.apache.catalina.servlets.InvokerServlet </Servlet-Class> <Load-on-Startups> 2 </load-on-Startup> </Servlet>
4.5 Standard -Servlet: Wenn der externe Zugriffspfad eines Servlets auf /festgelegt ist, ist das Servlet ein Standard -Servlet, und andere Servlets bearbeiten keine Anfragen.
~ Das Standard -Servlet ist in conf/web.xml konfiguriert, und der Zugriff auf statische Ressourcen und die Ausgabe von Fehlerseiten werden von diesem Standard -Servlet behandelt. Wenn wir selbst einen Standard -Servlet schreiben, um das Standard -Servlet in Papas web.xml zu überschreiben, werden die statischen Webressourcen unzugänglich sein. Daher wird die Konfiguration nicht empfohlen.
4.6 Sicherheitsprobleme des Servlets Thread
4.6.1 Da ein Servlet normalerweise nur eine Instanz im Speicher hat, um die Anforderung zu verarbeiten, wenn mehrere Anforderungen gesendet werden, betreiben mehrere Threads das Servlet -Objekt, was zu Sicherheitsproblemen von Threads führen kann.
(1) Möglicherweise gibt es Probleme mit der Sicherheit von Threads mit Servlvet -Mitgliedsvariablen
*Experiment: Definieren Sie eine Mitgliedsvariable inti = 0; Führen Sie den I ++ - Betrieb in der Methode und in der Ausgabe des Clients aus. Zu diesem Zeitpunkt können Probleme bei der Sicherheit von Threads aufgrund einer Verzögerung verursacht werden.
(2) Wenn Servet Ressourcendateien betreibt, betreiben mehrere Threads dieselbe Datei und verursachen Probleme mit der Sicherheit von Threads
*Experiment: Die Anforderung wird mit einem Parameter geliefert, das Servlet schreibt den Anforderungsparameter in eine Datei, liest dann die Datei und druckt den Lesewert für den Client. Es kann zu Sicherheitsproblemen von Threads kommen
4.6.2 Lösung
(1) Verwenden Sie Synchroncodeblöcke, um das Problem zu lösen. Der Nachteil ist, dass der Synchroncode -Block nur eine Anforderung gleichzeitig bearbeiten kann, was sehr ineffizient ist. Daher muss der Synchroncode -Block nur einen Kerncode enthalten, der Probleme mit der Sicherheit von Threads verursacht.
(2) Implementieren Sie die SingleTheadModel -Schnittstelle für diesen Servlet. Dies ist eine Tag -Schnittstelle. Das markierte Servlet speichert einen Servlet -Pool im Speicher. Wenn ein Thread kommt und es keine Servlet -Objektverarbeitung im Pool gibt, wird ein neuer erstellt. Wenn sich im Pool kostenlose Servlets befinden, verwenden Sie sie direkt. Dies löst nicht wirklich Probleme mit Thread -Sicherheit. Diese Schnittstelle wurde aufgegeben.
(3) Beide Lösungen sind nicht perfekt. Versuchen Sie also, keine Mitgliedsvariablen im Servlet zu erscheinen.
3.. ServletConfig
1. Objekte, die die Konfiguration von Servlets darstellen, die in <Servlet> in web.xml konfiguriert werden können
<servlet> <servlet-name> Demo5Servlet </servlet-name> <servlet-classe> cn.itheima.demo5Servlet </servlet-classe> <init-param> <param-name> data1 </param-name> <param-value> value1 </param-value> </init-param> </servlet> </servlet>
Verwenden Sie dies dann im Servlet, um das ServletConfig -Objekt zu erhalten. Dieses Objekt bietet GetInitParameter () und GetInitParameternames () -Methoden, die die Konfigurationselemente in der Konfiguration durchqueren können.
Wenn Sie nicht tote Inhalte in das Servlet schreiben möchten, können Sie es hier konfigurieren.
4. ServletContext
1. Das Objekt, das die aktuelle Webanwendung darstellt.
2. Als Domänenobjekt werden Daten zwischen verschiedenen Servlets übertragen, und der Umfang ist die gesamte Webanwendung.
Lebenszyklus: Erstellen Sie ein ServletContext -Objekt, das die gesamte Webanwendung darstellt, wenn die Webanwendung in den Container geladen wird. Wenn der Server geschlossen ist oder die Webanwendung aus dem Container entfernt wird, wird das ServletContext -Objekt zerstört.
~ Domäne: Eine Domäne wird als Box verstanden, in dem Daten platziert werden können. Da eine Domain als Domain bezeichnet wird, hat sie eine sichtbare Reichweite. Die Daten in dieser Domäne können in diesem Bereich betrieben werden. Ein solches Objekt wird als Domänenobjekt bezeichnet.
3. In web.xml können Sie die Initialisierungsparameter der gesamten Webanwendung konfigurieren und den ServletContext verwenden, um zu erhalten
<Context-Param> <param-name> param1 </param-name> <param-value> pValue1 </param-value> </context-param> this.getServletContext (). getInitParameter ("param1") this.getServletContext ().4. Weiterleiten zwischen verschiedenen Servlets
this.getServletContext (). getRequestDispatcher ("/servlet/Demo10Servlet"). Forward (Anfrage, Antwort);Nach Abschluss der Methodenausführung kehrt der Dienst zum Server zurück, und der Server ruft das Ziel -Servlet auf, wobei die Anforderung neu erstellt wird und die Daten der vorherigen Anfrage in sie kopiert werden.
5. Ressourcendateien lesen
5.1 Da der relative Pfad das von der Java Virtual Machine gesteuerte Verzeichnis standardmäßig gestartet wird, werden wir den relativen Pfad direkt zum Tomcat/Bin -Verzeichnis direkt schreiben, sodass wir die Ressourcen nicht erhalten können. Wenn der absolute Weg als absoluter Weg geschrieben wird, ist er falsch, wenn das Projekt in einer anderen Umgebung veröffentlicht wird.
5.2 Um dieses Problem zu lösen, bietet ServletContext dies.getServletContext (). GetRealPath ("/1.Properties"), der einen virtuellen Weg zur Ressource gibt und den realen Weg der Ressource in der aktuellen Umgebung zurückgibt. this.getServletContext (). getResourceAsStream ("/1.Properties"), der den virtuellen Pfad einer Ressource zum Strom des realen Pfadweges der Ressource zurückgibt.
5.3 Beim Erhalten von Ressourcendateien unter Nichtdiensten wird kein ServletContext-Objekt verwendet, und zu diesem Zeitpunkt können nur Klassenlader verwendet werden.
classloader.getResourceasStream ("../../ 1.Properties"), in dieser Methode wird der Klassenloader verwendet, um Ressourcen direkt in den Speicher zu laden, was Probleme mit der Aktualisierung von Verzögerungen hat. Wenn die Datei zu groß ist, nimmt sie zu viel Speicher ein.
classloader.getResource ("../ 1.properties"). getPath () gibt direkt den realen Pfad der Ressource zurück, ohne das Problem der Update -Verzögerung.
Zusammenfassen
Das oben genannte ist der Inhalt dieses Artikels über kurz über die technische Grundlage der Servletentwicklung, und ich hoffe, dass dies für alle hilfreich sein wird. Interessierte Freunde können weiterhin auf diese Seite verweisen:
Grundlegende Analyse der Servlet -Sitzungstechnologie
Wenn es auf dieser Website auch andere verwandte Themen gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!