.include em controller

Pessoal,

Tenho um header.jsp que fica na pasta commons, e ela é incluída em várias outras páginas.
A dúvida é, esse header recebe alguns parâmetros, sendo assim todo método nos controllers que utilizam o header, eu tenho que dar o include nele…

Por exemplo:

[code]@Get @Path("/perfil/busca")
public List busca(String pesquisa) {
result.include(“totalAlertas”, alertaDao.totalAlertas(usuarioWeb.getUser()));
result.include(“pesquisa”, pesquisa);

	return usuarioDao.busca(pesquisa);
}[/code]

@Get @Path("/perfil/alterar") public void alterar() { result.include("totalAlertas", alertaDao.totalAlertas(usuarioWeb.getUser())); }

entre outros métodos que tenho que dar esse include também!

Como inclui esse totalAlertas direto no header.jsp?
Sei que é possível, mas é uma boa fazer isso no header mesmo? Não teria um jeito melhor? Pois, vou ter que sempre inicializar o dao no jsp, correto?

Obrigado!

Você pode criar um objeto como ApplicationScoped e armazenar esses atributos nele.

vc pode também criar um interceptor que seta esses parâmetros

Lucas, mas um interceptor iria chamar todas as vezes, até mesmo nas páginas que não precisa, correto?
Seria uma boa colocar um “select” a mais nas páginas que não precisam?

Do ApplicationScoped eu entendi, mas como se anota o objeto? Aonde eu anotaria? Com esse scoped, ficaria acessível em todas as jsp correto? me parece uma boa opção, tem algum exemplo por aí galera?

você pode configurar o interceptor para só passar nas lógicas que precisam das informações (implementando o método accepts corretamente)

http://www.caelum.com.br/curso/fj-28-vraptor-hibernate-ajax/ - capítulo de autorização tem um jeito legal de implementar isso, com anotações

o applicationScoped não ficaria disponível por padrão nas jsps, mas é só receber um ServletContext no construtor e fazer um context.setAttribute(“nomeDoComponente”, this);

Lucas,

Entendi, fiz e deu certo!

Primeiro botei o after

@Intercepts(after=AutorizacaoInterceptor.class) public class MeuPerfilInterceptor implements Interceptor {

Após fiz minha lógica

[code]@Override
public boolean accepts(ResourceMethod method) {
return method.containsAnnotation(MeuPerfil.class);
}

@Override
public void intercept(InterceptorStack stack, ResourceMethod method,
		Object resourceInstance) throws InterceptionException {
	
	Usuario usuario = usuarioWeb.getUser();
	result.include("totalAlertas", alertaDao.totalAlertas(usuario));
	result.include("amigos", relacionamentoDao.amigosDe(usuario));
	stack.next(method, resourceInstance);
	
}[/code]

Vai ser uma boa, pois existem mais includes em comum entre as páginas! Gostei desse método, muito legal ficar anotando os métodos :slight_smile:
Sei que poderia em vez da anotação pegar as classes do controller no accept, mas existem muitas classes, achei melhor a anotação.

Fiz algo de errado ou existe algo que poupe mais trabalho ainda? (duvido)
E ah sim, apesar de eu anotar o interceptor como after, se o interceptor de autorização redirecionar, ele não vai chegar a ir para o segudo né?

Obrigado Lucas!

mais fácil que isso só se vc definir uma convenção (tipo, todos os controllers do pacote …meuperfil serão interceptados) mas não ganha tanto…

só vai chamar esse interceptor se o de Autorizacao chamar o stack.next