Início > programação, VRaptor > VRaptor 3: aprenda em 5 minutos

VRaptor 3: aprenda em 5 minutos

Visão Geral

Esses dias me aprofundei nos estudos de VRaptor. Realmente o framework tem muita coisa legal e para aqueles que são acostumados a trabalhar com bibliotecas component-based como eu (no caso, programo em JSF diariamente), torna-se um desafio empregar uma abordagem action-based tão simples como a versão 3 propõe.

O VRaptor tem a grande vantagem de encapsular as principais classes básicas de Servlets, como HttpServletRequest, HttpServletResponse e Session e através dele a lógica de negócio do sistema é tratada por Controllers que o desenvolvedor deve criar. Para entender como funciona esse mecanismo, a imagem abaixo mostra o fluxo da requisição do usuário.

Passos da Requisição no VRaptor

Passos da Requisição no VRaptor.

Adaptado de http://blog.caelum.com.br/entenda-os-mvcs-e-os-frameworks-action-e-component-based/

Podemor ver que a requisição passa pelo Front Controller do framework que a redireciona para o Controller (anotado com @Resource) criado pelo desenvolvedor.

Características

Convenção sobre Configuração / Controllers

O VRaptor foca em simplicidade, portanto o desenvolvedor deve se acostumar com uma característica chave da tecnologia: a convençao sobre configuração. Por esse motivo, muitas das decisões a respeito de alguns aspectos do sistema são retiradas das mãos dos programador, o que na verdade tem um preço, já que limita um pouco algumas práticas que se planeje fazer, porém tem a vantagem de facilitar a padronização do código e evita as costumeiras configurações em arquivos XML vistas em outros frameworks.

Um exemplo, já comentado acima, é o nome dos Controllers da aplicação. As requisições obedecem a um pattern que é muito simples de entender. Exemplo:

@Resource
public class BibliotecaController {

}

No código acima, ao informarmos o nome da classe como BibliotecaController (e, claro, colocando a anotação @Resource) estamos determinando que ela é um Controller e que as requisições direcionadas a ela devem possuir o pattern /biblioteca/{complemento_de_URI_a_ser_determinado}.

Mas como determinar esse complemento de URI, mencionado no parágrafo acima? Simples: ao anotarmos a classe com @Resource os métodos públicos ficam disponíveis para receber requisições. Exemplo:

@Resource
public class BibliotecaController {
   public void formulario() {
      // prepara campos do formulário
   }
}

Com o código acima fazemos uma chamada ao método formulario() através da seguinte URI: /biblioteca/formulario. Esse método pode ser chamado, por exemplo, para preencher algumas variáveis antes de exibir o formulário de cadastro de biblioteca.

Outro detalhe importante: após o processamento de um método público de um controller, a página jsp com o mesmo nome do método e localizada dentro da pasta com o pattern de chamada do Controller (biblioteca) será invocada. No caso do método criado acima será /WEB-INF/jsp/biblioteca/formulario.jsp, seguindo mais uma convenção do VRaptor.

Podemos observar ainda que as páginas devem ficar dentro de WEB-INF/jsp, uma configuração interessante, uma vez que o conteúdo fica protegido de acesso direto.

Outra convenção que facilita a vida do programador está na listagem de objetos. Imagine que você quer chamar o Controller anterior para enumerar as bibliotecas. O código para essa funcionalidade, ficaria assim:

@Resource
public class BibliotecaController {
   public List<Biblioteca> listaBibliotecas() {
      // retorna listagem de bibliotecas
   }
}

A chamada ao método será através da URI /biblioteca/listaBibliotecas, e como retornamos um List<Biblioteca> o VRaptor cria uma variável na visão chamada ${bibliotecaList} que pode ser usada na página de retorno do método (/WEB-INF/jsp/biblioteca/listaBibliotecas.jsp) , evitando que o programador manipule request, dispatcher, entre outros, como faria com Servlets.

Imagine agora que você deseja salvar uma biblioteca no banco de dados. Mais uma vez o VRaptor nos auxilia nessa tarefa, fazendo um mapeamento entre os campos do formulário e o parâmetro do método, que pode ser uma entidade do sistema. Exemplo:
Controller

@Resource
public class BibliotecaController {
   public void salvaBiblioteca(Biblioteca biblio) {
      // salva biblioteca
   }
}

Página JSP

<form action="<c:url value="/biblioteca/salvaBiblioteca"/>">
   <input type="text" name="biblio.nome" />
   <input type="text" name="biblio.sigla" />

   <input type="submit" value="Cadastrar"/>
</form>

Observe que os campos do formulário na página JSP começam com o nome biblio. Isso se deve ao fato de o parâmetro do nosso método salvaBiblioteca() ter esse nome. Dentro do método, biblio terá os campos nome e sigla preenchidos com os valores informados pelo usuário na página – claro que devemos ter os setters na classe Biblioteca para esses atributos.

Injeção de Dependência

