método init()

E algumas outras coisinhas úteis. Claro, estou falando sobre a inicialização do servlet. Como você já sabe, depois que o servidor web cria o objeto servlet e o coloca no contêiner, ele chama o método init() do servlet . Você pode sobrescrever esse método e inicializar o que precisar nele.

Por que não usar um construtor?

Porque o processo de criação de um servlet é mais ou menos assim:

  • Criamos um objeto herdado deHttpServletComment
  • Criar um objetoServletContext, adicione sua variável de servlet
  • Criar um objetoServletConfig, adicione sua variável de servlet
  • O servidor da Web anexa o servlet ao contêiner
  • Chamando o método init()

No construtor do seu servlet, muitas de suas variáveis ​​internas ainda não foram inicializadas. O contêiner não sabe nada sobre seu servlet, seu servlet não sabe nada sobre seu contexto. Acho que está tudo claro aqui.

Vamos escrever um servlet que, ao ser inicializado, encontre um arquivo de propriedades com as configurações:

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

Aqui criamos um objetoPropriedadese carregue os dados do arquivo config.properties nele . Bem, no futuro você pode sair do objetoPropriedadesvárias opções, como dados para acessar o banco de dados, por exemplo.

Como carregar o arquivo de propriedades corretamente

A propósito, e se o seu servlet não estiver em execução no seu computador?

Digamos que eles o escreveram aqui e ele roda em um servidor em algum outro lugar do mundo. Ou vários servidores. Como carregar o arquivo de propriedades corretamente neste caso?

Boa pergunta. Normalmente, ao executar, um servlet conhece apenas o caminho relativo de seus arquivos de propriedades, não seu caminho absoluto, porque os arquivos war do servlet podem ser armazenados em qualquer lugar.

Então, precisamos descobrir o caminho onde nosso servlet está armazenado (o servlet já está inicializado) e adicionar um caminho relativo a ele :)

Parece algo assim:

String path = absoluteServletParh + "relative path";

E, como sempre, uma tarefa tão elementar geralmente tem seu pequeno “mas”. Seu servlet e seu arquivo de propriedades são armazenados dentro do arquivo :) Não necessariamente, é claro, mas acontece. O arquivo de propriedades geralmente é armazenado dentro de arquivos jar ou war.

Ou seja, seu arquivo pode não ter um caminho físico no disco. Mas como o contêiner foi capaz de carregar seu servlet, provavelmente também poderá carregar seu arquivo de propriedades.

Para fazer isso, você precisa obter o objeto carregador de classes (ClassLoaderName) e peça a ele para enviar seu arquivo. Veja como será:

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

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

Método getConfig()

A propósito, nem todos os parâmetros podem ser passados ​​para o servlet nos arquivos de propriedades. Por exemplo, seu servlet interage com outros servlets em um aplicativo da web distribuído.

Em seguida, você precisa garantir que o contêiner transmita todas as informações necessárias ao seu servlet ao chamar seu método init() . Além disso, ele faz exatamente isso.

Seu servlet (lembre-se que é herdado da classe HttpServlet ) tem um método getServletConfig() . que retorna um objetoServletConfig, criado e inicializado pelo contêiner. Este objeto possui os seguintes métodos:

getInitParameterNames() Retorna uma lista de nomes de parâmetros do servlet
getInitParameter(String nome) Retorna um parâmetro de servlet por seu nome
getServletName() Retorna o próprio nome do servlet
getServletContext() Retorna um objetoServletContext

Vamos escrever um servlet que retorne uma lista de seus parâmetros deServletConfig'A. A colocação deles será através do arquivo 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>

Um servlet pode obter seus parâmetros usando o 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));
    	}
  }
}