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.
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
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
À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.
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}
À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.
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...