08.1 Aplicação Web com VRaptor 4 – Telefone Controller

Olá, como vai você? Hoje vamos mexer no nosso Controller. Aquele carinha que contém os nossos métodos de acesso ao sistema (Rest).

Mas antes de começarmos, vamos aos recadinhos, que são sempre os mesmos, rs. Já estamos trabalhando no nosso projeto, caso tenha caído neste tutorial acidentalmente, pode ver a lista dos episódios anteriores na introdução que fiz para estes posts. E sempre lembre, você pode e deve acompanhar os códigos pelo meu github, segue o link ai em baixo:

https://github.com/pedro-hos/aprendendo-vraptor

Vamos lá, sem mais delongas! O Controller, ou do modo mais abrasileirado possível, Controlador, é o que faz a ligação entre a View (Visão) e o Model (Modelo) no padrão MVC. Mas isso é conversa para um outro post, mas se quiser saber mais sobre esse padrão, só dar uma olhada no fim do post que lá um link 😉

Nosso primeiro Controller terá a função de trazer todos tipos de telefones cadastrados no Enum TipoTelefone que criamos no post do modelo. Vamos então criar a classe TelefoneController, dentro do pacote br.com.pedroHos.controller.

package br.com.pedroHos.controller;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Path;

@Controller
@Path(value="/telefone")
public class TelefoneController {
    //Métodos
}

A primeira coisa que podemos notar é que a classe possui 2 anotações, o @Controller e o @Path(value=”/telefone”) o primeiro é uma indicação para o VRaptor que aquela classe é um Controller, e deve se tratada de um jeito diferente. Toda classe Controller, deve ter a anotação @Controller. A segunda anotação @Path indica uma rota ou URI que aquela classe terá. Ora, se a classe está anotada com o value = “/telefone”, sabemos por definição que toda vez que batermos a URI (URL) …/telefone ela deve chamar a classe TelefoneController.

Vamos agora então, injetar na classe o Result. Result é um Componente do VRaptor usando para “pendurar” atributos na requisição e também, fazer redirecionamentos de rotas, etc. Mãos na massa então:

package br.com.pedroHos.controller;

import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Result;

@Controller
@Path(value="/telefone")
public class TelefoneController {
    private Result result;

   /**
     * CDI eyes only
     * @deprecated
     */
    public TelefoneController() {}

    @Inject
    public TelefoneController(Result result) {
        this.result = result;
    }
    // Outros métodos
}

Usando o @Inject do CDI injetamos o Result passando ele como parâmetro de um construtor. Aproveitamos e criamos um construtor vazio, ele é obrigatório para o funcionamento correto do CDI, mas como não vamos usá-lo, podemos anotar ele com @deprecated assim ele fica indicado que não deve ser usado. Poderíamos anotar o objeto em si, ao invés de anotar um construtor, mas da maneira que fizemos, facilita um possível teste unitário, passando o Objeto Resultmockado”.

Vámonos entonces criar nosso método para pegar todos os tipos de telefones. A parte mais legal vem agora, olha o códigão ai em baixo:

package br.com.pedroHos.controller;

import static br.com.caelum.vraptor.view.Results.json;

import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Result;
import br.com.pedroHos.model.entities.contato.TipoTelefone;

@Controller
@Path(value="/telefone")
public class TelefoneController {
    private Result result;

   /**
     * CDI eyes only
     * @deprecated
     */
    public TelefoneController() {}

    @Inject
    public TelefoneController(Result result) {
        this.result = result;
    }
   
    @Get
    @Path(value = { "/tipo", "/tipo/" })
    public void tipos() {
        result.use(json())
              .withoutRoot()
              .from(TipoTelefone.values())
              .serialize();
    }
}

Vamos explicar em detalhes o método. Primeiro, observamos duas anotações nele. Uma delas inclusive já conhecida o @Path, vamos falar um pouco mais dela então. Sabemos, por definição que esta anotação tem por função criar URIs customizáveis para nóiz mano, e um detalhe legal, podemos passar vários parâmetros para ele, olha ali, passei 2, logo sempre que a batermos, …/telefone/tipo ou …/telefone/tipo/ ele cairá nesse métodozinho. Legal hã. Bem simples. Mas cuidado para não passar vários parâmetros, e ele ficar muiiiiitoooo grade.

Os mais atentos, verão outra anotação, o @Get, como sabemos no Rest usamos os métodos HTTP, GET, PUT, POST, DELETE, mais conhecidos e usados e OPTION, TRACE, CONNECT e PATCH menos usados. Se quiser saber mais sobre esses verbos, se liga na apostila Web Ágil com Vraptor, Hibernate e Ajax da Caelum.

Dentro do método pegamos o result, que injetamos e falamos para ele que queremos que ele use (retorne) json(). Esse json() está sendo importado estaticamente de Result.json(). Repare no modo fluído que programamos com o VRaptor, encadeando tudo, isso faz meus olhos suarem realmente lindo!

O próximo método que chamamos é o withoutRoot(), com ele retiramos o nome raiz no JSON. Sem ele teríamos algo como { “tipoTelefoneList” : [ “CELULAR”, “FIXO”, “SERVICO”, “RADIO”, “FAX”] } e não queremos isso, ou seja, não queremos que tipoTelefoneList apareça, por isso usamos withoutRoot().

Em seguida chamamos o método .from(TipoTelefone.values()) e passamos nosso Enum e invocamos o método values(): TipoTelefone.values() que retorna um Arary com todos os tipos de telefone. No from(), passamos os objetos que queremos serializar, ou seja passar para json(), xml(), ou para a view em si.

Por fim invocamos o método .serialize(); que irá serializar de fato os objetos. O componente Result do Vraptor, é extremamente rico, vale muito a pena olhar com mais detalhe a documentação do projeto, ver tudo que ele pode retornar, os métodos que possui, etc.

Por hora finalizamos a classe, agora temos que testá-la. Para isso suba o servidor WildFly. Eu costumo usar a extensão do Firefox chamada Poster. Após instalar a extensão vamos abri-la, e digitar nossa URL http://localhost:8080/meus-contatos/telefone/tipo e em seguida apertar o botão, GET. Porque queremos fazer o GET (Dããã)

poster_01

Em seguida teremos a tela da reposta:

poster_01_resposta

Observamos o retorno, com nosso objeto serializado, tudo bunitinho.

Pessoal, era isso. Qualquer dúvida ou sugestão me contatem pelos comentário. Agradeço muito o contato de alguns de vocês, é imensamente gratificante ver o número de views subindo a cada dia. Espero de coração estar ajudando. Aquele abraço.

Links
Anúncios

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 )

Imagem do Twitter

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

Foto do Facebook

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

Foto do Google+

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

Conectando a %s