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.