O VRaptor é capaz de resolver as dependências que você precisa. O procedimento é muito simples: basta anotar a classe a ser injetada com @Component e passá-la no construtor do Controller, conforme exemplo abaixo:

Classe a ser Injetada

@Component
public class BibliotecaDAO {
   ...
}

Controller

@Resource
public class BibliotecaController {
   private BibliotecaDAO dao;

   public BibliotecaController(BibliotecaDAO dao) {
      this.dao = dao;
   }
}

Redirecionamento

Em nosso método salvaBiblioteca() anterior, após a persistência do dado no banco o usuário será, por convenção, redirecionado para a página /WEB-INF/jsp/biblioteca/salvaBiblioteca.jsp. Porém esse é um comportamento indesejado, porque nesse caso normalmente chamamos a página de cadastro novamente, ou uma listagem das bibliotecas, e em geral não temos uma página no sistema com esse nome (salvarBiblioteca.jsp). A solução é mudar o redirecionamento. Se quisermos mostrar a listagem das bibliotecas, podemos fazer assim:

@Resource
public class BibliotecaController {
   private BibliotecaDAO dao;

   public BibliotecaController(BibliotecaDAO dao, Result result) {
      this.dao = dao;
      this.result = result;
   }

   public void salvaBiblioteca(Biblioteca biblio) {
      dao.salvar(biblio);
      result.redirectTo(BibliotecaController.class).listaBibliotecas();
   }

   public List<Biblioteca> listaBibliotecas() {
      return dao.listar();
   }
}

Observe que no método salvaBiblioteca() estamos usando a variável result que foi injetada no construtor do Controller. Ela é do tipo Result, um componente do VRaptor responsável por adicionar atributos na requisição e mudar a view a ser carregada.

Agora vamos imaginar que depois de salvar uma biblioteca, ao invés de mostrar a listagem, desejamos enviar o usuário para a página inicial. É muito simples, basta chamarmos o método forwardTo() da classe Result, conforme código abaixo:

@Resource
public class BibliotecaController {
   private BibliotecaDAO dao;

   public BibliotecaController(BibliotecaDAO dao, Result result) {
      this.dao = dao;
      this.result = result;
   }

   public void salvaBiblioteca(Biblioteca biblio) {
      dao.salvar(biblio);
      result.forwardTo("/WEB-INF/jsp/inicio.jsp");
   }
}

Adicionando atributos

No caso de um cadastro de uma biblioteca é muito comum termos campos adicionais que precisam ser preenchidos, como por exemplo, a cidade a que pertence a biblioteca. Nesse caso, antes de chamarmos a página, precisamos deixar a lista de cidades disponível para processamento na página. Isso é feito de forma simples no VRaptor. Basta usarmos o método include() da classe Result:

@Resource
public class BibliotecaController {
   private BibliotecaDAO dao;
   private CidadeDAO daoCidade;

   public BibliotecaController(BibliotecaDAO dao, CidadeDAO daoCidade, Result result) {
      this.dao = dao;
      this.daoCidade = daoCidade;
      this.result = result;
   }

   public void formulario() {
      result.include("cidadesList", daoCidade.listaCidades());
   }
}

Na página /WEB-INF/jsp/biblioteca/formulario.jsp basta utilizarmos a variável ${cidadesList} para montarmos um select, por exemplo, no formulário.

Conclusão

Não é a toa que o VRaptor tem conquistado cada vez mais adeptos. Através da adoção de uma série de boas práticas existentes no mercado (como convenção sobre configuração, injeção de dependência, mínima configuração XML, adoção em massa de anotações, entre outras, o framework impressiona e dá total liberdade para o usuário escolher o que vai usar na visão para montar suas páginas JSP (JQuery, ExtJS, ou até mesmo HTML e CSS puros).

Outra coisa que impressiona é o tempo de resposta das requisições. Isso se deve ao fato de o VRaptor ser um framework action-based muito leve e evitar a montagem de árvore de componentes e a necessidade de manter o estado dos beans encontrada nas tecnologias component-based.

Anúncios
  1. 06/07/2012 às 15:07

    Fala, Pablo!
    Bom post cara. Bem didático.

    Parabéns e continua postando sobre esse poderoso framework que é o vraptor.
    Em breve postarei no meu tambem.

    Abraço

  2. 09/07/2012 às 09:04

    E ai Pablo blza.
    Bacana seu post, acredito que o vraptor ficou mais simples para mim depois de lê esse post. Parabéns e continua postando.
    Abraço e sucesso.

  3. Antonio Marcio
    10/07/2012 às 14:35

    Muito simple e instrutivo.
    Parabéns Pablo.

  4. 21/07/2012 às 00:47

    Muito bom post. Em breve penso em fazer um vídeo sobre o assunto, posso me basear no seu tutorial dando todos os devidos créditos ao mesmo?

  5. Cícero
    14/12/2012 às 16:15

    Cara mandou ver muito bom o seu post….
    Parabens mesmo.

  6. 10/06/2014 às 14:23

    Isso me animou a começar a conhecer este novo(para mim) framework

  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s

%d blogueiros gostam disto: