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.
Bons estudos!
T
tioola
Obrigado pela resposta
quanto a classe me desculpe...
aqui esta:
packagebr.com.caelum.agenda.servlet;importjava.io.IOException;importjava.io.PrintWriter;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;importjavax.servlet.ServletConfig;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.naming.java.javaURLContextFactory;importbr.com.caelum.agenda.acessobd.ContatoDAO;importbr.com.caelum.agenda.contato.Contato;publicclassAdicionaContatoServletextendsHttpServlet{intcontador=0;publicvoidinit(ServletConfigconfig)throwsServletException{super.init();}publicvoiddestroy(){super.destroy();}protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{//Busca o writer PrintWriterout=response.getWriter();//buscando os parâmetros no requestStringnome=request.getParameter("nome");Stringendereco=request.getParameter("endereco");Stringemail=request.getParameter("email");StringdataEmTexto=request.getParameter("dataNascimento");CalendardataNascimento=null;//fazendo conversao da datacontador++;try{Datedate=newSimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);dataNascimento=Calendar.getInstance();dataNascimento.setTime(date);}catch(ParseExceptione){out.println("Erro de conversão da data");return;}//Monta um objeto de contatoContatocontato=newContato();contato.setNome(nome);contato.setEndereco(endereco);contato.setEmail(email);contato.setDataNascimento(dataNascimento);//salva o contatoContatoDAOdao=newContatoDAO();dao.adicionaContato(contato);//Imprime o nome do contato que foi adicionadoout.println("<html>");out.println("<body>");out.println("Contato "+contato.getNome()+" adicionado com sucesso!");out.println("Contador: "+contador);out.println("</body>");out.println("</html>");}}
S
Stepheson
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
dertyu765
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.