VRaptor

Usando o Header Referer para fazer redirecionamentos

Geralmente quando você clica em um link, ou submete um formulário, o browser envia uma requisição para o servidor da sua aplicação, colocando um Header chamado Referer, que contém qual é a página atual, que originou a requisição. Você pode usar esse Header com o VRaptor, para fazer os redirecionamentos:

import static br.com.caelum.vraptor.view.Results.referer;

@Controller
public class ShoppingController {

    public void adicionaItem(Item item) {
        validator.checking(...);
        validator.onErrorUse(referer()).forward();

        dao.adiciona(item);

        result.use(referer()).redirect();
    }
}

O problema em usar o Referer é que ele não é obrigatório. Então quando o Referer não vem na requisição, o VRaptor vai lançar uma IllegalStateException, e assim você pode especificar uma outra lógica para ir caso o Referer não seja especificado:

try {
    result.use(referer()).redirect();
} catch (IllegalStateException e) {
    result.use(logic()).redirectTo(HomeController.class).index();
}

Ou você pode usar o on(IllegalStateException.class) pra fazer isso de forma fluente:

result.use(referer())
    .redirect()
    .on(IllegalStateException.class)
    .redirectTo(HomeController.class)
    .index();