Bom dia a todos!
Pessoal preciso criar e manter uma unica instancia de um objeto por sessão. Poderia cria-lo e coloca-lo na sessão do tomcat, porem os locais onde uso esse objeto nao possui referencia ao objeto request.
Alguem tem alguma dica?
vlw
Bom dia a todos!
Pessoal preciso criar e manter uma unica instancia de um objeto por sessão. Poderia cria-lo e coloca-lo na sessão do tomcat, porem os locais onde uso esse objeto nao possui referencia ao objeto request.
Alguem tem alguma dica?
vlw
Não entendi. O que você entende por objeto único por sessão? Um objeto com informações que todos os usuários podem acessar?
Você está utilizando o que? JSF? Struts? What?
Entendo por objeto unico por sessao onde todas as classes que sao criadas a partir de uma sessão possa usa-lo.
estou usando um framework da propria empresa, e ele nao possui esse recurso e preciso implementar algo assim
[]'s
Cara, um jeito muito simples eh:
Object obj = request.getSession().getAttribute("meuObjeto");
if(obj == null){
request.getSession().setAttribute("meuObjeto", new MeuObjeto());
}
Abrss…
Cara, um jeito muito simples eh:Object obj = request.getSession().getAttribute("meuObjeto"); if(obj == null){ request.getSession().setAttribute("meuObjeto", new MeuObjeto()); }Abrss…
Ola Vini, obrigado, mas as classes que irao usar o objeto que preciso nao possuem referencia ao objeto request. Esse eh o problema!
[]'s
Então você quer um objeto único por "sessões".
Nesse caso, se você não tem JSF, EJB ou qualquer outra coisa eu vejo que você terá que fazer um Singleton.
A classe Singleton só será acessada apenas uma vez e tem como objetivo compartilhar as informações para todos os usuários.
Ela deve ter seu construtor privado e apenas uma instância dentro dela. Seria algo do tipopublic class ClasseUnica{
private ClasseUnica(){
}
private static ClasseUnica instancia = new ClasseUnica();
public static ClasseUnica getInstancia(){
return instancia;
}
// metodos
}
Para mais informações procure no google: Singleton Java
Cara, um jeito muito simples eh:Object obj = request.getSession().getAttribute("meuObjeto"); if(obj == null){ request.getSession().setAttribute("meuObjeto", new MeuObjeto()); }Abrss…
Ola Vini, obrigado, mas as classes que irao usar o objeto que preciso nao possuem referencia ao objeto request. Esse eh o problema!
[]'s
Você quer dizer que você depende de um framework próprio construído sobre Servlets ?
Cara, eu não vejo como fazer isso através de uma factory ou um método estático por exemplo. Sem conhecer maiores detalhes do seu framework, a única coisa que me vem à cabeça é você injetar o objeto através do construtor da sua classe. Porém, quem for construir a classe precisa ter acesso à sessão.
Na prática, o que você tem que fazer é obter/criar o objeto na sessão, como o colega mostrou e depois disso jogar o objeto pilha acima, através das camadas do seu framework.
Então você quer um objeto único por "sessões".Nesse caso, se você não tem JSF, EJB ou qualquer outra coisa eu vejo que você terá que fazer um Singleton.
A classe Singleton só será acessada apenas uma vez e tem como objetivo compartilhar as informações para todos os usuários.
Ela deve ter seu construtor privado e apenas uma instância dentro dela. Seria algo do tipopublic class ClasseUnica{ private ClasseUnica(){ } private static ClasseUnica instancia = new ClasseUnica(); public static ClasseUnica getInstancia(){ return instancia; } // metodos }Para mais informações procure no google: Singleton Java
Mas aí todas as sessões vão obter o mesmo objeto!
Você quer dizer que você depende de um framework próprio construído sobre Servlets ?Legal essa abordagem também.Cara, eu não vejo como fazer isso através de uma factory ou um método estático por exemplo. Sem conhecer maiores detalhes do seu framework, a única coisa que me vem à cabeça é você injetar o objeto através do construtor da sua classe. Porém, quem for construir a classe precisa ter acesso à sessão.
Na prática, o que você tem que fazer é obter/criar o objeto na sessão, como o colega mostrou e depois disso jogar o objeto pilha acima, através das camadas do seu framework.
Desculpe a pergunta, por que um Singleton não seria aplicável? Ele não teria acesso por EL mas poderia acessar normalmente pelas classes/servlets.
Mas não é isso que ele quer? Ou eu entendi errado?Então você quer um objeto único por "sessões".Nesse caso, se você não tem JSF, EJB ou qualquer outra coisa eu vejo que você terá que fazer um Singleton.
A classe Singleton só será acessada apenas uma vez e tem como objetivo compartilhar as informações para todos os usuários.
Ela deve ter seu construtor privado e apenas uma instância dentro dela. Seria algo do tipopublic class ClasseUnica{ private ClasseUnica(){ } private static ClasseUnica instancia = new ClasseUnica(); public static ClasseUnica getInstancia(){ return instancia; } // metodos }Para mais informações procure no google: Singleton Java
Mas aí todas as sessões vão obter o mesmo objeto!
Você quer dizer que você depende de um framework próprio construído sobre Servlets ?Legal essa abordagem também.Cara, eu não vejo como fazer isso através de uma factory ou um método estático por exemplo. Sem conhecer maiores detalhes do seu framework, a única coisa que me vem à cabeça é você injetar o objeto através do construtor da sua classe. Porém, quem for construir a classe precisa ter acesso à sessão.
Na prática, o que você tem que fazer é obter/criar o objeto na sessão, como o colega mostrou e depois disso jogar o objeto pilha acima, através das camadas do seu framework.
Desculpe a pergunta, por que um Singleton não seria aplicável? Ele não teria acesso por EL mas poderia acessar normalmente pelas classes/servlets.
Bom, pelo que eu entendi ele quer um objeto da classe X por HttpSession. Usando o Singleton ele vai obter um único objeto para toda a aplicação, ou seja, todas as sessões obterão exatamente o mesmo objeto (a não ser que cada sessão tenha seu próprio classloader rsrsrsrs).
Pode ser que um objeto para toda a aplicação resolva o problema dele. Nesse caso o Singleton pode servir. Mas isso só o autor pode responder.
jakefrog
Não posso usar singleton, preciso um objeto por sessão e nao um objeto para toda a aplicação
rmendes08
Você quer dizer que você depende de um framework próprio construído sobre Servlets ?
Infelizmente sim!
Cara, eu não vejo como fazer isso através de uma factory ou um método estático por exemplo. Sem conhecer maiores detalhes do seu framework, a única coisa que me vem à cabeça é você injetar o objeto através do construtor da sua classe. Porém, quem for construir a classe precisa ter acesso à sessão.
Tambem vejo isso como unica solução, o problema é que pode acontecer de algumas classes nao precisarem do objeto e classes que estiverem dentro dessa precisar, dae a classe de cima tera que possuir um construtor com a referencia apenas para passar a classe de dentro. vai ficar um lixo!
GoHorse detected!
vlw pessoal, vou fazer assim mesmo!
isso que da usar um framework sem injeção de dependência
jakefrog
Não posso usar singleton, preciso um objeto por sessão e nao um objeto para toda a aplicaçãormendes08
Você quer dizer que você depende de um framework próprio construído sobre Servlets ?
Infelizmente sim!Cara, eu não vejo como fazer isso através de uma factory ou um método estático por exemplo. Sem conhecer maiores detalhes do seu framework, a única coisa que me vem à cabeça é você injetar o objeto através do construtor da sua classe. Porém, quem for construir a classe precisa ter acesso à sessão.
Tambem vejo isso como unica solução, o problema é que pode acontecer de algumas classes nao precisarem do objeto e classes que estiverem dentro dessa precisar, dae a classe de cima tera que possuir um construtor com a referencia apenas para passar a classe de dentro. vai ficar um lixo!
GoHorse detected!vlw pessoal, vou fazer assim mesmo!
isso que da usar um framework sem injeção de dependência
Calma colega, pode não ficar tão bom quanto um CDI da vida, mas isso não quer dizer que vai ficar um lixo.
Uma outra alternativa é ao invés de fazer a injeção de dependência através do construtor, fazer através de um seter. Você pode ainda declarar esse seter em uma interface:
public interface SessionScoped{
public void setSessionContext(SessionContext context){
}
}
public class MyModelClass implements SessionScoped{
//...
}
Na verdade, esse tipo de solução era muito usada no JEE antes das anotações. Classes gerenciadas por conteineres, de maneira geral deviam declarar explicitamente pontos de injeção. Basicamente, é muito parecido com o que CDI faz, mas sem as magias negras que fazem as anotações funcionarem.