01 VRaptor3 - O guia inicial de 1 minuto

O VRaptor 3 foca em simplicidade e, portanto, todas as funcionalidades que você verá têm como meta resolver o problema do programador da maneira menos intrusiva possível em seu código.

Tanto para salvar, remover, buscar e atualizar ou ainda funcionalidades que costumam ser mais complexas como upload e download de arquivos, resultados em formatos diferentes (XML, JSON, XHTML, etc), tudo isso é feito por meio de funcionalidades simples do VRaptor 3, que sempre procuram encapsular HttpServletRequest, Response, Session e toda a API do javax.servlet.

Para aprender o VRaptor de forma mais detalhada, continue lendo as outras seções desta documentação, o Livro de VRaptor do Lucas Cavalcanti, publicado pela Casa do Código, ou a apostila do VRaptor da Caelum.

Começando um projeto

Você pode começar seu projeto a partir do vraptor-blank-project, que contém as dependências necessárias e a configuração no web.xml. Ele pode ser baixado no site de downloads do VRaptor.

O projeto vraptor-blank-project é configurado para a IDE Eclipse. Se você usa Netbeans, é possível importar o projeto facilmente conforme a documentação disponível na seção de suporte do NetBeans. Por outro lado, se você utiliza a IDE IntelliJ IDEA você pode importar o projeto seguindo o guia disponível na página de ajuda do IntelliJ IDEA.

Se você quiser usar o Maven, você pode adicionar o artefato do VRaptor como dependência no seu pom.xml:

<dependency>
    <groupId>br.com.caelum</groupId>
    <artifactId>vraptor</artifactId>
    <version>3.5.2</version><!--ou a última versão disponível-->
</dependency>

Um Controller simples

Chamaremos de Controller as classes contendo a lógica de negócio do seu sistema. São as classes que alguns frameworks podem vir a chamar de actions ou services, apesar de não significarem exatamente a mesma coisa.

Com o VRaptor configurado no seu web.xml, basta criar os seus controllers para receber as requisições e começar a construir seu sistema.

Um controller simples seria:

/*
* anotando seu controller com @Resource, seus métodos públicos ficarão disponíveis
* para receber requisições web.
*/
@Resource
public class ClientsController {

    private ClientDao dao;

    /*
     * Você pode receber as dependências da sua classe no construtor, e o VRaptor vai
     * se encarregar de criar ou localizar essas dependências pra você e usá-las pra
     * criar o seu controller. Para que o VRaptor saiba como criar o ClientDao você
     * deve anotá-lo com @Component.
     */
    public ClientsController(ClientDao dao) {
        this.dao = dao;
    }

    /*
     * Todos os métodos públicos do seu controller estarão acessíveis pela web.
     * Por exemplo, o método form pode ser acessado pela URI /clients/form e
     * vai redirecionar para a jsp /WEB-INF/jsp/clients/form.jsp
     */
    public void form() {
        // código que carrega dados para checkboxes, selects, etc
    }

    /*
     * Você pode receber parâmetros no seu método e o VRaptor tentará popular os
     * campos dos parâmetro de acordo com a requisição. Se houver na requisição:
     * custom.name=Lucas
     * custom.address=R.Vergueiro
     * então teremos os campos name e address do Client custom populados com
     * Lucas e R.Vergueiro via getters e setters
     * URI: /clients/add
     * view: /WEB-INF/jsp/clients/add.jsp
     */
    public void add(Client custom) {
        dao.save(custom);
    }

    /*
     * O retorno do seu método é exportado para a view. Nesse caso, como o retorno é
     * uma lista de clientes, a variável acessível no jsp será ${clientList}.
     * URI: /clients/list
     * view: /WEB-INF/jsp/clients/list.jsp
     */
    public List<Client> list() {
        return dao.listAll():
    }

    /*
     * Se o retorno for um tipo simples, o nome da variável exportada será o nome da
     * classe com a primeira letra minúscula. Nesse caso, como retornou um Client, a
     * variável na jsp será ${client}.
     * Devemos ter um parâmetro da requisição id=5 por exemplo, e o VRaptor vai
     * fazer a conversão do parâmetro em Long, e passar como parâmetro do método.
     * URI: /clients/view
     * view: /WEB-INF/jsp/clients/view.jsp
     */
    public Client view(Long id) {
        return dao.load(id);
    }
}

Repare como essa classe está completamente independente da API de javax.servlet. O código também está extremamente simples e fácil de ser testado como unidade. O VRaptor já faz várias associações para as URIs como default:

/client/form   invoca form()
/client/add    invoca add(client) populando o objeto client com os parâmetros da requisição
/clients/list  invoca list() e devolve ${clientList} ao JSP
/clients/view?id=3  invoca view(3l) e devolve ${client} ao JSP

Mais para a frente veremos como é fácil trocar a URI /clients/view?id=3 para /clients/view/3, deixando a URI mais elegante.

O ClientDao será injetado pelo VRaptor, como também veremos adiante. Você já pode passar para o Guia inicial de 10 minutos.