Acessando Propriedades de web.xml
a Partir de um Java Bean: Um Guia Prático
Ao desenvolver aplicações Java, especialmente aquelas que devem ser executadas em ambientes web e standalone, você pode se encontrar na necessidade de acessar propriedades definidas no arquivo web.xml
. No entanto, isso pode ser complicado, especialmente se você deseja manter os componentes desacoplados do contêiner Servlet. Neste post do blog, abordaremos esse problema e forneceremos uma solução clara, passo a passo.
O Problema
Desenvolvedores Java frequentemente precisam acessar dados de configuração armazenados no arquivo web.xml
— parâmetros que são críticos para o funcionamento da aplicação — enquanto mantêm uma arquitetura limpa. Isso pode ser particularmente relevante para classes Factory, onde você não quer acoplar sua lógica diretamente à API Servlet. Nesses casos, confiar no ServletConfig ou em outros objetos específicos da web pode levar a limitações e impedimentos.
Você pode desejar incluir lógica na sua classe Factory para examinar várias fontes de configuração em uma hierarquia:
- Um arquivo de propriedades no classpath
- Parâmetros de inicialização do
web.xml
- Propriedades do sistema
- Configurações padrão se nenhuma outra configuração estiver disponível
O objetivo é projetar um sistema que funcione perfeitamente tanto dentro de um contêiner web quanto fora, como em contextos de linha de comando.
A Solução
Para resolver elegantemente esse problema, você pode utilizar um ServletContextListener
. Veja como implementá-lo passo a passo.
Passo 1: Criar o ServletContextListener
Esse listener será executado automaticamente quando o contexto da aplicação for inicializado e pode extrair as propriedades definidas em web.xml
. Aqui está a implementação:
public class FactoryInitialisingServletContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent event) {
}
public void contextInitialized(ServletContextEvent event) {
Properties properties = new Properties();
ServletContext servletContext = event.getServletContext();
Enumeration<?> keys = servletContext.getInitParameterNames();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String value = servletContext.getInitParameter(key);
properties.setProperty(key, value);
}
Factory.setServletContextProperties(properties);
}
}
Passo 2: Definir a Classe Factory
Em seguida, precisamos de uma classe Factory simples que armazene essas propriedades para acesso posterior:
public class Factory {
static Properties _servletContextProperties = new Properties();
public static void setServletContextProperties(Properties servletContextProperties) {
_servletContextProperties = servletContextProperties;
}
}
Passo 3: Atualizar web.xml
Agora, para integrar esse listener com sua aplicação web, você deve registrá-lo no seu web.xml
:
<listener>
<listener-class>com.acme.FactoryInitialisingServletContextListener</listener-class>
</listener>
Como Funciona
- Quando a aplicação web é implantada, o
FactoryInitialisingServletContextListener
é acionado pelo contêiner web. - Durante o método
contextInitialized
, ele coleta todos os parâmetros de contexto definidos emweb.xml
e preenche um objetoProperties
. - O objeto
Properties
é então armazenado naFactory
, que pode ser acessada a qualquer momento em sua aplicação.
Executando Fora de um Contêiner Web
Se sua aplicação for executada fora de um contêiner web real, as propriedades _servletContextProperties
permanecerão vazias, permitindo que sua aplicação mantenha funcionalidade sem dependências pesadas na API Servlet.
Conclusão
Esta abordagem fornece uma maneira limpa e eficiente de acessar propriedades de web.xml
a partir de um Java Bean ou classe Factory, sem acoplar fortemente seu código ao contêiner Servlet. Ao utilizar um ServletContextListener
, você pode gerenciar elegantemente as configurações da aplicação enquanto garante versatilidade tanto para aplicações web quanto para ferramentas de linha de comando standalone.
Se você está procurando uma forma eficiente de gerenciar configurações de aplicação enquanto mantém seu código limpo e desacoplado, esta é a estratégia a ser adotada!