[RESOLVIDO] SessionScoped VRaptor

17 respostas
kivervinicius

Ola, estamos fazendo um sistema de biblioteca, dai a maioria das pesquisas terá um valor que será setado no login que seria o codigo da biblioteca, com o vraptor qual seria a melhor forma de manter esse valor? pq a partir de todas as minhas pesquisas sempre terá essa biblioteca filtrada, que nem nesse relatorio estamos fazendo um relatorio de emissão de carteirinhas, então teriamos que passar o codigo do Leitor e da biblioteca, para sair somente os leitores relacionados aquela biblioteca (central, escola, interna) essas coisas. o Lavieri me falou sobre sessionScoped, eu ainda não fiz o login mas no ato do login eu precisava passar qual biblioteca estarei usando e em todas as pesquisas internas no sistema eu irei utilizar o filtro escolhido pelo usuario + o da biblioteca selecionada no login.

Qm poder me ajudar agradeço muito, lembrando q estou utilizando VRaptor + Hibernate.

[]'s

17 Respostas

G

Você pode fazer algo como:

@SessionScoped public class AuthenticatedUser { [...] }

E lá dentro colocar tudo que você quiser sobre o usuário, que pode ser o nome dele, código, e até qual a biblioteca que ele é associado.

kivervinicius

Olá garcia, obrigado pela resposta, certo, eu fazendo tal método como eu faço para acessa-lo depois? usando um getter mesmo?
desculpe a ignorancia, mas se alguem tiver algum tutorial ou algo assim que eu possa me basear seria otimo.

Obrigado,

[]'s

G

Sim, com getter, já que a classe é um POJO normal.

Tem uma documentação muito boa no site do vraptor: http://vraptor.caelum.com.br

Lavieri

Bom o que vc precisa fazer é isso...

cria um objeto como o garcia falou

algo assim

@SessionScoped  
public class UserSession implements Serializable {  //é importante q implemente serializable
     private User user; //neste exemplo é bom que o user tb implemente serializable.

     public void login(User user) {this.user = user;}
     public void getUser() {return user;}
     public void logout() {user = null;}
     public boolean isLogged() {return user != null}
}
ai nesse caso vc pode pedir no seu construtor da logica algo como
@Resource
public AutenticadorController {
    private UserSession userSession;
    public AutenticadorController (UserSession userSession) {
        this.userSession = userSession;
    }


    public void login(String login,String senha) {
         User user = buscaUserPorLoginESenha(login,senha); //se login e senha não conferir retorna null
         userSession.login(user);
    }  
}

ai la na sua logica onde vc precisar saber do usuario da sessão é só usar ele

@Resource
public BibliotecaController {
    private UserSession userSession;
    public AutenticadorController (UserSession userSession) {
        this.userSession = userSession;
    }


    public void consultarLivro(String outrosParametros) {
         List<Livro> livros = buscaUserPorLoginESenha(userSession.getUser().getBiblioteca(),outrosParametros); //se login e senha não conferir retorna null
         return livros;
    }  
}
kivervinicius

Ola garcia, obrigado pela dica da documentação, realmente ali possui um otimo lugar de pesquisa. Irei me aprofundar, obrigado

Lavieri muito bom a sua demonstração, obrigado pelo tempo disponibilizado, irei testar hoje a noite, pois agora estou no trabalho ainda, mas mesmo assim muito obrigado pela forma que vc vem me ajudando :slight_smile:

Pela demonstração já consegui entender bastante como funciona, vou estar dando uma lida na documentação do vRaptor, irá surgir algumas duvidas, pois acho que começei aprendendo errado rs, comecei direto usando o vRaptor, sem antes passar por Struts e Servlets, então o conceito está um pouco fraco, problema normal, já que a unica linguagem web q programo é php e asp, rsr

[]'s

G

Não vejo ligação entre vraptor, struts e servlets. Você pode facilmente seguir direto no vraptor sem problemas. Você só precisa entender como funciona os verbos http (post, get, delete, head) e entender passagem de parametros, cabeçalhos (2XX, 3XX, 4XX, 5XX). E isso tudo, pela sua experiência com PHP creio que não seja mistério.

Abraços

kivervinicius

oque seria o Serializable? qual seria a importancia dele na minha classe?

[]'s

kivervinicius

Encontrei sobre oque seria serializable, mas não entendi pq serializar estas duas classes.

