Problemas no método init() da Servlet

8 respostas
kalilmvp

Pessoal, gostaria tirar uma dúvida em relação a uma servlet que eu estou desenvolvendo para testes…a minha classe deve incrementar um contador, sendo que cada último valor deve ser gravado num arquivo, e quando eu der um shutdown no servidor…ao reiniciá-lo, trazer o último valor salvo no arquivo e continuar daí…eu sei que eu devo fazer essa implementação no método init()…mais não sei como…já fiz vários testes e ainda não consegui…sei que é uma dúvida básica., mas se alguém puder me ajudar, eu agradeceria…nada do que eu estou implementando no init() está funcionando…um simples System.out.println(“INÍCIO”) tb não funciona…não sei se estou fazendo a chamada errada…segue meu código…

package br.com.servlets;

//import java.io.BufferedInputStream;
//import java.io.FileInputStream;
//import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
//import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

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

public class Servlet4 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   private byte contador;
   //private int cont;
      
   public void init(ServletConfig config, HttpServletResponse response) throws ServletException{
		   super.init(config);
		   System.out.println("INÍCIO");

   }
   public void service(HttpServletRequest request, HttpServletResponse response )
						throws ServletException, IOException {
	   System.out.println("Serviço");
	   	contador++;
	   	PrintWriter writer = response.getWriter();
	 
	   	try {
	   		String caminho = "C://Kalil Desenvolvimento/Teste/arquivo_Teste.txt";
	   		BufferedOutputStream outputStr = new BufferedOutputStream(new FileOutputStream(caminho));
	   			   		
	   		outputStr.write(Integer.toString(contador).getBytes());
	   			   		
			writer.println("Contador incrementando: " + contador + "<BR/>");
	   		outputStr.flush();
		  	outputStr.close();
   	
	   	} catch (FileNotFoundException fn) {
	   		System.err.println("Arquivo não encontrado ->" + fn);
	   	} catch (IOException io) {
	   		System.err.println("Erro de IO ->" + io);
	   	}
   	}
   
   public void destroy(){
	   System.out.println("Saiu");
   }
                         
   
   public ServletConfig getServletConfig(){
	   return null;	   
   }
   
}

O contador já está sendo salvo…só falta esse final…

Quem puder me ajudar eu agradeço…

8 Respostas

rodrigoallemand

Bem, vamos por parte…
O que vc precisa é um simples contador, correto?
Vc pode fazer isso de várias maneiras, mas seguindo o seu raciocinio, vc tem basicamente duas:

  1. A cada service do seu servlet, vc lê o arquivo, incrementa o valor, atualiza e faz o dispatch
  2. No init vc lê o arquivo e cria uma variavel no contexto, a cada service vc incrementa a variavel, no finalize vc atualiza o arquivo…

Pra começar, procure aqui no GUJ um artigo sobre I/O em arquivos… ele te guiará para salvar no arquivo. Independente da sua escolha, vc terá que fazer I/O.

Ai, defina a solução. Podem existir mais, mas basicamente são essas duas.
Só um detalhe: se vc quer um controle na unha, sem falhas, a solução 2 não te atende, pois vc só atualizará o registro caso vc tenha solicitado um shutdown do servidor. Se, por exemplo, vc desligar ele bruscamente (tomada, kill, etc) ele não atualizará o arquivo. Já na solução 1 isso não acontece… vc sempre estará atualizando essa informação, mas com um custo de I/O maior.

kalilmvp

Então Rodrigo…até concordo com vc…eu gostaria de poder fazer a solução 1 mesmo…tanto o incremento do contador quanto o save já estão implementados no service() e funcionando, meu problema mesmo está em relação a como fazer a chamada no init(),realmente não sei, e já fiz uma pesquisa boa…mais muito obrigado pela ajuda ea…

rodrigoallemand

Cara, seu código está falhando… leia-o novamente…
A logica deve ser a seguinte:

  • Abrir arquivo
  • Ler valor do arquivo em uma variavel
  • Incrementar a variavel
  • Salvar o valor no arquivo
  • Fechar o arquivo
  • Imprimir a variavel
kalilmvp

