De fácil aprendizado, simples, elegante e direto, o Vraptor proporciona um ambiente de desenvolvimento empolgante, pois com poucas linhas de código, o desenvolvedor tem um resultado imediato, o sistema começar a ter uma “cara”, as regras de negócios começam a ser percebida num primeiro momento e aprimoradas daí por diante.
Trabalho já fazem alguns anos na área de desenvolvimento, hoje atuo como gerente de desenvolvimento, mas confesso, não consigo ficar longe do código, por isso, tento participar ao máximo da equipe que coordeno, agregando com conhecimento e também com a pesquisa de boas ferramentas para o ócio da equipe. Foi desta forma que encontrei o Vraptor, e tenho que admitir, ele não fica atrás do grandes como: JSF, Struts2 e outros.
Motivação apresentada, é hora de meter a mão na massa e conhecer o Vraptor na sua simplicidade. O objetivo desse material é apresentar a estrutura básica do VRaptor, através de exemplos simples, mas que exigem do leitor a iniciativa da implementação conforme o andamento de sua leitura.
Por que não apresentar códigos que pudessem ser copiados e testados? Me coloco como exemplo, quando se inicia o aprendizado de algo, é necessário que façamos o mínimo exigido, sendo mais claro, colocamos a mão na massa após um entendimento inicial do que está sendo estudado.
Exemplos mais práticos estão disponíveis no site do VRaptor, no forum e também no site da Caelum. Esse pequeno material serve como apoio a todas as fontes que já existem para o framework.
Antes de mais nada, faça o download do VRaptor caso não tenha o feito.
Apresentando o VRaptor
Estrutura para desenvolvimento da aplicação
Na imagem abaixo, temos destacados os componentes essenciais para o desenvolvimento de uma aplicação com o VRaptor.
Notem que, é necessários ter todos os Jar’s que estão destacados, só assim a aplicação poderá ser desenvolvida. Esses Jar’s acompanham o arquivo de download do framework.

Serão necessários também os arquivos:
* views.properties -> este é responsável pela configuração de redirecionamentos dos métodos Logic de um Component. Mais adiante será exemplificado o seu uso. O seu conteúdo é o padrão utilizado em arquivos properties, tendo uma linha contendo: chave = valor
* vraptor.xml -> este é responsável pela configuração de componentes, conversores, plugins e o auto-discover. Geralmente se tem esse arquivo declarado apenas com a tag: <vraptor></vraptor>
* web.xml -> arquivo fundamental em qualquer aplicação web, nele será configurado o servlet do Vraptor entre outros que possam vir a ser utilizados na aplicação.
web.xml
<web-app>
<display-name>Teste</display-name>
<servlet>
<servlet-name>vraptor2</servlet-name>
<servlet-class>org.vraptor.VRaptorServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>vraptor2</servlet-name>
<url-pattern>*.logic</url-pattern>
</servlet-mapping>
</web-app>
views.properties – Configuração de direcionamentos
Antes de detalhar o views.properties, é importante deixar claro que, como o VRaptor faz uso de convenções, o fluxo de uma requisição pode ser explicado da seguinte forma:

