Se você já usou a interface Filter ou conhece o conceito de interceptors dos outros frameworks, você vai encontrar uma funcionalidade parecida usando os interceptors do VRaptor.
O interceptor permite executar código antes da lógica de negócios e depois do redirecionamento à camada de apresentação.
package org.vraptor.example.interceptor;
public class SimpleInterceptor implements Interceptor {
private static volatile int hitCount = 0;
private static volatile int concurrentHits = 0;
public void intercept(LogicFlow flow) throws LogicException,
ViewException {
// antes da lógica
hitCount++;
concurrentHits++;
System.out.printf("Numero do hit é %d%n", hitCount);
// executa a lógica e redirecione para o view
flow.execute();
// depois do view rendering
concurrentHits--;
System.out.println("Depois view...");
}
}package org.vraptor.example.interceptor;
@Component("simple")
@InterceptedBy(SimpleInterceptor.class)
public class InterceptedTest {
public void test() {
try {
System.out.println("Vamos dormir um pouco ...");
Thread.sleep(10000);
} catch(InterruptedException ex) {
ex.printStackTrace();
}
}
}simple/test.ok.jsp
<html>
<%
System.out.println("Oi scriplet!");
// nota: nunca use scriplet na aplicação real!
%>
Done...
</html>Numero do hit eh 1 Vamos dormir um pouco ... Oi scriplet! Depois view...
Observe que o interceptor imprime a primeira linha antes de chamar flow.execute, na seqüencia o componente com a lógica de negócios é executado(segunda linha).
O redirecionamento (terceira linha) e o resto do método intercept são executados depois (última linha).
Então temos o fluxo seguinte:
Criar Interceptor --> Chamar o método intercept --> Criar o Componente de Negócios --> Ler Parâmetros --> Chamar o Método da Lógica--> Redirecionamento ao View --> Finalização do Método intercept
Você pode usar a anotação @InterceptedBy com vários Interceptors:
@InterceptedBy( { Interceptor1.class, Interceptor2.class } )Se tiver com uma lista de interceptadores, você pode agrupá-los usando uma pilha (InterceptorStack):
Simplesmente estenda a classe InterceptorStack e chame super passando os seus interceptadores.
Por exemplo:
public static class CommonInterceptors extends InterceptorStack {
public Stack() {
super(DaoInterceptor.class, UserLoginInterceptor.class);
}
}Ao invés de listar todos os interceptadores:
@InterceptedBy( { DaoInterceptor.class, UserLoginInterceptor.class } )você usa a pilha:
@InterceptedBy( { CommonInterceptors.class } )