Singletons em JSP são instanciados novamente! HELP!

11 respostas
K

Fala galera. Tô com um problemão. Tenho um form que atualiza algumas variáveis em uma singleton. Como fazer para quando for executar o JSP usando Tomcat não ser instanciada novamente a singleton quando eu utilizar o método getInstance() ?
Aparentemente estão sendo geradas 2 singletons!
Qualquer alternativa que vocês me derem será de grande ajuda!

valeu!

11 Respostas

F

O seu singleton tem as características do código abaixo?
Construtores privados, variável que contém a instância é estática, …

public class MeuSingleton {
	private static MeuSingleton instancia;

	private MeuSingleton() {
	}

	public static MeuSingleton getInstance() {
		if (instancia == null)
			instancia = new MeuSingleton();
		return instancia;
	}
}
K

fvslistas:
O seu singleton tem as características do código abaixo?
Construtores privados, variável que contém a instância é estática, …

public class MeuSingleton {
	private static MeuSingleton instancia;

	private MeuSingleton() {
	}

	public static MeuSingleton getInstance() {
		if (instancia == null)
			instancia = new MeuSingleton();
		return instancia;
	}
}

Sim! Meu singleton está de acordo com esse modelo. Eu executo o jForm e altero a singleton, mas mudanças não são refletidas no JSP. O JSP não consegue “enxergar” a singleton usada no jForm e acaba criando outra!!!

F

Sabe dzer se as duas instâncias estão dentro da mesma sessão?
Pode postar o código do singleton?

K

fvslistas:
Sabe dzer se as duas instâncias estão dentro da mesma sessão?
Pode postar o código do singleton?

package Gerenciamento;
import java.util.LinkedList;



public class Estoque {
       
       
      LinkedList listalivros = new LinkedList();
      Livro livro;

    private static Estoque estoque;

    private Estoque () {
        livro = new Livro();
        livro.setISBN("001");
        livro.setTitulo("Livro A");
        listalivros.add(livro);
        

    }

   

    public void addLivro (Livro novo_livro) {
       listalivros.add(novo_livro);
    }

    public static Estoque getInstance(){
        if (estoque == null) {  
          estoque = new Estoque();  
        }
        return (estoque);
    }

    public LinkedList getEstoque(){
        return (listalivros);
    }


}
F

Como vc identificou que existem duas instâncias da classe Estoque?

K

fvslistas:
Como vc identificou que existem duas instâncias da classe Estoque?

Eu identifiquei pelo fato de eu rodar primeiro um jForm que adicionava alguns objetos a uma LinkedList dessa singleton. Depois eu rodava o JSP no Tomcat e chamava um método da singleton para me retornar essa LinkedList. Mas a lista retornada continha apenas os valores antigos, criados com o contrutor. Portanto, existem 2 singletons!!!

F

Sinistro. :slight_smile:
Vc pode mandar os códigos do jform que faz as adições e do jsp que faz as consultas?

K

fvslistas:
Sinistro. :slight_smile:
Vc pode mandar os códigos do jform que faz as adições e do jsp que faz as consultas?

Creio que não será muito útil eu te mandar o código, pois eu acho que o problema é que o jform cria a singleton em algum lugar e o servidor cria em outro!

Tanto no JSP quanto no jForm eu uso: Estoque estoque = Estoque.getInstance();

Por enquanto, a única saída que eu pensei é: fazer todos formulários em JSP e esquecer do jForm do Swing…

F

Pô, então pelo q entendi vc tá usando dois fronts diferentes.
Um JSP e o outro swing. Um acesso via JEE e ou outro via desktop.
É isso? Se for tá explicado.

A solução para que você possa usar os dois e ter uma mesma instância para ambos é fazer com que a classe Estoque esteja dentro de uma única máquina virtual.
Assim, coloca o Estoque dentro do tomcat e crie um serviço que retorne a classe Estoque. Faça com que tanto o JSP quanto o swing acessem este serviço.

F

Aqui http://www.guj.com.br/posts/list/28381.java há uma discussão e exemplo de como conectar swing com servlet.

K

fvslistas:
Aqui http://www.guj.com.br/posts/list/28381.java há uma discussão e exemplo de como conectar swing com servlet.

Valeu, cara!

Criado 9 de abril de 2010
Ultima resposta 10 de abr. de 2010
Respostas 11
Participantes 2