O VRaptor3 é um framework MVC em Java focado no desenvolvimento rápido e simples, e na fácil manutenção do código. Usando muitas idéias e boas práticas que surgiram nos últimos anos, como Convenção sobre Configuração, Injeção de Dependências e um modelo REST, você pode fazer sua aplicação com este framework de uma maneira bastante agradável e produtiva. É também uma iniciativa brasileira, nascida dentro da Universidade de São Paulo, usada em muitas empresas.
Após configurar o filtro do VRaptor3 e o pacote básico da sua aplicação no seu web.xml
, você já pode começar a fazer sua aplicação, bastando indicar os objetos que você quer que sejam acessíveis via URIs através da anotação @Resource
. Imagine que queremos fazer um simples CRUD de artigos para o InfoQ, começando então pelo nosso controller:
@Resource public class ArtigosController { public List lista() { // código para listar os artigos // retornando do dao, por exemplo } }
A seguinte convenção é usada: o método lista()
da classe ArtigosController
vai tratar a URI /artigos/lista
. Ao final do método seremos despachados para /WEB-INF/jsp/artigos/lista.jsp
e teremos o seu retorno, que é uma lista de artigos, disponível num atributo artigoList
. Essas convenções podem ser alteradas, se desejado!
O VRaptor3 roda dentro de um container de injeção de dependências, por padrão o Spring. Dessa forma você pode receber as dependências da sua classe no construtor e o VRaptor se encarrega de usá-las para instanciar suas classes. Tudo o que você precisa para isso é registrar essas dependências com a anotação @Component
:
@Component public class ArtigoDao { //... } @Resource public class ArtigosController { private final ArtigoDao dao; public ArtigosController(ArtigoDao dao) { this.dao = dao; } public List lista() { return dao.listaTodos(); } }
Suas classes anotadas com @Component
também podem receber dependências no construtor, desde que estejam também registradas no VRaptor. Se você não quiser usar a convenção do VRaptor para algum método do seu Controller, você pode sobrescrevê-la de maneira bem fácil. Por exemplo, para mudar a URI que chama o método você pode usar a anotação @Path
em cima do método:
@Resource public class ArtigosController { //... @Path("/artigos") public List lista() { return dao.listaTodos(); } }
Muitas vezes não queremos ir para a página padrão do método, como por exemplo, após adicionar um artigo pode ser melhor voltar para a listagem de artigos. Para isso podemos receber no construtor do ArtigosController
um objeto do tipo Result, que é um componente do VRaptor que consegue mudar o resultado do seu método.
import static br.com.caelum.vraptor.view.Results.logic; @Resource public class ArtigosController { private final Result result; //... public ArtigosController(ArtigoDao dao, Result result) { this.result = result; this.dao = dao; } //... @Path("/artigos") public List lista() { return dao.listaTodos(); } public void adiciona(Artigo artigo) { dao.salva(artigo); result.use(logic()).redirectTo(ArtigosController.class).lista(); } }
Repare que estamos redirecionando para um método java! Nada de strings para configurar o redirecionamento, fazemos isso apontando diretamente qual método queremos usar. Repare ainda que estamos recebendo um Artigo
chamado artigo
no método adiciona. O VRaptor vai usar os parâmetros da requisição para instanciar e popular os atributos do objeto artigo usando seus getters e setters:
artigo.titulo=VRaptor3 artigo.autor=Lucas Cavalcanti artigo.comentarios[0].autor=João da Silva artigo.comentarios[0].texto=Artigo bem legal
No método adiciona()
, pode ser interessante validar o artigo antes de salvá-lo no banco. Para fazer validações, o VRaptor possui o componente Validator que pode ser recebido no construtor do seu controller:
import static br.com.caelum.vraptor.view.Results.logic; @Resource public class ArtigosController { private final Validator validator; //... public ArtigosController(ArtigoDao dao, Result result, Validator validator) { //... this.validator = validator; } //... public void formulario() {...} public void adiciona(Artigo artigo) { validator.checking(new Validations() {{ that(artigo.getTitulo() != null, "artigo.titulo", "titulo.nao.pode.ser.nulo"); }}); //após executar as validações, você precisa falar para onde ir em caso de erro: validator.onErrorUse(logic()).forwardTo(ArtigosController.class).formulario(); dao.salva(artigo); result.use(logic()).redirectTo(ArtigosController.class).lista(); } }
Por fim, o VRaptor3 te ajuda a fazer uma aplicação RESTful de uma maneira bem simples. Basta anotar seus métodos com @Get, @Post, @Put
ou @Delete
, e usar o @Path
para mudar a URI, com a possibilidade de passar parâmetros:
@Resource public class ArtigosController { @Get @Path("/artigos") public List lista() {...} @Post @Path("/artigos") public void adiciona(Artigo artigo) {...} @Get @Path("/artigos/{artigo.id}") public void visualiza(Artigo artigo) {...} @Put @Path("/artigos/{artigo.id}") public void atualiza(Artigo artigo) {...} @Delete @Path("/artigos/{artigo.id}") public void remove(Artigo artigo) {...} }
Desse modo, podemos fazer as requisições do tipo:
GET /artigos => lista os artigos POST /artigos => adiciona um artigo GET /artigos/5 => visualiza o artigo de id = 5 PUT /artigos/10 => atualiza o artigo de id = 10 DELETE /artigos/2 => remove o artigo de id = 2
Para começar a usar o VRaptor3, você pode baixar o blank-project que contém um projeto configurado no eclipse, com as dependências mínimas e um web.xml de exemplo. Você pode ainda contar com uma extensa documentação em português, listas de email e um fórum do GUJ especializado em Frameworks brasileiros.