metodo init()

E un paio di altre piccole cose utili. Ovviamente sto parlando dell'inizializzazione del servlet. Come già sapete, dopo che il server Web ha creato l'oggetto servlet e lo ha posizionato nel contenitore, chiama il metodo init() del servlet . Puoi sovrascrivere questo metodo e inizializzare tutto ciò di cui hai bisogno.

Perché non usare un costruttore?

Perché il processo di creazione di un servlet va in questo modo:

  • Creiamo un oggetto ereditato daHttpServlet
  • Crea un oggettoServletContesto, aggiungi la sua variabile servlet
  • Crea un oggettoServletConfig, aggiungi la sua variabile servlet
  • Il server Web collega il servlet al contenitore
  • Chiamare il metodo init()

Nel costruttore del tuo servlet, molte delle sue variabili interne non sono ancora inizializzate. Il contenitore non sa nulla del tuo servlet, il tuo servlet non sa nulla del suo contesto. Penso che qui sia tutto chiaro.

Scriviamo una servlet che, una volta inizializzata, trova un file delle proprietà con le impostazioni:

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

Qui creiamo un oggettoProprietàe caricare i dati dal file config.properties in esso . Bene, in futuro puoi uscire dall'oggettoProprietàvarie opzioni come i dati per accedere al database, ad es.

Come caricare correttamente il file delle proprietà

A proposito, cosa succede se il tuo servlet non è in esecuzione sul tuo computer?

Diciamo che l'hanno scritto qui e gira su un server da qualche parte in un'altra parte del mondo. O più server. Come caricare correttamente il file delle proprietà in questo caso?

Buona domanda. Normalmente, durante l'esecuzione, un servlet conosce solo il percorso relativo dei suoi file delle proprietà, non il suo percorso assoluto, poiché i file war del servlet possono essere archiviati ovunque.

Quindi, dobbiamo scoprire il percorso in cui è memorizzato il nostro servlet (il servlet è già inizializzato) e aggiungervi un percorso relativo :)

Assomiglia a questo:

String path = absoluteServletParh + "relative path";

E, come sempre, un compito così elementare ha spesso il suo piccolo "ma". Il tuo servlet e il suo file delle proprietà sono memorizzati all'interno dell'archivio :) Non necessariamente, ovviamente, ma succede. Il file delle proprietà è spesso memorizzato all'interno di file jar o war.

Cioè, il tuo file potrebbe non avere un percorso fisico sul disco. Ma poiché il contenitore è stato in grado di caricare il tuo servlet, molto probabilmente sarà in grado di caricare anche il tuo file delle proprietà.

Per fare ciò, è necessario ottenere l'oggetto caricatore di classi (ClassLoader) e chiedigli di caricare il tuo file. Ecco come sarà:

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

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

metodo getConfig()

A proposito, non tutti i parametri possono essere passati al servlet nei file delle proprietà. Ad esempio, il tuo servlet interagisce con altri servlet in un'applicazione Web distribuita.

Quindi devi assicurarti che il contenitore passi tutte le informazioni necessarie al tuo servlet quando chiama il suo metodo init() . Inoltre, fa proprio questo.

Il tuo servlet (ricorda che è ereditato dalla classe HttpServlet ) ha un metodo getServletConfig() . che restituisce un oggettoServletConfig, creato e inizializzato dal contenitore. Questo oggetto ha i seguenti metodi:

getInitParameterNames() Restituisce un elenco di nomi di parametri servlet
getInitParameter(Nome stringa) Restituisce un parametro servlet in base al suo nome
getNomeservlet() Restituisce il nome del servlet
getServletContext() Restituisce un oggettoServletContesto

Scriviamo un servlet che restituisce un elenco dei suoi parametri fromServletConfig'UN. Metterli lì sarà attraverso il file web.xml:

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

Un servlet può ottenere i suoi parametri usando il codice:

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