método init()

Y un par de otras pequeñas cosas útiles. Por supuesto, estoy hablando de la inicialización del servlet. Como ya sabe, después de que el servidor web haya creado el objeto servlet y lo haya colocado en el contenedor, llama al método init() del servlet . Puede anular este método e inicializar lo que necesite en él.

¿Por qué no usar un constructor?

Porque el proceso de creación de un servlet es algo así:

  • Creamos un objeto heredado deHttpServlet
  • Crear un objetoServletContext, agregue su variable de servlet
  • Crear un objetoServletConfig, agregue su variable de servlet
  • El servidor web adjunta el servlet al contenedor
  • Llamando al método init()

En el constructor de su servlet, muchas de sus variables internas aún no están inicializadas. El contenedor no sabe nada sobre su servlet, su servlet no sabe nada sobre su contexto. Creo que todo está claro aquí.

Escribamos un servlet que, cuando se inicialice, encuentre un archivo de propiedades con configuraciones:

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

Aquí creamos un objeto.Propiedadesy cargue datos del archivo config.properties en él . Bueno, en el futuro puedes salir del objeto.Propiedadesvarias opciones como datos para acceder a la base de datos, por ejemplo.

Cómo cargar el archivo de propiedades correctamente

Por cierto, ¿qué sucede si su servlet no se está ejecutando en su computadora?

Digamos que lo escribieron aquí y se ejecuta en un servidor en algún lugar de otra parte del mundo. O varios servidores. ¿Cómo cargar correctamente el archivo de propiedades en este caso?

Buena pregunta. Normalmente, cuando se ejecuta, un servlet solo conoce la ruta relativa de sus archivos de propiedades, no su ruta absoluta, porque los archivos war del servlet se pueden almacenar en cualquier lugar.

Entonces, necesitamos encontrar la ruta donde se almacena nuestro servlet (el servlet ya está inicializado) y agregarle una ruta relativa :)

Se ve algo como esto:

String path = absoluteServletPath + "relative path";

Y, como siempre, una tarea tan elemental a menudo tiene su pequeño "pero". Su servlet y su archivo de propiedades se almacenan dentro del archivo :) No necesariamente, por supuesto, pero sucede. El archivo de propiedades a menudo se almacena dentro de archivos jar o war.

Es decir, es posible que su archivo no tenga una ruta física en el disco. Pero dado que el contenedor pudo cargar su servlet, lo más probable es que también pueda cargar su archivo de propiedades.

Para hacer esto, necesita obtener el objeto del cargador de clases (ClassLoader) y pídele que cargue tu archivo. Así es como se verá:

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

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

Método getConfig()

Por cierto, no todos los parámetros se pueden pasar al servlet en los archivos de propiedades. Por ejemplo, su servlet interactúa con otros servlets en una aplicación web distribuida.

Luego, debe asegurarse de que el contenedor pase toda la información necesaria a su servlet cuando llame a su método init() . Además, él hace precisamente eso.

Su servlet (recuerde que se hereda de la clase HttpServlet ) tiene un método getServletConfig() . que devuelve un objetoServletConfig, creado e inicializado por el contenedor. Este objeto tiene los siguientes métodos:

getInitParameterNames() Devuelve una lista de nombres de parámetros de servlet.
getInitParameter(nombre de cadena) Devuelve un parámetro de servlet por su nombre
getServletName() Devuelve el nombre propio del servlet.
getServletContext() Devuelve un objetoServletContext

Escribamos un servlet que devuelva una lista de sus parámetros deServletConfig'A. Ponerlos allí será a través del archivo 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 puede obtener sus parámetros usando el código:

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