Conforme apresentado nos parágrafos anteriores, a inicialização do Servlet ocorre no instante em que é feita a carga da aplicação pelo Servlet Container.
Nesse instante, o Servlet Container executa o método “init” do Servlet, dando chance ao Servlet de executar quaisquer passos necessários para sua inicialização, tais como:
2) inicialização de variáveis de classe (variáveis estáticas) 3) inicialização de conexões ao banco de dados, etc.
Assim, podemos ter implementado em nosso Servlet “ProcCadastro”, por exemplo:
Inicialização do Servlet “ProcCadastro”
impo rt java.io.*; impo rt javax.servlet.*; impo rt javax.servlet.htt p.*;
/ / Servlet para process a m e n t o do cadas tr o de novos clientes: a cada novo cadastr o bem sucedid o,
/ / envia email com os dad os do cadas t r o public class ProcCada s t r o exten d s HttpServlet {
...
public void init () { ...
} ... }
As assinaturas do método init() são:
Assinaturas do método “init ()”
public void init();
public void init( javax.servlet.ServletConfig p_config );
Conforme pode ser visto, o método init() admite duas assinaturas, sendo que em uma delas, é recebido como parâmetro um objeto da classe javax.servlet.ServletConfig : através desse objeto, o Servlet pode obter os parâmetros de inicialização do Servlet, contidos no Deployment Descriptor (veja seção 2.2). Por outro lado, caso você opte por implementar o método init() sem nenhum parâmetro, é possível também obter uma referência para o objeto ServletConfig por meio da chamada getServletConfig() da própria classe javax.servlet.GenericServlet (a qual nossa classe estende).
public javax.servlet.ServletConfig getServletConfig ();
Para obter um parâmetro de inicialização do Servlet usando o objeto ServletConfig , deve- se utilizar o método getInitParameter(), passando como parâmetro o nome do parâmetro que se deseja obter.
Assinatura do métod o “getInitParameter ()”
public java.lang.String getInitPara m e t e r( java.lang.String p_par a m e t e rN a m e );
Temos, a seguir, um exemplo de uso desse método:
Exemplo de uso do método “getInitParameter()” de
um objeto “ServletConfig”
public void init(ServletConfig p_servletConfig) throw s ServletException {
super.init(p_servletConfig);
String l_servidorSMTP = p_servletConfig.getInitPara m e t e r (“Email.Servido rSMTP”);
if(l_servidorSMTP != null) { ...
} }
Obviamente o método getInitParameter() pode retornar um valor nulo caso o parâmetro inicial a ser obtido não tenha sido definido, e por isso é importante que você faça a verificação do String retornado pela chamada do método antes de utilizá - lo.
É possível também, a partir de um objeto da classe ServletConfig , percorrer a lista dos parâmetros de inicialização do Servlet, bastando utilizar o método getInitParameterNames().
Assinatura do métod o “getInitParameterNam e s ()”
public java.util.Enum er a tio n getInitPara m e te rNa m e s();
Temos, a seguir, um exemplo de uso deste outro método:
Exemplo de uso do método “getInitParameterNa m e s
()” de um objeto “ServletConfig”
public void init(ServletConfig p_servletConfig) throw s ServletException {
super.init(p_servletConfig);
Enumeratio n l_para m e t e rNa m e s = p_servletConfig.getInitPara m e t e rNa m e s ();
if(l_para m e t e rNa m e s != null)
while(l_para me t erNa m e s.h a sMoreEleme n t s ()) {
String l_para me t erNa m e = (String) l_para me t erNa m e s. nextElemen t ();
String l_para me t erValue= p_servletConfig.getInitParameter (l_parameterName) ;
... } } }
Assim, em nossa aplicação de exemplo CadastroClientes , podemos implementar o método de inicialização do Servlet ProcCadastro como:
Inicialização do Servlet “ProcCadastro”
impo rt java.io.*; impo rt javax.servlet.*; impo rt javax.servlet.htt p.*;
/ / Servlet para process a m e n t o do cadas tr o de novos clientes: / / a cada novo cadastr o bem sucedido, envia email com os dados do cadastr o
public class ProcCada s t r o exten d s HttpServlet {
/ / Servidor SMTP a ser usado para o envio de email private static String _ServidorSMTP = null;
/ / Remetent e, destinat á rio e assu n t o do email a ser enviado a cada cadas tr o
private static String _Remeten te = null, _Destinat ario = null, _Assunt o = null;
public void init(ServletConfig p_servletConfig) throws ServletException {
super.init(p_servletConfig);
/ / Recupera n d o os parâ m e t r o s de inicializaçã o do Servlet _ServidorSMTP = p_servletConfig.getInitPara me t e r
(“Email.Servido rSMTP”);
_Remetent e = p_servletCo nfig.getInitPara m e te r (“Email.Remeten t e”);
_Destinat ario = p_servletConfig.getInitPara m e t e r (“Email.Destinat a rio”);
_Assu nt o = p_servletCo nfig.getInitPara m e te r(“Email.Assu n t o”); ...
}
}
Outro uso comum para o método de inicialização do Servlet é para o despacho de um ou mais Threads, que deverão ser executados durante o período em que o Servlet permanecer carregado. Assim, um serlvet pode, por exemplo, iniciar um Thread que irá verificar continuamente a disponibilidade de uma conexão com o banco de dados, independente de qualquer requisição que receba. Este Servlet de exemplo é apresentado a seguir:
Inicialização do Servlet “VerificaConBD”
impo rt java.io.*; impo rt javax.servlet.*; impo rt javax.servlet.htt p.*;
/ / Servlet para verificar conexão com banco de dad os: lança threa d que verifica stat u s da conexão periodica m e n t e
public class VerificaConDB extend s HttpServlet impleme n t s Runnable {
/ / Referência ao thread que irá fazer a verificação da conexão Threa d _ThreadVerif = null;
/ / Inicializaçã o do Servlet
public void init(ServletConfig p_servletConfig) throws ServletException {
/ / Lançand o Threa d ...
_Threa dVerif = new Threa d(this); _Threa dVerif.star t ();
... }
/ / Execução do thread public void run() {
while(_ThreadVerif != null) { if(!ConBD.OK ()) { ... } } } ... }
Uma observação importante com relação a esse processo de inicialização é que o Servlet somente poderá receber requisições após a conclusão de seu processo de inicialização.
O desenvolvedor pode, por outro lado, indicar que esse processo de inicialização não foi bem sucedido, através do lançamento da exceptions ServletException ou UnavailableException ; nestes casos, o Servlet Container irá deixar o Servlet em um estado inativo, ou seja, sem poder receber requisições. A exception UnavailableException , em particular, pode receber como parâmetro em seu construtor, um número de segundos com uma estimativa de quanto tempo o Servlet deverá ficar inativo.
Exemplo de uso da exceçã o “UnavailableException”
para indicar fracass o na inicialização
public void init(ServletConfig p_servletConfig)
throws ServletException, UnavailableException { super.init(p_servletConfig);
...
/ / Recupera n d o e validan d o parâ m e t r o s de inicialização do Servlet
_ServidorSMTP = p_servletConfig.getInitPara m e t e r (“Email.Servido rSMTP”);
_Remeten te = p_servletConfig.getInitPara m e t e r (“Email.Remeten t e”);
_Destinata rio = p_servletConfig.getInitPara m e t e r (“Email.Destinat a rio”);
_Assun t o = p_servletConfig.getInitPara m e t e r(“Email.Assu n t o”); if((_ServidorSMTP = = null) || (_Remeten te = = null) || (_Assunt o = = null))
throw new UnavailableExceptio n(“Erro: parâm e t r o s de inicialização não
encont r a d o s!”);
No caso de você não ter percebido, todos os métodos init() apresentados até agora nos exemplos foram declarados de maneira a possibilitar o lançamento do exception ServletException : isso é necessário devido à chamada do método super.init (), que pode, por si, lançar essa exceção para indicar problemas em sua execução.