.include em controller

6 respostas
mondor

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:
@Get @Path("/perfil/busca")
	public List<Usuario> busca(String pesquisa) {
		result.include("totalAlertas", alertaDao.totalAlertas(usuarioWeb.getUser()));
		result.include("pesquisa", pesquisa);
		
		return usuarioDao.busca(pesquisa);
	}
@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!

6 Respostas

Andre_Brito

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

Lucas_Cavalcanti

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

mondor

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?

Lucas_Cavalcanti

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);

mondor

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
@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);
		
	}

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 :-)
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!

Lucas_Cavalcanti

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

Criado 13 de junho de 2011
Ultima resposta 16 de jun. de 2011
Respostas 6
Participantes 3