init() methode

En een paar andere handige kleine dingen. Ik heb het natuurlijk over servlet-initialisatie. Zoals u al weet, roept de webserver, nadat hij het servletobject heeft gemaakt en in de container heeft geplaatst, de methode init() van de servlet aan . U kunt deze methode overschrijven en alles initialiseren wat u nodig hebt.

Waarom geen constructeur gebruiken?

Omdat het proces van het maken van een servlet ongeveer zo gaat:

  • We maken een object geërfd vanHttpServlet
  • Maak een voorwerpServletContext, voeg de servletvariabele toe
  • Maak een voorwerpServletconfiguratie, voeg de servletvariabele toe
  • Webserver koppelt servlet aan container
  • De methode init() aanroepen

In de constructor van uw servlet zijn veel van zijn interne variabelen nog steeds niet geïnitialiseerd. De container weet niets van uw servlet, uw servlet weet niets van zijn context. Ik denk dat alles hier duidelijk is.

Laten we een servlet schrijven die, wanneer geïnitialiseerd, een eigenschappenbestand met instellingen vindt:

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 maken we een objectEigenschappenen laad er gegevens uit het bestand config.properties in . Nou, in de toekomst kun je uit het object komenEigenschappenverschillende opties zoals gegevens om toegang te krijgen tot de database, bijv.

Hoe het eigenschappenbestand correct te laden

Trouwens, wat als uw servlet niet draait op uw computer?

Laten we zeggen dat ze het hier hebben geschreven en dat het op een server ergens in een ander deel van de wereld draait. Of meerdere servers. Hoe laad ik het eigenschappenbestand in dit geval correct?

Goede vraag. Normaal kent een servlet tijdens het draaien alleen het relatieve pad van zijn eigenschappenbestanden, niet het absolute pad, omdat servlet war-bestanden overal kunnen worden opgeslagen.

We moeten dus het pad vinden waar onze servlet is opgeslagen (de servlet is al geïnitialiseerd) en er een relatief pad aan toevoegen :)

Het ziet er ongeveer zo uit:

String path = absoluteServletParh + "relative path";

En zoals altijd heeft zo'n elementaire taak vaak zijn eigen "maar". Uw servlet en het bijbehorende eigenschappenbestand worden in het archief opgeslagen :) Niet noodzakelijkerwijs natuurlijk, maar het gebeurt. properties-bestand wordt vaak opgeslagen in jar- of war-bestanden.

Dat wil zeggen, uw bestand heeft mogelijk geen fysiek pad op de schijf. Maar aangezien de container uw servlet kon laden, zal hij waarschijnlijk ook uw eigenschappenbestand kunnen laden.

Om dit te doen, moet u het class loader-object (ClassLoader) en vraag hem om je bestand te uploaden. Dit is hoe het eruit zal zien:

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

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

getConfig()-methode

Overigens kunnen niet alle parameters worden doorgegeven aan de servlet in eigenschappenbestanden. Uw servlet communiceert bijvoorbeeld met andere servlets in een gedistribueerde webtoepassing.

Vervolgens moet u ervoor zorgen dat de container alle benodigde informatie doorgeeft aan uw servlet wanneer deze zijn methode init() aanroept . Bovendien doet hij dat gewoon.

Uw servlet (vergeet niet dat deze is geërfd van de klasse HttpServlet ) heeft een methode getServletConfig() . die een object retourneertServletconfiguratie, gemaakt en geïnitialiseerd door de container. Dit object heeft de volgende methoden:

getInitParameterNames() Retourneert een lijst met namen van servletparameters
getInitParameter(Stringnaam) Retourneert een servletparameter op naam
getServletNaam() Retourneert de eigen naam van de servlet
getServletContext() Retourneert een objectServletContext

Laten we een servlet schrijven die een lijst met zijn parameters retourneertServletconfiguratie'A. Als u ze daar plaatst, gaat dit via het web.xml-bestand:

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

Een servlet kan zijn parameters ophalen met behulp van de code:

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));
    	}
  }
}