init()-Methode

Und noch ein paar andere nützliche Kleinigkeiten. Natürlich spreche ich von der Servlet-Initialisierung. Wie Sie bereits wissen, ruft der Webserver die init()- Methode des Servlets auf, nachdem er das Servlet-Objekt erstellt und im Container platziert hat . Sie können diese Methode überschreiben und alles, was Sie darin benötigen, initialisieren.

Warum nicht einen Konstruktor verwenden?

Denn der Prozess zum Erstellen eines Servlets läuft in etwa so ab:

  • Wir erstellen ein geerbtes ObjektHttpServlet
  • Erstellen Sie ein ObjektServletContext, fügen Sie seine Servlet-Variable hinzu
  • Erstellen Sie ein ObjektServletConfig, fügen Sie seine Servlet-Variable hinzu
  • Der Webserver hängt das Servlet an den Container an
  • Aufruf der init()- Methode

Im Konstruktor Ihres Servlets sind viele seiner internen Variablen noch nicht initialisiert. Der Container weiß nichts über Ihr Servlet, Ihr Servlet weiß nichts über seinen Kontext. Ich denke, hier ist alles klar.

Schreiben wir ein Servlet, das bei der Initialisierung eine Eigenschaftendatei mit Einstellungen findet:

public class PropertiesServlet extends HttpServlet {
    public init() {
         try (InputStream input = new FileInputStream("c:/path/to/config.properties")) {

             Properties prop = new Properties();
             prop.load(input);

             String databaseURL = prop.getProperty("db.url");
             String databaseUser = prop.getProperty("db.user ");
             String databasePassword = prop.getProperty("db.password");
	 }
  }
}

Hier erstellen wir ein ObjektEigenschaftenund laden Sie Daten aus der Datei config.properties hinein . Nun, in Zukunft können Sie aus dem Objekt herauskommenEigenschaftenVerschiedene Optionen wie Daten, um auf die Datenbank zuzugreifen, z.

So laden Sie die Eigenschaftendatei richtig

Was passiert übrigens, wenn Ihr Servlet nicht auf Ihrem Computer läuft?

Nehmen wir an, sie haben es hier geschrieben und es läuft auf einem Server irgendwo in einem anderen Teil der Welt. Oder mehrere Server. Wie lade ich in diesem Fall die Eigenschaftendatei richtig?

Gute Frage. Normalerweise kennt ein Servlet beim Ausführen nur den relativen Pfad seiner Eigenschaftendateien, nicht seinen absoluten Pfad, da Servlet-War-Dateien überall gespeichert werden können.

Wir müssen also den Pfad herausfinden, in dem unser Servlet gespeichert ist (das Servlet ist bereits initialisiert) und einen relativen Pfad hinzufügen :)

Es sieht ungefähr so ​​aus:

String path = absoluteServletParh + "relative path";

Und wie immer hat eine solch elementare Aufgabe oft ihr eigenes kleines „Aber“. Ihr Servlet und seine Eigenschaftendatei werden im Archiv gespeichert :) Natürlich nicht unbedingt, aber es kommt vor. Die Eigenschaftendatei wird häufig in JAR- oder WAR-Dateien gespeichert.

Das heißt, Ihre Datei verfügt möglicherweise nicht über einen physischen Pfad auf der Festplatte. Da der Container jedoch Ihr Servlet laden konnte, wird er höchstwahrscheinlich auch Ihre Eigenschaftendatei laden können.

Dazu müssen Sie das Klassenladeobjekt (ClassLoader) und bitten Sie ihn, Ihre Datei hochzuladen. So wird es aussehen:

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("/config.properties");

Properties prop = new Properties();
prop.load(stream);

getConfig()-Methode

Übrigens können nicht alle Parameter in Eigenschaftendateien an das Servlet übergeben werden. Beispielsweise interagiert Ihr Servlet mit anderen Servlets in einer verteilten Webanwendung.

Dann müssen Sie sicherstellen, dass der Container alle notwendigen Informationen an Ihr Servlet übergibt, wenn es seine init()- Methode aufruft . Darüber hinaus tut er genau das.

Ihr Servlet (denken Sie daran, dass es von der HttpServlet- Klasse geerbt wurde ) verfügt über eine getServletConfig()- Methode . was ein Objekt zurückgibtServletConfig, vom Container erstellt und initialisiert. Dieses Objekt verfügt über die folgenden Methoden:

getInitParameterNames() Gibt eine Liste von Servlet-Parameternamen zurück
getInitParameter(String-Name) Gibt einen Servlet-Parameter anhand seines Namens zurück
getServletName() Gibt den eigenen Namen des Servlets zurück
getServletContext() Gibt ein Objekt zurückServletContext

Schreiben wir ein Servlet, das eine Liste seiner Parameter zurückgibtServletConfig'A. Sie werden dort über die Datei web.xml abgelegt:

	<web-app> 
 	
        <servlet> 
            <servlet-name>Print-Servlet</servlet-name> 
            <servlet-class>PrintServlet</servlet-class> 
            <init-param> 
                <param-name>jdbc-driver</param-name> 
    	        <param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value> 
	        </init-param> 
        </servlet> 
  	
        <servlet-mapping> 
            <servlet-name>Print-Servlet</servlet-name> 
            <url-pattern>/print</url-pattern> 
        </servlet-mapping> 
  	
    </web-app>

Ein Servlet kann seine Parameter mit dem folgenden Code abrufen:

public class PrintServlet extends HttpServlet {
    public void init() {
        ServletConfig config = this.getServletConfig();
        Enumeration<String> initParameterNames = config.getInitParameterNames();

        while (initParameterNames.hasMoreElements()){
       	     String key = initParameterNames.nextElement();
             System.out.println("%s: %s\n", key, config.getInitParameter(key));
    	}
  }
}