Estou em dúvida sobre como disponibilizar variáveis para a view em escopos de sessão e aplicação. Por exemplo, no meu LoginController preciso colocar o objeto usuário na sessão, mas no result.include() não há opção de escopo, no VRaptor 2 eu utilizava @Out(ScopeType.SESSION). Também preciso disponibilzar algumas coisas para toda a aplicação, como uma variável com o contexto da minha app. Qual a melhor forma de se fazer isso com VRaptor 3?
No VRaptor3 é um pouquinho mais trabalhoso mas mais testável:
Você cria uma classe que tem getter e setter pro seu usuario:
@Component
@SessionScoped
public class UsuarioNaSessao {
private Usuario usuario;
//getter e setter
}
e recebe no construtor das classes que precisam pegar ou setar o usuário na sessão:
@Resource
public class MeuController {
public MeuController(UsuarioNaSessao usuario) {
//
}
}
Pra contexto de applicação é só colocar @ApplicationScoped.
Vamos colocar isso melhor na documentação
[]'s
Criei o componente assim [code]package org.br.ssac.segirs.component;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
/**
*
-
@author GouverMXT
*/
@Component
@ApplicationScoped
public class ApplicationData {private String context;
public ApplicationData() {
context = “/seminario”;
}public String getContext() {
return context;
}public void setContext(String context) {
this.context = context;
}
}[/code]
E tentei acessar na JSP através de ${context} mas está vazio.
Quando você cria componentes desse jeito, eles só ficam disponíveis para injeção de dependências…
se você precisa passar componentes pra todas as views você precisa de um interceptor que as coloque no result…
(no seu caso, você pode conseguir o context-path de outros jeitos: ou via ${pageContext.request.contextPath},
ou via <c:url value="/sua/url/aqui" />)
@Intercepts
public class ContextInterceptor implements Interceptor {
public ContextInterceptor(Result result, ApplicationData data) {
//coloca em variaveis
}
public boolean accepts(ResourceMethod method) {
return true;
}
public void intercepts(...) {
result.include("context", data.getContext());
stack.next(...);
}
}
[quote=lucascs]Quando você cria componentes desse jeito, eles só ficam disponíveis para injeção de dependências…
se você precisa passar componentes pra todas as views você precisa de um interceptor que as coloque no result…
(no seu caso, você pode conseguir o context-path de outros jeitos: ou via ${pageContext.request.contextPath},
ou via <c:url value="/sua/url/aqui" />)
@Intercepts
public class ContextInterceptor implements Interceptor {
public ContextInterceptor(Result result, ApplicationData data) {
//coloca em variaveis
}
public boolean accepts(ResourceMethod method) {
return true;
}
public void intercepts(...) {
result.include("context", data.getContext());
stack.next(...);
}
}
[/quote]
Como faço para interceptar apenas alguns métodos?
no método accepts do interceptor, vc recebe um ResourceMethod method:
method.getMethod() é o método java chamado
method.getResourceClass().getType() é a classe que contém o método…
é só restringir usando isso…