SlideShare uma empresa Scribd logo
1 de 46
Baixar para ler offline
Play!
Desenvolvendo aplicações
 Web com Java sem dor
Quem sou

Allyson Barros - @allysonbarros
Graduando em Análise e Desenvolvimento de Sistemas - IFRN
Desenvolvedor Web desde 2006
Idealizador do Grupo WebLovers - http://grupoweblovers.co.cc
allysonbarrosrn@gmail.com - allyson_barros_irm@hotmail.com
O que é?
Quais as vantagens?
Os Primeiros
  Passos!
Instalação
do Framework
Requisitos

• JDK 5 ou superior
• Editor de Texto (notepad++, Textmate,Vim)
• IDE Java - Eclipse ou Netbeans (Opcional)
Ambientes Unix

• Baixar o Framework
• Extrair para uma pasta desejada (Ex: /opt/)
• Adicionar o caminho no $PATH;
Ambientes Unix
• Dica: Editar o arquivo .bashrc e adicionar a
  linha a seguir:

          export PATH=$PATH:/opt/play-1.1/
Ambientes Windows
• Baixar o Framework
• Extrair para uma pasta desejada (Ex: C:)
  (Recomendado extrair para C: ou diretórios sem espaços para evitar
  problemas futuros.)


• Adicionar o caminho no $PATH;
Testando a instalação
Testando a instalação
Criando e rodando
  uma aplicação
Criando a aplicação
     play new flisol



Rodando a aplicação
     play run flisol
Estrutura das pastas
Configurando o projeto
    para o Eclipse

   play eclipsify flisol
Definindo o banco
   de dados
Editando o arquivo
conf/application.conf
Criando os Modelos
package models;

import   play.*;
import   play.db.jpa.*;
import   javax.persistence.*;
import   java.util.*;

@Entity
public class foo extends Model {
   // Seu Código aqui
}
Selecionando itens
    do Modelo
      List<User> user = User.all();


            List<User> user =
 User.find("admin = ?", "true").fetch();


      User user = User.findById(1);
Salvando e Atualizando
itens do Banco de Dados
 User user = new User("foo", "bar", "a@a.com");
                  user.save();


         User user = User.findById(1);
  user.email = "flisol@rn.softwarelivre.org";
                  user.save();
Deletando itens do Banco
       de Dados
     User user = User.findById(1);
            user.delete();
Criando os Controllers
package controllers;

import   play.*;
import   play.mvc.*;
import   java.util.*;
import   models.*;

public class Application extends Controller {
    public static void index() {
       render();
    }
}
Interceptações -
Controllers Annotations

• @Before - Antes da ação ser chamada
• @After - Depois da ação ser chamada
• @Finally - Depois da ação ser executada
  completamente
Controllers Annotations
@Before - Antes da ação ser chamada
@Before(unless={“login”,“notauthorised”})
static void checkAdmin() {
  String usr = session.get(“user”);
  if (usr == null) {
    login();
  } else {
    User user = User.find(“byUsername”,
usr).first(); if (!user.isAdmin) {
      notauthorised();
    }
  }
}
Controllers Annotations
@After - Depois da ação ser chamada
public class Admin extends Application {
    @After
    static void log() {
        Logger.info("Action executed ...");
    }

    public static void index() {
        List<User> users = User.findAll();
        render(users);
    }
}
Controllers Annotations
@Finally - Depois da ação ser executada completamente

public class Admin extends Application {
    @Finally
    static void log() {
        Logger.info("Response contains : " +
response.out);
    }

    public static void index() {
        List<User> users = User.findAll();
        render(users);
    }
}
Tipos de Resultado -
Controllers Response Result Types


