Skip to content

Categories:

Iniciando com VRaptor

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:

Diretório onde deve estar o arquivo tem que ter o nome do Component (pessoa);

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”>
….
</form>

</body>

</html>

<html>

<body>

<form action=”representante.adiciona.logic”>
….
</form>

</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
private String nome;
}

@Component
public class PessoaLogic {

@Parameter(create=true, key=”Nome”)
private String 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
private Pessoa pessoa;
}

@Component
public class PessoaLogic {

@Parameter(create=true, key=”User”)
private Pessoa pessoa;
}

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
private String[] nomes;
….
}

@Component
public class PessoaLogic {

@Parameter(create=true)
private List nomes;
….
}

View
<html>
<body>

<form action=”pessoa.adiciona.logic”>

<input type=”text” name=”nomes”/>
<input type=”text” name=”nomes”/>
<input type=”text” name=”nomes”/>

<input type=”submit” value=”OK”/>

</form>

</body>
</html>

<html>
<body>

<form action=”pessoa.adiciona.logic”>

<input type=”text” name=”nomes[0]”/>
<input type=”text” name=”nomes[1]”/>
<input type=”text” name=”nomes[2]”/>

<input type=”submit” value=”OK”/>

</form>

</body>
</html>

@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
private Pessoa pessoa;
}

@Component
public class PessoaLogic {

@Out(scope=ScopeType.SESSION,
key=”Pessoa”)
private Pessoa pessoa;
}

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”.

Posted in VRaptor.