init() metode

Og et par andre nyttige småting. Jeg taler selvfølgelig om servlet-initialisering. Som du allerede ved, efter at webserveren har oprettet servlet-objektet og placeret det i containeren, kalder den servletens init()- metode . Du kan tilsidesætte denne metode og initialisere, hvad du har brug for i den.

Hvorfor ikke bruge en konstruktør?

Fordi processen med at oprette en servlet foregår sådan her:

  • Vi skaber et objekt, der er arvet fraHttpServlet
  • Opret et objektServletContext, tilføj dens servlet-variabel
  • Opret et objektServletConfig, tilføj dens servlet-variabel
  • Webserveren vedhæfter servlet til container
  • Kalder init() metoden

I din servlets konstruktør er mange af dens interne variabler stadig ikke initialiseret. Containeren ved intet om din servlet, din servlet ved intet om dens kontekst. Jeg tror, ​​at alt er klart her.

Lad os skrive en servlet, der, når den er initialiseret, finder en egenskabsfil med indstillinger:

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 skaber vi et objektEjendommeog indlæs data fra filen config.properties ind i den . Nå, i fremtiden kan du komme ud af objektetEjendommeforskellige muligheder såsom data for at få adgang til databasen, f.eks.

Sådan indlæses egenskabsfilen korrekt

Hvad nu hvis din servlet ikke kører på din computer?

Lad os sige, at de skrev det her, og det kører på en server et sted i en anden del af verden. Eller flere servere. Hvordan indlæses egenskabsfilen korrekt i dette tilfælde?

Godt spørgsmål. Normalt, når en servlet kører, kender den kun den relative sti til dens egenskabsfiler, ikke dens absolutte sti, fordi servlet war-filer kan gemmes hvor som helst.

Så vi skal finde ud af stien, hvor vores servlet er gemt (servleten er allerede initialiseret) og tilføje en relativ sti til den :)

Det ser sådan ud:

String path = absoluteServletParh + "relative path";

Og som altid har sådan en elementær opgave ofte sit eget lille "men". Din servlet og dens egenskabsfil er gemt inde i arkivet :) Ikke nødvendigvis, selvfølgelig, men det sker. egenskabsfilen er ofte gemt i jar- eller war-filer.

Det vil sige, at din fil muligvis ikke har en fysisk sti på disken. Men da containeren var i stand til at indlæse din servlet, vil den højst sandsynligt også kunne indlæse din egenskabsfil.

For at gøre dette skal du hente klasseindlæserobjektet (ClassLoader) og bed ham om at uploade din fil. Sådan kommer det til at se ud:

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

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

getConfig() metode

Forresten kan ikke alle parametre overføres til servlet'en i egenskabsfiler. For eksempel kommunikerer din servlet med andre servlets i en distribueret webapplikation.

Så skal du sikre dig, at containeren sender alle de nødvendige oplysninger til din servlet, når den kalder sin init()- metode . Desuden gør han netop det.

Din servlet (husk at den er nedarvet fra klassen HttpServlet ) har en getServletConfig() metode . som returnerer et objektServletConfig, oprettet og initialiseret af containeren. Dette objekt har følgende metoder:

getInitParameterNames() Returnerer en liste over servlet-parameternavne
getInitParameter(strengnavn) Returnerer en servlet-parameter ved dens navn
getServletName() Returnerer servlettens eget navn
getServletContext() Returnerer et objektServletContext

Lad os skrive en servlet, der returnerer en liste over dens parametre fraServletConfig'EN. Hvis du sætter dem der, vil det være gennem 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 parametre ved hjælp af 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));
    	}
  }
}