• render()        • renderJSON()
• renderText()    • renderBinary()
• renderXML()     • redirect()
Definindo o layout da app
 <!DOCTYPE html>
 <html>
     <head>
         <title>#{get 'title' /}</title>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
         <link rel="stylesheet" type="text/css" media="screen" href="@{'/
 public/stylesheets/main.css'}">
         #{get 'moreStyles' /}
         <link rel="shortcut icon" type="image/png" href="@{'/public/images/
 favicon.png'}">
         <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}"
 type="text/javascript" charset="utf-8"></script>
         #{get 'moreScripts' /}
     </head>
     <body>
         #{doLayout /}
     </body>
 </html>




          Arquivo app/views/application.html
Criando as Views
#{extends 'application.html' /}
#{set title:'Listagem dos Contatos' /}

#{if contatos.size() == 0}
  <div class="linha">
    <p>Nenhum contato cadastrado.</p>
  </div>
#{/if}
#{else}
  #{list items:contatos, as:'contato'}
    <div class="linha">
       <p><a href="@{Application.visualizar(contato.email)}">&raquo; $
{contato.nome} - ${contato.email}</a></p>
    </div>
  #{/list}
#{/else}



    Arquivo app/views/application/index.html
Engine de Templates (Groovy)
Expressões - ${...}

        <h1>Hello ${myName ?: 'guest'}!</h1>


Tags - #{...}

   <li>#{a @Application.admin()}Admin#{/a}</li>


Ações - @{...}

        #{a @Application.admin()}Admin#{/a}
Engine de Templates (Groovy)
Mensagens - &{...}

        <h1>Hello ${myName ?: 'guest'}!</h1>


Comentários - *{...}*
 *{ Loop through the list of users and output each
           user wrapped in a <li> tag }*


Scripts - %{...}%
     %{ fullname = user.firstname + “ “ + user.lastname; }%
                  <h1>Welcome ${fullname}!</h1>