Rodrigo…eu entendi a sua lógica…mais ele não está falhando, ele pode estar diferente da sua lógica…mais ele já está fazendo o que eu quero(em parte)…eu mando printar no browser o contador, toda vez que eu atualizo o contador é incrementado e aquele valor é salvo em um arquivo.txt…isso já está fazendo tranquilo…pode ser que eu possa melhorar o código para isso, mas não está falhando…o que falta é só aquilo que eu te disse…após eu dar o shutdown no server e restartar…devo acessar o arquivo e obter o último valor salvo e printá-lo no browser…creio que isso eu devo fazer no init(), só que não estou conseguindo fazer…acho que você tinha entendido isso da última vez, eu só quis clarear melhor mesmo…

rodrigoallemand

Vamos fazer um ‘chines’ então pra vc ver que o seu código tem uma falha…

Iniciei o servidor (servlet nulo)

Usuario A Chama o servlet
Inicializando o servlet

servlet válido
init imprime INIT
contador = 0
Fazendo o service
incrementa contador (contador = 1)
Escreve no arquivo (arquivo = 1)
Imprime na tela (Contador incrementando: 1)

Usuario A Chama o servlet

incrementa contador (contador = 2)
Escreve no arquivo (arquivo = 2)
Imprime na tela (Contador incrementando: 2)

Usuario B Chama o servlet

incrementa contador (contador = 3)
Escreve no arquivo (arquivo = 3)
Imprime na tela (Contador incrementando: 3)

Restart do servidor
Chama o método destroy

Imprime SAIU

Iniciei o servidor novamente (servlet ainda é nulo)

Usuario A Chama o servlet
Inicializando o servlet

servlet válido
init imprime INIT
contador = 0 (Ue, não deveria ser 3?!?)
Fazendo o service
incrementa contador (contador = 1) (Ue, não deveria ser 4?!?)
Escreve no arquivo (arquivo = 1)
Imprime na tela (Contador incrementando: 1)

Usuario A Chama o servlet

incrementa contador (contador = 2) (Ue, não deveria ser 5?!?)
Escreve no arquivo (arquivo = 2)
Imprime na tela (Contador incrementando: 2)

Usuario B Chama o servlet

incrementa contador (contador = 3) (Ue, não deveria ser 6?!?)
Escreve no arquivo (arquivo = 3)
Imprime na tela (Contador incrementando: 3)

Restart do servidor
Chama o método destroy

Imprime SAIU

Viu como o seu código é falho?! Vc deve ler o arquivo, incrementar e salvar… e não usar uma variavel nova pra cada sessão…
Primeiro, vc está contando cliques, e não acessos… se vc quer acessos, vc deveria contar apenas na criação da sessão (não sei se este é o caso)…

kalilmvp

ahhh rodrigoo…entendi…é pq…

Iniciei o servidor novamente (servlet ainda é nulo)

Usuario A Chama o servlet
Inicializando o servlet

servlet válido
init imprime INIT
contador = 0 (Ue, não deveria ser 3?!?)
Fazendo o service
incrementa contador (contador = 1) (Ue, não deveria ser 4?!?)
Escreve no arquivo (arquivo = 1)
Imprime na tela (Contador incrementando: 1)

Usuario A Chama o servlet

incrementa contador (contador = 2) (Ue, não deveria ser 5?!?)
Escreve no arquivo (arquivo = 2)
Imprime na tela (Contador incrementando: 2)

Usuario B Chama o servlet

incrementa contador (contador = 3) (Ue, não deveria ser 6?!?)
Escreve no arquivo (arquivo = 3)
Imprime na tela (Contador incrementando: 3)

Restart do servidor
Chama o método destroy

Imprime SAIU

essa parte aqui é a que está faltando pra mim…rsrsrs…era essa parte que eu não estava conseguindo fazer entende???não sei como após o restart ele mantém o valor da variável…r.srsrs…mais agora sakei…

rodrigoallemand

Viu, vc que não queria fazer esse tipo de teste no seu código, rs…
Bem, pra matar isso vc precisa seguir aqueles passos que eu falei logo ai em cima… leia o arquivo, coloque o valor em uma variavel, incremente o valor, salve o arquivo e imprima… com isso, por mais que vc faça restart, vc nunca perderá o valor… e lembre-se que isso só conta cliques, e não acessos… para acessos, vc tem que usar um listner de sessão…

kalilmvp

rsrsrsrs…entendi…mais olha só…pensei que eu estava salvando…eu li que o FileOutputStream salva os dados no arquivo…então pq o valor está se perdendo???

Criado 15 de maio de 2008
Ultima resposta 15 de mai. de 2008
Respostas 8
Participantes 2