Acompanhem o fluxo apresentado na imagem. Temos um quadro azul claro representando um formulário onde o usuário deve informar seu nome e sua idade, esse formulário tem a sua action configurada para o Component Pessoa, onde será executada a Logic Adiciona.
Ok, continuando, temos uma linha que identifica para nós qual será a classe Logic física que representa o Component Pessoa. Neste caso é a PessoaLogic, Detalhe importante, o sufixo Logic deve estar sempre presente nas classes que serão um Component.
A propriedade action do formulário possui link para a seguinte Logic: pessoa.adiciona.logic, para melhor entender, vamos separar os dados dessa string. Esse endereço ficará assim:
| Component | Método (Lógica) | Indetificador |
| pessoa | adiciona | logic |
| Classe PessoaLogic | Método void adiciona() |
As linhas laranja e verde representam exatamente essa tabela que temos. Quando submetido o formulário, o Component Pessoa será invocado executando o método adiciona.
Até aí tudo bem, mas como o VRaptor sabe para onde direcionar o usuário? Vamos as explicações, a descrição do arquivo de visualização deverá respeitar a seguinte forma:
1° Diretório onde deve estar o arquivo tem que ter o nome do Component (pessoa);
2° O nome do arquivo inicia com a descrição do método executado (adiciona), seguido por um ponto “.” concatenando com o retorno “ok”/”failed” que são os default no caso do uso de void para o método, seguido por um segundo ponto “.”, finalizando com a extensão do arquivo, nesse caso JSP.
| Diretório | Método | Retorno | Tipo do arquivo |
| pessoa/ | adiciona. | ok. | jsp |
Agora sim, podemos ver melhor o funcionamento do views.properties. Para um mesmo método (logic), podemos ter mais de um tipo de retorno, por exemplo:
.....
public String adiciona() {
if (pessoa.getNome().equals("")) {
return "vazio";
} else {
salvarDao.salvar(pessoa);
return "ok";
}
}
.....
No trecho de código apresentado, temos dois retornos, alteramos também o tipo retorno do método. Para o VRaptor saber qual arquivo direcionar após a execução do método, teremos que fazer uso do views.properties. O conteúdo para o views, teria esse linha abaixo.
pessoa.adiciona.vazio=pessoa/mensagem.jsp
Certo, mas e o “ok”, não devo adicionar ele junto no views? Não, porque como vimos anteriormente, os retornos “ok” e “failed” são default do VRaptor.
@Component – Alma da aplicação
O @Component é a alma de uma aplicação com o VRaptor, é ele quem irá executar as logic’s, disponibilizar atributos que servirão de parâmetro entre a camada de visualização e a camada de persistência.
Esse componente é uma simples classe, anotada com @Component, também é possível adicionar um parâmetro value, que acaba redefinindo o nome para essa classe Logic. Por exemplo:
| @Component | @Component(value=”Representante”) |
| @Component public class PessoaLogic { ….. } |
@Component(value=”Representante”) public class PessoaLogic { ….. } |
Neste caso poderíamos chamar PessoaLogic das seguintes formas:
| Pessoa | Representante |
| @Component <html> <body> <form action=”pessoa.adiciona.logic”> </body> </html> |
<html>
<body> <form action=”representante.adiciona.logic”> </body> </html> |
Note que o sufixo Logic deve estar presente no nome da classe, para que o Servlet do VRaptor possa entender as requisições e executar os métodos chamados.
@Parameter – Morte ao request.getParameter()…
A anotação @Parameter é quem define quais são as informações que vem da view e que serão tratadas como parâmetros. Graças a ela, não é necessário termos getters e setters na logic, deixando a classe extremamente limpa e de fácil entendimento.
Essa anotação também permite alguns recursos como:
create -> para criação dinâmica do objeto, sem a necessidade de um new XXX();
key -> nome que o parâmetro possui nos componentes da view.
| Default | Create e Key |
| @Component public class PessoaLogic { @Parameter |
@Component public class PessoaLogic { @Parameter(create=true, key=”Nome”) |
| View | |
| <html> <body> <form action=”pessoa.adiciona.logic”> Nome: <input type=”text” name=”nome”/> <input type=””> </form> </body> </html> |
<html> <body> <form action=”pessoa.adiciona.logic”> Nome: <input type=”text” name=”Nome”/> <input type=””> </form> </body> </html> |
No caso de se utilizar um objeto mais complexo como Pessoa, lembre que na view esse tipo de atributo será identificado por:
descrição do atributo utilizado na classe ou na propriedade key, seguido do atributo que deve receber o valor informado na tela.
No exemplo abaixo podemos entender melhor.
| Default | Create e Key |
| @Component public class PessoaLogic { @Parameter |
@Component public class PessoaLogic { @Parameter(create=true, key=”User”) |
| View | |
| <html> <body> <form action=”pessoa.adiciona.logic”> Nome: <input type=”text” name=”pessoa.nome”/> <input type=”submit” value=”Ok”> </form> </body> </html> |
<html> <body> <form action=”pessoa.adiciona.logic”> Nome: <input type=”text” name=”User.nome”/> <input type=”submit” value=”Ok”> </form> </body> </html> |
Quando o parâmetro for uma coleção, pode-se adotar duas estratégias:
Utilizar um atributo Array.
Utilizar um List contendo o tipo que o parâmetro deve ser.
| Array | List |
| @Component public class PessoaLogic { @Parameter |
@Component public class PessoaLogic { @Parameter(create=true) |
| View | |
| <html> <body> <form action=”pessoa.adiciona.logic”> <input type=”text” name=”nomes”/> <input type=”submit” value=”OK”/> </form> </body> |
<html> <body> <form action=”pessoa.adiciona.logic”> <input type=”text” name=”nomes[0]”/> <input type=”submit” value=”OK”/> </form> </body> |
@Out – Mostrando dados em tela
Vimos então a classe principal para utilização do VRaptor, a forma como ela trata os parâmetros, temos que ver agora a anotação @Out que faz o envio dos dados para a view.
De todas é a mais simples das anotações, também é possível setar algumas propriedades, conforme veremos agora.
| Default | Scope e Key |
| @Component public class PessoaLogic { @Out |
@Component public class PessoaLogic { @Out(scope=ScopeType.SESSION, |
Para a propriedade scope podemos ter os seguintes valores:
ScopeType.SESSION -> adiciona o atributo na sessão
ScopeType.APPLICATION -> adiciona o atributo no contexto de aplicação
ScopeType.FLASH -> utilizado no caso de redirecionamento entre uma logic e outra
ScopeType.REQUEST -> default, tem a sua vida limitada a um request
A propriedade key funciona da mesma forma que no @Parameter, nesse caso, com o uso da EL ela será identifica como ${Pessoa}, se key=”Pessoa”.