Validações de campos
public static void register(String user, String email,
String password) {
  validation.required(user);
  validation.email(email);
  validation.minSize(password, 6);
  validation.maxSize(password, 10);

    if (user == null || user.length() == 0) {
        validation.addError(“user”, "You must enter a
    username");
    }

    render();
}


                Exemplo de validação básica
Validações de campos
public static void register(String user, String
email, String password) {
  validation.required(user).message("You must enter a
username.");
  validation.email(email).message("You must enter a
valid email address.");
  validation.minSize(password, 6).message("Passwords
must be at least 6 characters long.");
  validation.maxSize(password, 10).message("Passwords
must be no more than 10 characters long.");

    render();
}



     Exemplo de validação básica com mensagens personalizadas.
Validações de campos
public static void register(String user, String email, String
password) {
  // Código do Slide Anterior

    if(validation.hasErrors()) {
      params.flash();
      validation.keep();
      registrationForm();
    }

    render();
}




     Exemplo de redirecionamento caso exista erros de validação.
Validações de campos
#{ifErrors}
  <h1>Errors Encountered</h1>
  <p>There were validation errors encountered while processing
your registration
  request.</p>
  <ul>
    #{errors}
       <li>${error}</li>
    #{/errors}
  </ul>
  <p>Please go back and check the details and try again</p>
#{/ifErrors}
#{else}
  The registration process was successful!
#{/else}



            Exemplo de visualização dos erros na view.
Instalando Módulos
       no Play!
Instalando o módulo PDF

   play install pdf
Carregando o módulo PDF
     para a aplicação
  module.pdf=${play.path}/modules/pdf-head


  Adicionar esta linha ao final do arquivo
          config/application.conf
Exemplo de uso do
       módulo PDF
package controllers;

import play.mvc.*;
import static play.modules.pdf.PDF.*;

public Application extends Controller {
  public static void index() {
    renderPDF();
  }
}
Dúvidas?
Para maiores informações sobre o
        Play! Framework

 http://www.playframework.org
http://www.the-play-book.co.uk/
Confira o código das aplicações
       finalizadas em:

  www.github.com/
  grupoweblovers
Não deixem de se cadastrarem no
    nosso grupo de estudos!

 www.grupoweblovers.co.cc
Obrigado!

Mais conteúdo relacionado

Mais procurados

Introdução À Automação de Testes com Selenium
Introdução À Automação de Testes com SeleniumIntrodução À Automação de Testes com Selenium
Introdução À Automação de Testes com Seleniumrodrigogouveia
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Tchelinux
 
Curso de Ruby on Rails - Aula 04
Curso de Ruby on Rails - Aula 04Curso de Ruby on Rails - Aula 04
Curso de Ruby on Rails - Aula 04Maurício Linhares
 
Como criar um plugin para WordPress
Como criar um plugin para WordPressComo criar um plugin para WordPress
Como criar um plugin para WordPressLeandrinho Vieira
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureVitor Ciaramella
 
2009 05 20 Floripa Flex
2009 05 20 Floripa Flex2009 05 20 Floripa Flex
2009 05 20 Floripa FlexEduardo Kraus
 
Autenticação e Controle de Acesso
Autenticação e Controle de AcessoAutenticação e Controle de Acesso
Autenticação e Controle de AcessoDenis L Presciliano
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 
Pg2
Pg2Pg2
Pg2csmp
 
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontMichel Ribeiro
 
Seminário PHP Injection/ SQL Injection
Seminário PHP Injection/ SQL InjectionSeminário PHP Injection/ SQL Injection
Seminário PHP Injection/ SQL InjectionDavi Rodrigues
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaCharles Kilesse
 
Programação Dinâmica para Web - Aula 2
Programação Dinâmica para Web - Aula 2Programação Dinâmica para Web - Aula 2
Programação Dinâmica para Web - Aula 2Thyago Maia
 
Symfony - Framework PHP de alta produtividade
Symfony - Framework PHP de alta produtividadeSymfony - Framework PHP de alta produtividade
Symfony - Framework PHP de alta produtividadeHugo Magalhães
 
Minicurso Testando RESTful Web Services
Minicurso Testando RESTful Web ServicesMinicurso Testando RESTful Web Services
Minicurso Testando RESTful Web ServicesCharles Kilesse
 

Mais procurados (20)

Introdução À Automação de Testes com Selenium
Introdução À Automação de Testes com SeleniumIntrodução À Automação de Testes com Selenium
Introdução À Automação de Testes com Selenium
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
Java script aula 09 - JQuery
Java script   aula 09 - JQueryJava script   aula 09 - JQuery
Java script aula 09 - JQuery
 
Java script aula 07 - j-query
Java script   aula 07 - j-queryJava script   aula 07 - j-query
Java script aula 07 - j-query
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
 
Curso de Ruby on Rails - Aula 04
Curso de Ruby on Rails - Aula 04Curso de Ruby on Rails - Aula 04
Curso de Ruby on Rails - Aula 04
 
Como criar um plugin para WordPress
Como criar um plugin para WordPressComo criar um plugin para WordPress
Como criar um plugin para WordPress
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows Azure
 
2009 05 20 Floripa Flex
2009 05 20 Floripa Flex2009 05 20 Floripa Flex
2009 05 20 Floripa Flex
 
Autenticação e Controle de Acesso
Autenticação e Controle de AcessoAutenticação e Controle de Acesso
Autenticação e Controle de Acesso
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 
Pg2
Pg2Pg2
Pg2
 
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
 
Seminário PHP Injection/ SQL Injection
Seminário PHP Injection/ SQL InjectionSeminário PHP Injection/ SQL Injection
Seminário PHP Injection/ SQL Injection
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completa
 
Aula 8 - SQL Injection
Aula 8 - SQL InjectionAula 8 - SQL Injection
Aula 8 - SQL Injection
 
Programação Dinâmica para Web - Aula 2
Programação Dinâmica para Web - Aula 2Programação Dinâmica para Web - Aula 2
Programação Dinâmica para Web - Aula 2
 
Symfony - Framework PHP de alta produtividade
Symfony - Framework PHP de alta produtividadeSymfony - Framework PHP de alta produtividade
Symfony - Framework PHP de alta produtividade
 
Minicurso Testando RESTful Web Services
Minicurso Testando RESTful Web ServicesMinicurso Testando RESTful Web Services
Minicurso Testando RESTful Web Services
 
Plugin zend acl
Plugin zend aclPlugin zend acl
Plugin zend acl
 

Semelhante a Desenvolvendo aplicações Web com Java sem dor usando o Play Framework

Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPelliando dias
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php segurosDouglas V. Pasqua
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Fabrízio Mello
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
Google Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteGoogle Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteJohann Vivot
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosRodrigo Nossal
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0Saulo Vallory
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 

Semelhante a Desenvolvendo aplicações Web com Java sem dor usando o Play Framework (20)

Python 08
Python 08Python 08
Python 08
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHP
 
Vraptor
VraptorVraptor
Vraptor
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php seguros
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Spring MVC - QConSP
Spring MVC - QConSPSpring MVC - QConSP
Spring MVC - QConSP
 
Google Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteGoogle Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonte
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 

Desenvolvendo aplicações Web com Java sem dor usando o Play Framework

  • 2. Quem sou Allyson Barros - @allysonbarros Graduando em Análise e Desenvolvimento de Sistemas - IFRN Desenvolvedor Web desde 2006 Idealizador do Grupo WebLovers - http://grupoweblovers.co.cc allysonbarrosrn@gmail.com - allyson_barros_irm@hotmail.com
  • 5. Os Primeiros Passos!
  • 7. Requisitos • JDK 5 ou superior • Editor de Texto (notepad++, Textmate,Vim) • IDE Java - Eclipse ou Netbeans (Opcional)
  • 8. Ambientes Unix • Baixar o Framework • Extrair para uma pasta desejada (Ex: /opt/) • Adicionar o caminho no $PATH;
  • 9. Ambientes Unix • Dica: Editar o arquivo .bashrc e adicionar a linha a seguir: export PATH=$PATH:/opt/play-1.1/
  • 10. Ambientes Windows • Baixar o Framework • Extrair para uma pasta desejada (Ex: C:) (Recomendado extrair para C: ou diretórios sem espaços para evitar problemas futuros.) • Adicionar o caminho no $PATH;
  • 13. Criando e rodando uma aplicação
  • 14. Criando a aplicação play new flisol Rodando a aplicação play run flisol
  • 15.
  • 17. Configurando o projeto para o Eclipse play eclipsify flisol
  • 18. Definindo o banco de dados
  • 20. Criando os Modelos package models; import play.*; import play.db.jpa.*; import javax.persistence.*; import java.util.*; @Entity public class foo extends Model { // Seu Código aqui }
  • 21. Selecionando itens do Modelo List<User> user = User.all(); List<User> user = User.find("admin = ?", "true").fetch(); User user = User.findById(1);
  • 22. Salvando e Atualizando itens do Banco de Dados User user = new User("foo", "bar", "a@a.com"); user.save(); User user = User.findById(1); user.email = "flisol@rn.softwarelivre.org"; user.save();
  • 23. Deletando itens do Banco de Dados User user = User.findById(1); user.delete();
  • 24. Criando os Controllers package controllers; import play.*; import play.mvc.*; import java.util.*; import models.*; public class Application extends Controller { public static void index() { render(); } }
  • 25. Interceptações - Controllers Annotations • @Before - Antes da ação ser chamada • @After - Depois da ação ser chamada • @Finally - Depois da ação ser executada completamente
  • 26. Controllers Annotations @Before - Antes da ação ser chamada @Before(unless={“login”,“notauthorised”}) static void checkAdmin() { String usr = session.get(“user”); if (usr == null) { login(); } else { User user = User.find(“byUsername”, usr).first(); if (!user.isAdmin) { notauthorised(); } } }
  • 27. Controllers Annotations @After - Depois da ação ser chamada public class Admin extends Application { @After static void log() { Logger.info("Action executed ..."); } public static void index() { List<User> users = User.findAll(); render(users); } }
  • 28. Controllers Annotations @Finally - Depois da ação ser executada completamente public class Admin extends Application { @Finally static void log() { Logger.info("Response contains : " + response.out); } public static void index() { List<User> users = User.findAll(); render(users); } }
  • 29. Tipos de Resultado - Controllers Response Result Types • render() • renderJSON() • renderText() • renderBinary() • renderXML() • redirect()
  • 30. Definindo o layout da app <!DOCTYPE html> <html> <head> <title>#{get 'title' /}</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" media="screen" href="@{'/ public/stylesheets/main.css'}"> #{get 'moreStyles' /} <link rel="shortcut icon" type="image/png" href="@{'/public/images/ favicon.png'}"> <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script> #{get 'moreScripts' /} </head> <body> #{doLayout /} </body> </html> Arquivo app/views/application.html
  • 31. Criando as Views #{extends 'application.html' /} #{set title:'Listagem dos Contatos' /} #{if contatos.size() == 0} <div class="linha"> <p>Nenhum contato cadastrado.</p> </div> #{/if} #{else} #{list items:contatos, as:'contato'} <div class="linha"> <p><a href="@{Application.visualizar(contato.email)}">&raquo; $ {contato.nome} - ${contato.email}</a></p> </div> #{/list} #{/else} Arquivo app/views/application/index.html
  • 32. Engine de Templates (Groovy) Expressões - ${...} <h1>Hello ${myName ?: 'guest'}!</h1> Tags - #{...} <li>#{a @Application.admin()}Admin#{/a}</li> Ações - @{...} #{a @Application.admin()}Admin#{/a}
  • 33. Engine de Templates (Groovy) Mensagens - &{...} <h1>Hello ${myName ?: 'guest'}!</h1> Comentários - *{...}* *{ Loop through the list of users and output each user wrapped in a <li> tag }* Scripts - %{...}% %{ fullname = user.firstname + “ “ + user.lastname; }% <h1>Welcome ${fullname}!</h1>
  • 34. Validações de campos public static void register(String user, String email, String password) { validation.required(user); validation.email(email); validation.minSize(password, 6); validation.maxSize(password, 10); if (user == null || user.length() == 0) { validation.addError(“user”, "You must enter a username"); } render(); } Exemplo de validação básica
  • 35. Validações de campos public static void register(String user, String email, String password) { validation.required(user).message("You must enter a username."); validation.email(email).message("You must enter a valid email address."); validation.minSize(password, 6).message("Passwords must be at least 6 characters long."); validation.maxSize(password, 10).message("Passwords must be no more than 10 characters long."); render(); } Exemplo de validação básica com mensagens personalizadas.
  • 36. Validações de campos public static void register(String user, String email, String password) { // Código do Slide Anterior if(validation.hasErrors()) { params.flash(); validation.keep(); registrationForm(); } render(); } Exemplo de redirecionamento caso exista erros de validação.
  • 37. Validações de campos #{ifErrors} <h1>Errors Encountered</h1> <p>There were validation errors encountered while processing your registration request.</p> <ul> #{errors} <li>${error}</li> #{/errors} </ul> <p>Please go back and check the details and try again</p> #{/ifErrors} #{else} The registration process was successful! #{/else} Exemplo de visualização dos erros na view.
  • 39. Instalando o módulo PDF play install pdf
  • 40. Carregando o módulo PDF para a aplicação module.pdf=${play.path}/modules/pdf-head Adicionar esta linha ao final do arquivo config/application.conf
  • 41. Exemplo de uso do módulo PDF package controllers; import play.mvc.*; import static play.modules.pdf.PDF.*; public Application extends Controller { public static void index() { renderPDF(); } }
  • 43. Para maiores informações sobre o Play! Framework http://www.playframework.org http://www.the-play-book.co.uk/
  • 44. Confira o código das aplicações finalizadas em: www.github.com/ grupoweblovers
  • 45. Não deixem de se cadastrarem no nosso grupo de estudos! www.grupoweblovers.co.cc