Ola galera^^
Hoje comecei meus estudos em jsp e servlets pela apostila da caelum fj-21
Mas infelizmente ja me deparei com uma duvida que acho muito importante ser retirada.
Comecei a ler sobre init e destroy e quando fui fazer o teste não obti o resultado que gostaria , conforme explicava na apostila.
Deixe me ver se entendi.
O init e o destroy faz a sua servlet(classe java) ser carregada uma vez e ser usada atravez de threads por diversos clientes que acessam o servidor , evitando assim que determinadas variaveis da servlet sejam utilizadas por varios clientes evitando conflito de dados
Acontece que eu fiz o teste com um contador e conforme era acessado por 2 clientes diferentes ele continuava de onde parou e não contava a de cada cliente como era para ser feito…
Eu estou correto na definição de Init e destroy, e entendi bem sua funcionalidade??
Qual poderia ser meu erro?
Agradeço muito a ajuda de todos.
E desculpe se a pergunta foi muito idiota :?
Sem ver sua classe de Servlet fica dificil ver o erro que está descrevendo, mas acho que isso te ajuda:
Quando o container é iniciado é intanciada a classe de Servlet, mas ainda é apenas um objeto, após rodar o método init o objeto é considerado um Servlet(está pronto para servir)
Tanto o método init e destroy são chamados apenas uma vez.
Existe apenas uma instancia dp Servlet com N threads acessando ele.
Quanto ao seu contador ser seguro em relação a threads seu servlet pode incrementer SingleThreadModel(não recomendado) ou vc sincroniza o objeto session e dentro do bloco sincronizado vc incrementa sua variavel.
public class AdicionaContatoServlet extends HttpServlet{
int contador = 0;
public void init(ServletConfig config) throws ServletException{
super.init();
}
public void destroy(){
super.destroy();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
//Busca o writer
PrintWriter out = response.getWriter();
//buscando os parâmetros no request
String nome = request.getParameter(“nome”);
String endereco = request.getParameter(“endereco”);
String email = request.getParameter(“email”);
String dataEmTexto = request.getParameter(“dataNascimento”);
Calendar dataNascimento = null;
//fazendo conversao da data
contador++;
try {
Date date = new SimpleDateFormat(“dd/MM/yyyy”).parse(dataEmTexto);
dataNascimento = Calendar.getInstance();
dataNascimento.setTime(date);
} catch (ParseException e) {
out.println(“Erro de conversão da data”);
return;
}
//Monta um objeto de contato
Contato contato = new Contato();
contato.setNome(nome);
contato.setEndereco(endereco);
contato.setEmail(email);
contato.setDataNascimento(dataNascimento);
//salva o contato
ContatoDAO dao = new ContatoDAO();
dao.adicionaContato(contato);
Bom dia.
Minha primeira postagem e aproveitando o gancho…
Também tive a mesma dúvida, da mesma apostila. O que gilmaslima explicou, entendi, mas ainda assim, restou uma dúvida básica.
Já que o Init será iniciada para o uso de servlet, então este nunca terá que ser destruído já que seu uso é frequente para diversos usuários em tempos indeterminados, isso mesmo ? Ou será usado o destroy para usuários diferentes tornando o servlet uma espécie de sessão ?
Neste código mostrado a cima pelo tioola, a ideia então seria que o contador fosse constante para cada usuário independente até o momento que o servlet se mantivesse em uso ?