méthode init()

Et quelques autres petites choses utiles. Bien sûr, je parle de l'initialisation des servlets. Comme vous le savez déjà, une fois que le serveur Web a créé l'objet servlet et l'a placé dans le conteneur, il appelle la méthode init() de la servlet . Vous pouvez remplacer cette méthode et initialiser tout ce dont vous avez besoin.

Pourquoi ne pas utiliser un constructeur ?

Parce que le processus de création d'un servlet ressemble à ceci :

  • Nous créons un objet hérité deHttpServlet
  • Créer un objetServletContext, ajoutez sa variable de servlet
  • Créer un objetServletConfig, ajoutez sa variable de servlet
  • Le serveur Web attache le servlet au conteneur
  • Appel de la méthode init()

Dans le constructeur de votre servlet, beaucoup de ses variables internes ne sont toujours pas initialisées. Le conteneur ne sait rien de votre servlet, votre servlet ne sait rien de son contexte. Je pense que tout est clair ici.

Écrivons une servlet qui, une fois initialisée, trouve un fichier de propriétés avec des paramètres :

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

Ici, nous créons un objetPropriétéset chargez -y les données du fichier config.properties . Eh bien, à l'avenir, vous pourrez sortir de l'objetPropriétésdiverses options telles que les données pour accéder à la base de données, par exemple.

Comment charger correctement le fichier de propriétés

Au fait, que se passe-t-il si votre servlet ne s'exécute pas sur votre ordinateur ?

Disons qu'ils l'ont écrit ici et qu'il tourne sur un serveur quelque part dans une autre partie du monde. Ou plusieurs serveurs. Comment charger correctement le fichier de propriétés dans ce cas ?

Bonne question. Normalement, lors de son exécution, une servlet ne connaît que le chemin relatif de ses fichiers de propriétés, pas son chemin absolu, car les fichiers war de servlet peuvent être stockés n'importe où.

Donc, nous devons trouver le chemin où notre servlet est stocké (le servlet est déjà initialisé) et lui ajouter un chemin relatif :)

Cela ressemble à ceci :

String path = absoluteServletParh + "relative path";

Et, comme toujours, une tâche aussi élémentaire a souvent son petit « mais ». Votre servlet et son fichier de propriétés sont stockés dans l'archive :) Pas nécessairement, bien sûr, mais ça arrive. Le fichier de propriétés est souvent stocké dans des fichiers jar ou war.

Autrement dit, votre fichier peut ne pas avoir de chemin physique sur le disque. Mais comme le conteneur a pu charger votre servlet, il pourra très probablement également charger votre fichier de propriétés.

Pour ce faire, vous devez obtenir l'objet chargeur de classe (Chargeur de classe) et demandez-lui de télécharger votre fichier. Voici à quoi cela ressemblera :

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

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

Méthode getConfig()

À propos, tous les paramètres ne peuvent pas être passés au servlet dans les fichiers de propriétés. Par exemple, votre servlet interagit avec d'autres servlets dans une application Web distribuée.

Ensuite, vous devez vous assurer que le conteneur transmet toutes les informations nécessaires à votre servlet lorsqu'il appelle sa méthode init() . De plus, il fait exactement cela.

Votre servlet (rappelez-vous qu'il est hérité de la classe HttpServlet ) a une méthode getServletConfig() . qui retourne un objetServletConfig, créé et initialisé par le conteneur. Cet objet a les méthodes suivantes :

getInitParameterNames() Renvoie une liste de noms de paramètres de servlet
getInitParameter (nom de la chaîne) Renvoie un paramètre de servlet par son nom
getServletName() Renvoie le nom de la servlet
getServletContext() Retourne un objetServletContext

Écrivons une servlet qui renvoie une liste de ses paramètres à partir deServletConfig'UN. Les y mettre se fera via le fichier 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>

Une servlet peut obtenir ses paramètres en utilisant le 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));
    	}
  }
}