1. num servlet para acessar um objeto session podemos usar, por exemplo,
É possível fazer algo análogo a isto em num controller do Vraptor3 ??
Obs.: Já consegui acessar um objeto session injetado automaticamente, mas quero fazer isto programaticamente.
2. É possível fazer algo análogo ao citado acima num controller do Vraptor3 para objetos application ??
Fabio, eu já respondi lá no seu outro tópico. Resumo: se você tem uma classe chamada UsuarioLogado o vraptor exporta a variável para o JSP como usuarioLogado, ou seja, o nome da classe em camel-case.
você precisa primeiro injetar o HttpSession no seu construtor, e depois usar-lo a vontade. Você precisa pelo menos injetar a session pelo construtor. No vraptor não tem como você ter a session assim por mágina, apenas assim ou injetando direto o objeto anotado com SessionScoped no construtor. Um dos dois.
[code]public MyClass {
private final HttpSession session;
public MyClass(HttpSession session) {
this.session = session;
}
public void foo() {
Usuario u = session.getAttribute(“usuario”);
}
}[/code]
Não é recomendado fazer isso… Isso é uma péssima prática de programação e deixa seu código procedural e não testável e mtas outras coisas…
Não se importe de receber coisas no construtor, pq não vai ser vc que vai dar new nas classes, vai ser o VRaptor… sendo radical, vc não deveria dar new em nenhuma classe qdo estiver programando com o vraptor, deixe isso para a injeção de dependências
ok, então não dá para acessar manualmente a session num controller vRaptor, semelhante ao que fazemos com servlets.
Isto só é possível via injeção.
A questão é que tenho uma controller com 10 métodos e só 1 deles usa objetos da session.
Vou ter que sempre injetar via construtor, mesmo que o método chamado não precise de session.
O gasto que você terá com uma lazy-http-session é maior que você injetar e não usar. Afinal a http-session já existe e está criada, no caso o vraptor apenas injeta ela a você. Ou seja, você injetando ou não já terá ela ocupando espaço em memória.
Outro dia diz uns testes no meu projeto, que ao invés de eu injetar o EJB no construtor fiz um esquema para injetar um lazy-EJB. O tempo gasto para gerar um proxy foi maior do que fazer sempre o lookup do EJB remoto.
geralmente vc não deveria mexer com o HttpSession, nem HttpServlet(Request|Response) dentro dos seus controllers… não tem outro jeito melhor de fazer isso que vc quer? por exemplo criando um componente session scoped?
geralmente as entidades não serão componentes, pois elas virão do banco geralmente… Não tem nenhum jeito de falar: o meu component Produto vai ser esse que eu baixei do banco agora… todo componente é instanciado e gerenciado pelo VRaptor, vc não tem como trocar a instancia do componente sem fazer uma gambiarra grande…
Na prática o que eu faria é criar outra classe que seria responsável por guardar esses produtos para comparação… e essa outra classe seria session scoped
tipo fazer um result.include que inclui na sessão, certo?
de qqer forma, colocar um método assim só deixaria o objeto disponível nas jsps… não daria pra colocar ele como dependências de outras classes… pelo menos não faria mto sentido…
Porque um componente/entidade pode estar apenas em um tipo de escopo?
Há momentos, por exemplo, que eu posso querer utilizá-la em @SessionScoped e em outros em @PrototypeScoped, porém configurando na própria classe eu só posso utilizar em um tipo.