Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Desenvolvimento web com VRaptor

Desenvolvimento web com VRaptor

Slide do workshop ministrado no centro universitário de João Pessoa (Unipê).

Daniel Cavalcante

August 29, 2014
Tweet

More Decks by Daniel Cavalcante

Other Decks in Programming

Transcript

  1. É a classe responsável por disponibilizar recursos para o cliente.

    @Controller public class MeuController { ! }
  2. Parâmetros dos métodos Podemos receber parâmetros nos métodos dos controllers.

    @Controller public class ClientesController { ! public void save (Cliente cliente) { //… } ! }
  3. E se nosso Objeto usar a convenção de java bens,

    podemos usar pontos para navegar entre atributos. Ex: ! cliente.id = 3 cliente.nome = Fulano cliente.usuario.login = fulano
  4. Métodos HTTP Desenvolvendo uma aplicação com recursos REST, o ideal

    é aproveitar a semântica de cada método HTTP. ! Logo, muitas vezes precisamos usar métodos como GET, POST, PUT e etc. No VRaptor temos as anotações @Get, @Post, @Delete, etc que também permite configurar uma URI diferente da padrão.
  5. @Controller public class ClientesController { ! @Post("/cliente/save") public void save

    (Cliente cliente) { } @Get("/clientes") public List<Cliente> list(){ return … } @Delete("/cliente/remove") public void remove (Cliente cliente) { } @Put("/cliente/update") public void update (Cliente cliente) { } }
  6. Path A anotação @Path permite que você customize as URIs

    de acesso aos seus métodos e até mesmo um meio fixo nos controllers. ! @Controller @Path("/clientes") public class ClientesController { ! }
  7. Path com injeção de variáveis Podemos passar também valores em

    nossas URIs. ! @Controller @Path("/clientes") public class ClientesController { ! @Get("/remove/{id}") public void remove (Long id) { } }
  8. Tratando exceções O VRaptor possui um Exception Handler, que captura

    as exceções não tratadas em sua aplicação. ! @Controller public class ClientesController { @Post("/cliente/save") public void save (Cliente cliente) { //Lógica para salvar o cliente result.on(MinhaException.class). forwardTo(this).list(); } }
  9. São instâncias de classes que seu projeto precisa para executar

    tarefas ou armazenar estados em diferentes situações. Ex: ! Daos, PagerResult, Download, Enviadores de email…
  10. Escopos Tanto em componentes quanto em controllers, temos um escopo

    específico. Mas, seguem regras diferentes por padrão. Um controller pertence ao escopo de requisição. Logo, a cada nova requisição (request) ele será instanciado novamente. Já um componente do VRaptor, por padrão, é construído sempre que necessário.
  11. @ApplicationScoped - O componente é um singleton, apenas um por

    aplicação. ! @SessionScoped - O componente é o mesmo durante uma http session. ! @ConversationScoped - A instância do componente é mantida durante conversation. ! @RequestScoped - O componente é o mesmo durante uma requisição. ! @Dependent - O componente é instanciado sempre que requisitado.
  12. A validação do VRaptor tira proveito do Bean Validation, especificação

    do Java EE 7 que permite validar nosso modelo baseado em anotações. Com isso podemos usar anotações já existentes ou criar nossas próprias anotações. @Entity public class Cliente { ! @NotNull private String nome; @Past private Date nascimento; //Getters and Setters } ! }
  13. Podemos passar no validação nos métodos do controller. public void

    cadastrar (@Notnull Cliente c{ //em caso de erro irá redirecionar //para a página de formulário validation.onErrorForwardTo(this).form(); ! }
  14. Os interceptadores foram feitos para executar alguma tarefa antes e/ou

    depois de uma lógica de negócios. Ex: ! Validação de dados, controle de conexão, transação do banco de dados, log, criptografia/compactação de dados.
  15. À seguir mostramos como podemos criar nossa interrupção. Neste exemplo

    interceptamos todas as requisições e simplesmente mostra na saída do console o que está sendo invocado. @Intercepts @RequestScoped public class Log { @Inject private final HttpServletRequest request; @AroundCall public void intercept(SimpleInterceptorStack s){ System.out.println("Interceptando"+request. getRequestURI()); s.next(); } ! }
  16. Para executar um código antes e/ou depois da execução do

    controller, podemos usar as anotações @BeforeCall e @AfterCall. @Intercepts @RequestScoped public class Log { @BeforeCall public void before() { //código a ser executado antes da lógica } @AroundCall public void after(){ //código a ser executado depois da lógica } }
  17. Podemos definir que iremos interceptar apenas os métodos que possuem

    uma anotação. @Accepts public boolean accepts(ControllerMethod method) { return method.containsAnnotation(Anotacao.class); }
  18. Para registrar objetos a serem acessados na view, usamos o

    método include. @Controller public class ClientesController { ! @Inject private Result result; ! public void busca(int id) { result.include("msg", "Mensagem"); result.include("cliente", new Cliente(id)); } }
  19. Se você quiser mudar a view de alguma lógica específica,

    você pode usar o objeto Result. @Controller public class ClientesController { ! @Inject private Result result; ! public void list() {} ! public void save(Cliente cliente) { result.use(Results.logic()). redirectTo(ClientesController.class).list(); } }
  20. Results.logic() - Vai redirecionar para uma outra lógica qualquer do

    sistema ! Results.page() - Vai redirecionar diretamente para uma página, podendo ser um JSP, um HTML, ou qualquer URI relativa ao web application dir, ou ao contexto da aplicação. ! Results.http() - Manda informações do protocolo HTTP como status codes e headers ! Results.status() - Manda status codes com mais informações ! Results.referer() - Usa o header Referer para fazer redirects ou forwards.
  21. Results.nothing() - Apenas retorna o código de sucesso (HTTP 200

    OK) ! Results.xml() - Serializa objetos em XML ! Results.json() - Serializa objetos em JSON ! Results.representation() - Sinaliza objetos em formato determinado pela requisição
  22. result.forwardTo("/some/uri") relativo à result.use(page()).forward(“/some/uri“); ! result.redirecTo("/some/uri") relativo à result.use(page()).redirect(“/some/uri“); !

    result.forwardTo(ClientesController.class).list() relativo à result.use(logic(). forwardTo(ClientesController.class).list(); ! result.reditectTo(ClientesController.class).list() relativo à result.use(logic(). redirectTo(ClientesController.class).list(); ! result.notFound() relativo à result.use(status()).notFound(); Atalhos no Result
  23. Além disso, se o redirecionamento é para um método do

    mesmo controller, podemos usar: result.forwardTo(this).list(); ! result.redirectTo(this).list(); !
  24. O exemplo a seguir mostra como disponibilizar o download para

    seu cliente. @Controller public class PerfilController { ! public File foto(Perfil perfil) { return new File ("/path/para/a/foto"+ perfil.getId+".jpg"); } } Download
  25. Para adicionar mais informações ao download, podemos retornar um FileDownload.

    @Controller public class PerfilController { ! public Download foto(Perfil perfil) { File file = new File("/path/foto"+ perfil.getId()+ ".jpg"); String contentType = "image/jpg"; String filename = perfil.getNome() + ".jpg"; return new FileDownload(file, contentType, filename); } ! }
  26. Para ativar o suporte a upload é necessário adicionar as

    bibliotecas commons-upload e commons-io em seu classpath. public void foto (Perfil perfil, UploadedFile foto) { try (InputStream input = foto.getFile()) { File fotoSalva = new File(“/path/file/repository”, foto.getFileName()); Files.write(input, fotoSalva); dao.atrivui(fotoSalva, perfil); ! } } Upload