[RESOLVIDO] Acessando objetos java.util.Map SessionScoped via JSP no VRaptor

9 respostas
F

Boa noite, galera!

Estou usando VRaptor 3 e preciso gerenciar um grupo de objetos na sessão do cliente. Para isso pensei em criar um objeto Session que encapsula um Map que guardará as instâncias de objetos que devem ser SessionScoped.

Contudo não descobri como acessar os elementos de um objeto Map no JSP.

Caso alguém saiba como [ou sugira alguma idéia melhor para meu problema], agradeço desde já!

Grande Abraço!

9 Respostas

Lucas_Cavalcanti

o ideal é não usar Map, criar algo que tenha mais a ver com o seu negócio…

de qqer forma, se for um Map<String, algo> vc pode fazer no jsp:

${mapa[chave]}
F

Fala Lucas!

Isso já me ajuda um pouco, contudo existe mais um ponto que acabei deixando de citar: para evitar ficar fazendo casting dos objetos, uso como chave a classe do objeto ‘value’.

Conhece alguma sintaxe para isso no JSP ou JSTL?

[Nota: estive pensando sobre não usar Map, mas ainda não cheguei a uma conclusão sobre isso…]

Valeu!

[]'s.

F

Ops… esqueci de outro problema que encontrei…

O Map é um atributo de minha classe Session, contudo não consigo acessá-lo via JSP pois o VRaptor não consegue encontrá-lo, é lançada uma javax.el.PropertyNotFoundException.

Existe algum problema para se acessar Maps via VRaptor?

[]'s.

Lucas_Cavalcanti

o ideal seria vc anotar essas classes que vc quer guardar no map com @SessionScoped e acessá-las diretamente, com o nome da classe com a primeira letra minúscula

essa parte de acessar os Maps é só do jsp, não do VRAptor

F

Eu já pensei sobre essa possibilidade, mas como preciso gerenciar de certa forma tal sessão (como saber se objeto está ou não na sessão) e de uma forma um tanto quanto padrão para qualquer objeto, pensei neste conceito.

Com relação ao Map, vou tentar debugar a StackTrace para ver se descubro o problema na fonte. Segue abaixo parte da StackTrace:

<blockquote>javax.el.PropertyNotFoundException: Property attributes not found on type sistema.session.Session

at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:193)

at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:170)

at javax.el.BeanELResolver.property(BeanELResolver.java:279)

at javax.el.BeanELResolver.getValue(BeanELResolver.java:60)

at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)

at org.apache.el.parser.AstValue.getValue(AstValue.java:118)

at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)

at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:935)

at org.apache.jsp.WEB_002dINF.jsp.account.myAccount_jsp._jspService(myAccount_jsp.java:292)

at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)

 70 more</blockquote>

Valeu e grande abraço!

Lucas_Cavalcanti

tenta não usar um Map então…

são tantos objetos assim? se forem poucos vc pode colocar todos como attributos da sua Session e acessá-lo via getter mesmo no jsp.

se forem muitos o melhor é separar essa Session em várias classes, uma pra cada funcionalidade de forma que tenha sentido. Vc pode extrair a lógica de registro pra poder usar nessas outras classes

Lucas_Cavalcanti

qto ao erro, vc chamou:

${session.attributes}

?

se attributes é o Map, vc tem o getter dele? só funciona se tiver o getAttributes

F

Fala Lucas!

Cara, valeu mesmo pela força… a exceção estava ocorrendo exatamente por este motivo.

Acontece, na verdade, que antes estava trabalhando com uma classe para cada objeto na sessão, contudo, como é provável que aumente esse número de objetos na sessão, foi decidido que seria melhor fazer um refactor de modo a deixar esse gerenciamento um pouco mais dinâmico… então pensei em usar um mapa… nesse refactor, acabei transformando o “get” do objeto em “getKey” para o mapa e esqueci de colocar o “getAttributes”… :?

Contudo, mesmo conseguindo acessar o Map no JSP, como minha Key é um objeto Class, não sei seria fácil, ou até possível, fazer essa via JSP sem incluir a Key no Result…

Só que no fim das contas, analisando a situação como um todo, e o trabalho que daria, tanto na implementação quanto na manutenção e extensão do sistema, e ainda o fato de a sintaxe de acesso via JSP poluir um pouco a view, optei pela solução de colocar os objetos como atributos do meu objeto Session, o que seria menos traumático a princípio.

Creio que é só.

Valeu e um grande abraço!!!

F

Fala Lucas!

Pensando um pouco melhor sobre a solução apresentada, fiz um teste a adotei uma outra alternativa que me garantiu o melhor dos dois mundos: estou mantendo o Map em minha classe Session e, graças às convenções do VRaptor, simplesmente forneço “gets” para os objetos que estão na sessão… assim consigo acessá-los diretamente do JSP como se fossem atributos da minha classe Session, e reduzo também os pontos de alteração quando da inclusão de novos objetos na sessão.

Valeu mais uma vez e um grande abraço [e um 2011 de sucesso] !

Criado 29 de dezembro de 2010
Ultima resposta 3 de jan. de 2011
Respostas 9
Participantes 2