View redirection

Muitas vezes a lógica de negócios termina com dois (ou mais) resultados diferentes.

Como você consegue selecionar qual a página jsp será usada para cada resultado?

No exemplo seguinte, nós usamos para o nome do componente e da lógica catalog e import.

Um resultado só

Por padrão, VRaptor permite que o seu método retorna void: ele chama a página:

${component}/${logic}.ok.jsp

Então no exemplo seguinte:

package org.vraptor.example.view;

@Component
public class CatalogLogic {

        public void import() {
                // a chave view é catalog.import
        }
        
}

O arquivo jsp final seria:

catalog/import.ok.jsp

Resultados diferentes

Se o seu método retornar o tipo String, o resultado pode ser diferente. Por exemplo:

package org.vraptor.example.view;

@Component
public class CatalogLogic {

        public String import() {
        
                if(Math.random() > 0.5) {
                        // a chave view é catalog.import.big
                        return "big";
                } else {
                        // a chave view é catalog.import.small
                        return "small";
                }
                
        }
        
}

Vai para:

result.equals("big") --> catalog/import.big.jsp
result.equals("small") --> catalog/import.small.jsp

Sobrescrevendo views

Às vezes você quer alterar o padrão do direcionamento para um determinado resultado ...

Por exemplo, imagine que você queira ir ao catalog/too_big.jsp mas o resultado do seu método é somente big.

Crie um arquivo views.properties no seu classpath. Adicione o linha seguinte ao seu arquivo views.properties:

catalog.import.big = /catalog/too_big.jsp

So isso! Se o resultado é catalog.import.big, VRaptor procura o valor no arquivo views e, se ele não acha, direciona ao arquivo padrão... como isso não é o caso aqui, VRaptar chama catalog/too_big.jsp, porque nós sobrescrevemos o padrão.

Redirecionamento no Client side

Um tí­pico problema de atualização (refresh) acontece quando o usuário atualiza a página em vez de listar todos os dados. Ele executa a a última ação antes da listagem. Para evitar isso você pode sobrescrever o view com o prefix redirect:

catalog.import.big = redirect:catalog/too_big.jsp

O redirecionamento será executado para catalog/too_big.jsp no cliente.

Não tem nenhuma barra no inicio e como o redirecionamento será executado no cliente, a chamada é relativa à sua aplicação web.

O redirecionamento também oferece uma simples linguagem para chamar os getters dos seus objetos ejetados, por exemplo:

catalog.import.big = redirect:catalog/too_big.jsp?id=${catalog.id}

Nenhum view

Às vezes você nem quer redirecionar para uma página, por exemplo quando você envia um arquivo binário usando OutputStream (like a pdf report).

Use a anotação @Viewless para avisar o VRaptor que nenhum view é desejado.

O exemplo de download do arquivo binário mostra como usar a anotação.

Sobrescrevendo o regex pattern

A regra mencionada anterior que arquivos jsp usam pastas diferentes referente do componente, pode ser alterada com facilidade.

Adicione no arquivo vraptor.xml o tag xml:

        ...

        <regex-view-manager>/$component/$logic.$result.vm</regex-view-manager>

        ...

Essa regra, por exemplo aplicaria para velocity templates baseados no velocity tools generic servlet em vez de usar arquivos jsp...