init()-metoden

Og et par andre nyttige småting. Selvfølgelig snakker jeg om servlet-initialisering. Som du allerede vet, etter at webserveren har opprettet servlet-objektet og plassert det i beholderen, kaller den servletens init()- metode . Du kan overstyre denne metoden og initialisere det du trenger i den.

Hvorfor ikke bruke en konstruktør?

Fordi prosessen med å lage en servlet går omtrent slik:

  • Vi lager et objekt arvet fraHttpServlet
  • Lag et objektServletContext, legg til servletvariabelen
  • Lag et objektServletConfig, legg til servletvariabelen
  • Webserveren kobler servlet til container
  • Kaller init()- metoden

I konstruktøren til servleten din er mange av dens interne variabler fortsatt ikke initialisert. Beholderen vet ingenting om servleten din, servletten vet ingenting om konteksten. Jeg tror alt er klart her.

La oss skrive en servlet som, når den er initialisert, finner en egenskapsfil med innstillinger:

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

Her lager vi et objektEgenskaperog last inn data fra config.properties -filen inn i den . Vel, i fremtiden kan du komme deg ut av objektetEgenskaperulike alternativer som data for å få tilgang til databasen, f.eks.

Slik laster du egenskapsfilen riktig

Forresten, hva om servleten din ikke kjører på datamaskinen din?

La oss si at de skrev det her, og det kjører på en server et sted i en annen del av verden. Eller flere servere. Hvordan laster jeg egenskapsfilen riktig i dette tilfellet?

Godt spørsmål. Normalt, når en servlet kjører, kjenner den bare den relative banen til egenskapsfilene, ikke dens absolutte bane, fordi servlet war-filer kan lagres hvor som helst.

Så vi må finne ut banen der servleten vår er lagret (servletten er allerede initialisert) og legge til en relativ bane til den :)

Det ser omtrent slik ut:

String path = absoluteServletParh + "relative path";

Og som alltid har en slik elementær oppgave ofte sitt eget lille "men". Servleten din og dens egenskapsfil er lagret inne i arkivet :) Ikke nødvendigvis, selvfølgelig, men det skjer. egenskapsfilen er ofte lagret i jar- eller war-filer.

Det vil si at filen din kanskje ikke har en fysisk bane på disken. Men siden containeren var i stand til å laste servleten din, vil den mest sannsynlig også kunne laste inn egenskapsfilen din.

For å gjøre dette, må du hente klasselasterobjektet (ClassLoader) og be ham laste opp filen din. Slik vil det se ut:

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

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

getConfig()-metoden

Forresten, ikke alle parametere kan sendes til servleten i egenskapsfiler. For eksempel kommuniserer servleten din med andre servlets i en distribuert nettapplikasjon.

Deretter må du sørge for at containeren sender all nødvendig informasjon til servleten din når den kaller init()- metoden . Dessuten gjør han nettopp det.

Servleten din (husk at den er arvet fra HttpServlet -klassen ) har en getServletConfig() -metode . som returnerer et objektServletConfig, opprettet og initialisert av beholderen. Dette objektet har følgende metoder:

getInitParameterNames() Returnerer en liste over servlet-parameternavn
getInitParameter(strengnavn) Returnerer en servlet-parameter etter navnet
getServletName() Returnerer servletens eget navn
getServletContext() Returnerer et objektServletContext

La oss skrive en servlet som returnerer en liste over parameterne fraServletConfig'EN. Hvis du legger dem der, vil du gå gjennom web.xml-filen:

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

En servlet kan få sine parametere ved å bruke koden:

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