Init e destroy

4 respostas
T

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 :?

4 Respostas

gilmaslima

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.

Bons estudos!

T
Obrigado pela resposta quanto a classe me desculpe... aqui esta:
package br.com.caelum.agenda.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.naming.java.javaURLContextFactory;

import br.com.caelum.agenda.acessobd.ContatoDAO;
import br.com.caelum.agenda.contato.Contato;

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


//Imprime o nome do contato que foi adicionado

out.println("<html>");
out.println("<body>");
out.println("Contato " + contato.getNome() + " adicionado com sucesso!");
out.println("Contador: "+ contador);
out.println("</body>");
out.println("</html>");


   
   
	}
}
S

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 ?

Grato.

D

Bom, parei nessa mesma dúvida, o init gera uma nova instancia do objeto e o destroy a destroi?

Então cada thread gera uma instancia do objeto, sendo assim são várias instancias?

Sobre não funcionar o init e destroy, tambem tive o mesmo problema, dai chamei os dois a partir do meu metodo service e deu sinal de vida.

Alguem saberia responder essa dúvida?

Criado 9 de abril de 2011
Ultima resposta 18 de jan. de 2012
Respostas 4
Participantes 4