http://www.guj.com.br/posts/list/232.java

G

kivervinicius:
Lavieri:

@SessionScoped public class UserSession implements Serializable { //é importante q implemente serializable private User user; //neste exemplo é bom que o user tb implemente serializable.

oque seria o Serializable? qual seria a importancia dele na minha classe?

[]'s

Implementar Serializable indica que sua classe é serializada. Ou seja, você apenas marca ela para a VM saber que essa classe pode ser transportada pela rede, gravada em disco e afins. Um exemplo mais prático é quando você tem um bean que você quer que seja transferido entre dois pontos. http://pt.wikipedia.org/wiki/Serialização

Alguns appservers precisam que os objetos que vão para a sessão sejam serializados. No glassish, por exemplo, ele reclama disso. Mas não lembre se é obrigatório que dados da sessão http sejam serializados.

Há também o externalizable, que é quase a mesma coisa que Serializable, porém nesse caso você mesmo diz como será feita a serialização.

kivervinicius

Ah sim garcia, agora eu entendi perfeitamente, no caso tem que ser serializado pois eu irei utilizar as informações do usuário em diversas paginas da minha aplicação, então resumindo o conceito de SessionScoped é ter os dados da classe disponiveis para acesso diverso até o sistema sair certo?

Espero que seja isso que tenha entendido, rs, obrigado novamente.

Lavieri

Sem explicar muito o sentido… o motivo mesmo é o seguinte…

Um objeto em sessão perdura por 30 minutos no servidor… (isso falando do padrão do tomcat, vc pode configurar para mais tempo ou outras coisas mais) …

O fato é que, o servidor, pode necessitar gravar em disco, para poupar memoria, nesta hora seu objeto sera serializado, guardado no disco, e na proxima chamada a ele, ele será reativado (deserializado) e retornará para a memoria…

Em tempo de produção (usando epclipse por exemplo) a cada save em um .java, as classes são recompliadas, um redpoly é realizado no servidor, e o servidor é automaticamente reiniciado, nesse momento todos os objetos em escopo de sessão são serializados/desarializados no restart… se vc não marca a classe com Serializable, vc vê um monte de erro esparramendo no seu console…

Ou seja, é padrão objetos em escopo de sessão ou maior, serem serializaveis…

kivervinicius

Opa, lavieri, obrigado novamente, :oops:, entendi ambas as explicações agora, ficou bem mais claro para mim, por enquanto obrigado a todos que me ajudaram.

G

Na verdade pense apenas na explicação do Lavieri, que está muito mais explicada, principalmente no seu caso. A serialização não tem nada a ver com usar um objeto entre várias páginas. Mas não vou me estender na explicação para não te complicar, por isso eu disse que, por enquanto, pense apenas no que o Lavieri te explicou.

Abraços

D

@Garcia,
Poderia esclarecer se eh “mito” ou verdade: tem 1 pessoal q fala q Objetos q dever ficar na Session (p/ex. dados referentes a 1 form de Tela) devem, além de implementar Serializabel, definir SerialUI (putz, agora tô num sem nada de Java, não me lembro certo), pq, senão, pode aconter de os dados do formulário de um Usuário se “misturem” com os dados do formulário do outro Usuário.
Compreendeste o meu ponto (o q eu quiz dizer)??!

G

Derlon, o serialVersionUID serve para que quando o objeto for “deserializado” a VM compare o valor desse campo entre as duas versões. Se for diferentes será lançado uma InvalidClassException.

Toda vez que você marca uma classe como serializable você precisa indicar o serialVersionUID. Aliás nunca achei na documentação se é obrigatório, acho que não, porém eu sempre procuro usar o serialVersionUID.

Agora esse caso de misturas os dados do usuário é mito mesmo. O que pode ter acontecido nesse seu caso aí são atributos de classe em algum servlet ou thread-local mal implementado. Já ví muito projeto usando request e session como atributo a nivel de classe em um servlet.

Você pode encontrar a documentação aqui: http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html

D

@garcia-jj, muito obrigado pelas informções!! :thumbup:

@kivervinicius, conseguiu resolver o seu problema??! (se sim, gostaria p/ gentileza de comentar e colocar o tópico como resolvido?)

kivervinicius

Ola, sim, resolvido, obrigado por lembrar

Criado 8 de junho de 2010
Ultima resposta 18 de jun. de 2010
Respostas 17
Participantes 4