Play! Framework
Keuller Magalhães
keuller.magalhaes@gmail.com
www.playframework.com.br
2013
2
Sobre...
Coordenador de desenvolvimento e projetos na área de
telecom;
Entusiasta de metodologias ágeis Lean, Scrum, XP, Kanban e
desenvolvimento Web, HTML5 e noSQL;
Possui algumas certificações de mercado, como: SCJA, SCJP,
SCEA, CSM, CSPO e CSD;
Viciado em jogos (Halo, CoD, Skyrim, Assassins
Creed,DarkSiders)
Criador do site da comunidade brasileira
www.playframework.com.br
3
Agenda
 O que é ?

Play! No Mundo

Arquitetura de Componentes

Projeto

Rotas e Controladores

Modelos

Views
4
Agenda
 O que é ?

Play! No Mundo

Arquitetura de Componentes

Projeto

Rotas e Controladores

Modelos

Views
5
O que é ?

Framework Web “full-stack”

Suporte as linguagens Java e Scala

I/O assíncrono

Suporte a tecnologias emergentes

WebSockets, Comet, HTML5, JSON, etc.

Mecanismo de templates dinâmicos e compilados
6
O que é ?

Estrutura de URLs padrão REST

Segue o modelo de convenção sob configuração

Suporte a agendamento/enfileiramento – Akka

Ferramenta de build integrada (SBT)

Console de desenvolvimento interativo

Integração entre Modelo e armazenamento de
dados
7
O que é ?

Não é JavaEE compliance

Hot deployment

Suporte a validação automática de formulários

Integração com IDEs de mercado

Eclipse, IDEA, Netbeans

Comunidade forte e ativa
8
Agenda
 O que é ?

Play! No Mundo

Arquitetura de Componentes

Projeto

Rotas e Controladores

Modelos

Views
9
Play! no Mundo
10
Play! no Mundo
Estatística do Google Trends Junho/2013!
11
Play! no Mundo
Estatística do Google Trends Junho/2013!
12
Agenda
 O que é ?

Play! No Mundo

Arquitetura de Componentes

Projeto

Rotas e Controladores

Modelos

Views
13
Arquitetura de Componentes
HTTP
Routes
Cotroladores
Model ModelHTML XML JSON
Baseada em padrões:
● MVC
● Page Controller
● Separation of Concern
● DRY
● Active Record
● Low Coupling
● High Cohesion
● Single Responsability
● Interface segregation
● Dependency Inversion
● YAGNI
14
Arquitetura de Componentes
●
Componentes:
●
Rotas (URLs)
●
Controladores (fluxo)
●
Modelos (entidades)
●
Templates (views)
●
Extensão através de plugins
●
Suporte a aplicações modulares
Simples Assim!!! :-)
15
Agenda
 O que é ?

Play! No Mundo

Arquitetura de Componentes

Projeto

Rotas e Controladores

Modelos

Views
16
Projeto
 Precisa de uma versão do Java 1.6+

Podemos fazer o download do Play!
www.playframework.org
www.playframework.com.br

Devemos descompactá-lo numa pasta

Adicionamos o caminho da pasta no classpath do
sistema
export PATH=”$PATH:$PLAY_HOME”
17
Projeto

Criamos uma aplicação com Play!
$ play new todo

Podemos escolher dois templates de projeto
1 – criar uma aplicação Scala
2 – criar uma aplicação Java

Depois acessamos a pasta do projto
$ cd todo
18
Projeto

Acessando o console do Play!
$ play

Para compilar nossa aplicação, basta digitar
$ compile

Para executarmos a aplicação, basta digitar:
$ run

Apontamos o navegador para a URL:
http://localhost:9000/
19
Projeto
20
Agenda
 O que é ?

Play! No Mundo

Arquitetura de Componentes

Projeto

Rotas e Controladores

Modelos

Views
21
Rotas e Controladores

Rotas são mapeamentos entre URL e controladores
 O arquivo conf/routes contem a definição de
todas as rotas de sua aplicação
GET   /     controllers.Application.index()

Esse mapeamento nos dá três informações:

Método HTTP usado GET

Caminho da requisição /

Método de ação index() da classe Application
22
Rotas e Controladores

Play! é um framework MVC (baseado em ação)

Um controlador é uma classe Java dentro do
pacote controllers e que estende a classe
Controller

Uma ação é um método público estático que
retorna um objeto Result
23
Rotas e Controladores

Vejamos o controlador padrão:
package controllers;
import play.*;
import play.mvc.*;
import views.html.*;
public class Application extends Controller {
  
  public static Result index() {
    return ok(index.render("Your new application is ready."));
  }
}
24
Rotas e Controladores

Vamos definir as rotas para nossa aplicação
# ponto de entrada da aplicacao
GET    / controllers.Application.index()
# CRUD tarefas
GET /tarefas controllers.TarefaController.lista()
POST /tarefas controllers.TarefaController.criar()
POST /tarefas/excluir/:id
controllers.TarefaController.excluir(id: Int)

Temos 3 rotas, sendo que:
primeira: lista as tarefas existentes
segunda: cria uma nova tarefa
terceira: remove uma tarefa pelo id
25
Rotas e Controladores

Vamos definir a classe controladora
public class TarefaController extends Controller {
   public static Result lista() {
      return TODO;
   }
   public static Result criar() {
   return TODO;
   }
   public static Result excluir(Integer id) {
      return TODO;
   }
}
TODO é um tipo de retorno 501 Not Implemented, útil durante o desenvolvimento.
26
Rotas e Controladores

Se executarmos nossa aplicação, veremos
27
Agenda
 O que é ?

Play! No Mundo

Arquitetura de Componentes

Projeto

Rotas e Controladores

Modelos

Views
28
Modelos
 Um objeto de modelo é na verdade um POJO
 O modelo pode ser usado como uma representação
da uma entidade do banco de dados
 Play! oferece suporte a dois mecanismos de
persistência (ORM):
 Ebean
 JPA
 A configuração padrão usa Ebean ORM
29
Modelos
 Criando nosso objeto de modelo
public class Tarefa {
public Integer id;
public String descricao;
public static List<Tarefa> readAll() {
   return new ArrayList<Tarefa>();
}
public static void create(Tarefa bean) {
}
public static void delete(Integer id) {
}
}
30
Modelos

Por padrão Play! usa o banco H2 embarcado

Para utilizarmos o MySQL5, precisamos do driver
 Edite o arquivo project/Build.scala
val appDependencies = Seq(
   “mysql” % “mysql­connector­java” % “5.1.25”,
   javaCore,
   javaJdbc,
   JavaEbean
)
31
Modelos

Configurando nossa conexão com banco de dados
 Edite o arquivo conf/application.conf
db.default.driver=”com.mysql.jdbc.Driver”
db.default.url=”jdbc:mysql://localhost/play”
db.default.user=root
db.default.password=”admin123”

Para ativar o controle do Ebean, devemos descomentar
ebean.defaults=”models.*”

Precisamos transformar nosso modelo numa
entidade persistente
32
Modelos
 Adaptando nossa classe de modelo
@Entity
public class Tarefa extends Model {
@Id
public Integer id;
@Column(length=35)
public String descricao;
public static Finder<Integer,Tarefa> finder =
    new Finder(Integer.class, Tarefa.class);
...
}
33
Modelos
 Implementando os métodos de persistência
@Entity
public class Tarefa extends Model {
...
        public static List<Tarefa> readAll() {
           return finder.all();
        }
        public static void create(Tarefa bean) {
           bean.save();
        }
        public static void delete(Integer id) {
           finder.ref(id).delete();
        }
}
34
Agenda
 O que é ?

Play! No Mundo

Arquitetura de Componentes

Projeto

Rotas e Controladores

Modelos

Views
35
Views

Uma é um template de página HTML com código de
script Scala

Todo template é compilado em byte code

Todo template deve estar contido na pasta views

Todo template deve ter a extensão .scala.html

Play! ainda não possui uma biblioteca de
componentes visuais para criação de interfaces
gráficas
36
Views

Vejamos o template da view →
app/views/index.scala.html
@(message: String)
@main(“Welcome Play 2.0”) {
 @play20.welcome(message)
}

Neste caso estamos criando uma view, baseada
numa página de layout padrão main.scala.html
37
Views

Templates podem receber parâmetros de qualquer
tipo de dados

Usamos o caracter especial @ para informar comando
Scala no template

Em nosso exemplo anterior, estamos passando um
parâmetro do tipo String, na variável message
@(message: String)
38
Views

O mecanismo de templates do Play! nos permite
reutilizar outros templates

views bases para as páginas da aplicação

Em nosso exemplo anterior, estamos usando o
template main.scala.html como base da nossa
página
39
Views

Vejamos o código do template index.scala.html
@(title: String)(content: Html)
<!DOCTYPE html>
<html>
<head>
    <title>@title</title>
    <link rel="stylesheet" media="screen" 
          href="@routes.Assets.at("css/main.css")">
    <link rel="shortcut icon" type="image/png" 
          href="@routes.Assets.at("images/favicon.png")">
    <script type="text/javascript" 
src="@routes.Assets.at("javascripts/jquery­1.9.0.min.js")">
</script>
</head>
<body>
    @content
</body>
</html>
40
Views
@(tasks: List[Tarefa], taskForm: Form[Tarefa])
@import helper._
@main("Lista de Tarefas") {    
    <h1>@tasks.size() tarefa(s)</h1>    
    <ul>
        @for(task <­ tasks) {
            <li>
                @task.descricao
                @form(routes.TarefaController.excluir(task.id)) {
                    <input type="submit" value="Delete">
                }
            </li>
        }
    </ul>
}
41
Views

No template anterior criamos um código para
exibir uma lista de tarefas, bem simples

Nosso template recebe dois parâmetros

uma lista de tarefas

um objeto Form, baseado em nosso modelo
@(tasks: List[Tarefa], taskForm: Form[Tarefa])

Logo após realizamos a importação de helpers
   @import helper._
 Depois usamos um comando @for() padrão para
exibir os itens da coleção tasks
42
Views
●
Para completar nosso template, adicionamos o código a
seguir:
    <h2>Criar tarefa</h2>
    @form(routes.TarefaController.criar()) {
        @inputText(taskForm("descricao")) 
        <input type="submit" value="Create">
    }

No trecho acima criamos um formulário usando o helper
@form()

O helper recebe como argumento a rota da ação que
deverá ser invocada, quando o formulário for submetido

Também usamos o helper @inputText() para criar uma
caixa de texto baseada num campo do formulário
43
Views
 Implementando o método de ação lista()
public class TarefaController extends Controller {
   static Form<Tarefa> taskForm = Form.form(Tarefa.class);
   // exibe a pagina index.scala.html passando dois 
   // parametros: List<Tarefa> e Form<Tarefa>
   public static Result lista() {
      return ok(views.html.index
         .render(Tarefa.readAll(), taskForm));
   }
   ...
}
44
Views
 Implementando o método de ação criar()
public class TarefaController extends Controller {
   public static Result criar() {
      Form<Tarefa> form = taskForm.bindFromRequest();
      if (form.hasErrors()) {
         return badRequest(index.render(
                    Tarefa.readAll(), form));
      }
      Tarefa.create(form.get());
      return redirect(routes.TarefaController.lista());
   }
   ...
}
45
Views
 Implementando o método de ação excluir()
public class TarefaController extends Controller {
   public static Result excluir(Integer id) {
      Tarefa.delete(id);
      return redirect(routes.TarefaController.lista());
   }
}
46
Conclusão

Play! é um full-stack Web framework

Suporte nativamente as linguagens: Scala e Java

Segue o modelo MVC

Integração entre as camadas bastante consistente
e simples

Mecanismo de build integradao com SBT

Suporte a template dinâmicos
47
Conclusão

Possui dezenas de plugins (extensão)

Permite desenvolvimento modular de aplicações

É suportado por diversos provedores Cloud

CloudBees, Heroku, OpenShift, etc.

Suporte a tecnologias emergentes:

WebSockets, Comet, JSON, HTML5, etc.

Permite criar validações diretamente no modelo

Mecanismos de testes automatizados integrados
(JUnit e Fixtures)
48
Q&A
49
Muito Obrigado!!!
Keuller Magalhães
keuller.magalhaes@gmail.com
www.playframework.com.br

Introdução Play framework

  • 1.
  • 2.
    2 Sobre... Coordenador de desenvolvimentoe projetos na área de telecom; Entusiasta de metodologias ágeis Lean, Scrum, XP, Kanban e desenvolvimento Web, HTML5 e noSQL; Possui algumas certificações de mercado, como: SCJA, SCJP, SCEA, CSM, CSPO e CSD; Viciado em jogos (Halo, CoD, Skyrim, Assassins Creed,DarkSiders) Criador do site da comunidade brasileira www.playframework.com.br
  • 3.
    3 Agenda  O queé ?  Play! No Mundo  Arquitetura de Componentes  Projeto  Rotas e Controladores  Modelos  Views
  • 4.
    4 Agenda  O queé ?  Play! No Mundo  Arquitetura de Componentes  Projeto  Rotas e Controladores  Modelos  Views
  • 5.
    5 O que é?  Framework Web “full-stack”  Suporte as linguagens Java e Scala  I/O assíncrono  Suporte a tecnologias emergentes  WebSockets, Comet, HTML5, JSON, etc.  Mecanismo de templates dinâmicos e compilados
  • 6.
    6 O que é?  Estrutura de URLs padrão REST  Segue o modelo de convenção sob configuração  Suporte a agendamento/enfileiramento – Akka  Ferramenta de build integrada (SBT)  Console de desenvolvimento interativo  Integração entre Modelo e armazenamento de dados
  • 7.
    7 O que é?  Não é JavaEE compliance  Hot deployment  Suporte a validação automática de formulários  Integração com IDEs de mercado  Eclipse, IDEA, Netbeans  Comunidade forte e ativa
  • 8.
    8 Agenda  O queé ?  Play! No Mundo  Arquitetura de Componentes  Projeto  Rotas e Controladores  Modelos  Views
  • 9.
  • 10.
    10 Play! no Mundo Estatísticado Google Trends Junho/2013!
  • 11.
    11 Play! no Mundo Estatísticado Google Trends Junho/2013!
  • 12.
    12 Agenda  O queé ?  Play! No Mundo  Arquitetura de Componentes  Projeto  Rotas e Controladores  Modelos  Views
  • 13.
    13 Arquitetura de Componentes HTTP Routes Cotroladores ModelModelHTML XML JSON Baseada em padrões: ● MVC ● Page Controller ● Separation of Concern ● DRY ● Active Record ● Low Coupling ● High Cohesion ● Single Responsability ● Interface segregation ● Dependency Inversion ● YAGNI
  • 14.
    14 Arquitetura de Componentes ● Componentes: ● Rotas(URLs) ● Controladores (fluxo) ● Modelos (entidades) ● Templates (views) ● Extensão através de plugins ● Suporte a aplicações modulares Simples Assim!!! :-)
  • 15.
    15 Agenda  O queé ?  Play! No Mundo  Arquitetura de Componentes  Projeto  Rotas e Controladores  Modelos  Views
  • 16.
    16 Projeto  Precisa deuma versão do Java 1.6+  Podemos fazer o download do Play! www.playframework.org www.playframework.com.br  Devemos descompactá-lo numa pasta  Adicionamos o caminho da pasta no classpath do sistema export PATH=”$PATH:$PLAY_HOME”
  • 17.
    17 Projeto  Criamos uma aplicaçãocom Play! $ play new todo  Podemos escolher dois templates de projeto 1 – criar uma aplicação Scala 2 – criar uma aplicação Java  Depois acessamos a pasta do projto $ cd todo
  • 18.
    18 Projeto  Acessando o consoledo Play! $ play  Para compilar nossa aplicação, basta digitar $ compile  Para executarmos a aplicação, basta digitar: $ run  Apontamos o navegador para a URL: http://localhost:9000/
  • 19.
  • 20.
    20 Agenda  O queé ?  Play! No Mundo  Arquitetura de Componentes  Projeto  Rotas e Controladores  Modelos  Views
  • 21.
    21 Rotas e Controladores  Rotassão mapeamentos entre URL e controladores  O arquivo conf/routes contem a definição de todas as rotas de sua aplicação GET   /     controllers.Application.index()  Esse mapeamento nos dá três informações:  Método HTTP usado GET  Caminho da requisição /  Método de ação index() da classe Application
  • 22.
    22 Rotas e Controladores  Play!é um framework MVC (baseado em ação)  Um controlador é uma classe Java dentro do pacote controllers e que estende a classe Controller  Uma ação é um método público estático que retorna um objeto Result
  • 23.
    23 Rotas e Controladores  Vejamoso controlador padrão: package controllers; import play.*; import play.mvc.*; import views.html.*; public class Application extends Controller {      public static Result index() {     return ok(index.render("Your new application is ready."));   } }
  • 24.
    24 Rotas e Controladores  Vamosdefinir as rotas para nossa aplicação # ponto de entrada da aplicacao GET    / controllers.Application.index() # CRUD tarefas GET /tarefas controllers.TarefaController.lista() POST /tarefas controllers.TarefaController.criar() POST /tarefas/excluir/:id controllers.TarefaController.excluir(id: Int)  Temos 3 rotas, sendo que: primeira: lista as tarefas existentes segunda: cria uma nova tarefa terceira: remove uma tarefa pelo id
  • 25.
    25 Rotas e Controladores  Vamosdefinir a classe controladora public class TarefaController extends Controller {    public static Result lista() {       return TODO;    }    public static Result criar() {    return TODO;    }    public static Result excluir(Integer id) {       return TODO;    } } TODO é um tipo de retorno 501 Not Implemented, útil durante o desenvolvimento.
  • 26.
    26 Rotas e Controladores  Seexecutarmos nossa aplicação, veremos
  • 27.
    27 Agenda  O queé ?  Play! No Mundo  Arquitetura de Componentes  Projeto  Rotas e Controladores  Modelos  Views
  • 28.
    28 Modelos  Um objetode modelo é na verdade um POJO  O modelo pode ser usado como uma representação da uma entidade do banco de dados  Play! oferece suporte a dois mecanismos de persistência (ORM):  Ebean  JPA  A configuração padrão usa Ebean ORM
  • 29.
    29 Modelos  Criando nossoobjeto de modelo public class Tarefa { public Integer id; public String descricao; public static List<Tarefa> readAll() {    return new ArrayList<Tarefa>(); } public static void create(Tarefa bean) { } public static void delete(Integer id) { } }
  • 30.
    30 Modelos  Por padrão Play!usa o banco H2 embarcado  Para utilizarmos o MySQL5, precisamos do driver  Edite o arquivo project/Build.scala val appDependencies = Seq(    “mysql” % “mysql­connector­java” % “5.1.25”,    javaCore,    javaJdbc,    JavaEbean )
  • 31.
    31 Modelos  Configurando nossa conexãocom banco de dados  Edite o arquivo conf/application.conf db.default.driver=”com.mysql.jdbc.Driver” db.default.url=”jdbc:mysql://localhost/play” db.default.user=root db.default.password=”admin123”  Para ativar o controle do Ebean, devemos descomentar ebean.defaults=”models.*”  Precisamos transformar nosso modelo numa entidade persistente
  • 32.
    32 Modelos  Adaptando nossaclasse de modelo @Entity public class Tarefa extends Model { @Id public Integer id; @Column(length=35) public String descricao; public static Finder<Integer,Tarefa> finder =     new Finder(Integer.class, Tarefa.class); ... }
  • 33.
    33 Modelos  Implementando osmétodos de persistência @Entity public class Tarefa extends Model { ...         public static List<Tarefa> readAll() {            return finder.all();         }         public static void create(Tarefa bean) {            bean.save();         }         public static void delete(Integer id) {            finder.ref(id).delete();         } }
  • 34.
    34 Agenda  O queé ?  Play! No Mundo  Arquitetura de Componentes  Projeto  Rotas e Controladores  Modelos  Views
  • 35.
    35 Views  Uma é umtemplate de página HTML com código de script Scala  Todo template é compilado em byte code  Todo template deve estar contido na pasta views  Todo template deve ter a extensão .scala.html  Play! ainda não possui uma biblioteca de componentes visuais para criação de interfaces gráficas
  • 36.
    36 Views  Vejamos o templateda view → app/views/index.scala.html @(message: String) @main(“Welcome Play 2.0”) {  @play20.welcome(message) }  Neste caso estamos criando uma view, baseada numa página de layout padrão main.scala.html
  • 37.
    37 Views  Templates podem receberparâmetros de qualquer tipo de dados  Usamos o caracter especial @ para informar comando Scala no template  Em nosso exemplo anterior, estamos passando um parâmetro do tipo String, na variável message @(message: String)
  • 38.
    38 Views  O mecanismo detemplates do Play! nos permite reutilizar outros templates  views bases para as páginas da aplicação  Em nosso exemplo anterior, estamos usando o template main.scala.html como base da nossa página
  • 39.
    39 Views  Vejamos o códigodo template index.scala.html @(title: String)(content: Html) <!DOCTYPE html> <html> <head>     <title>@title</title>     <link rel="stylesheet" media="screen"            href="@routes.Assets.at("css/main.css")">     <link rel="shortcut icon" type="image/png"            href="@routes.Assets.at("images/favicon.png")">     <script type="text/javascript"  src="@routes.Assets.at("javascripts/jquery­1.9.0.min.js")"> </script> </head> <body>     @content </body> </html>
  • 40.
  • 41.
    41 Views  No template anteriorcriamos um código para exibir uma lista de tarefas, bem simples  Nosso template recebe dois parâmetros  uma lista de tarefas  um objeto Form, baseado em nosso modelo @(tasks: List[Tarefa], taskForm: Form[Tarefa])  Logo após realizamos a importação de helpers    @import helper._  Depois usamos um comando @for() padrão para exibir os itens da coleção tasks
  • 42.
    42 Views ● Para completar nossotemplate, adicionamos o código a seguir:     <h2>Criar tarefa</h2>     @form(routes.TarefaController.criar()) {         @inputText(taskForm("descricao"))          <input type="submit" value="Create">     }  No trecho acima criamos um formulário usando o helper @form()  O helper recebe como argumento a rota da ação que deverá ser invocada, quando o formulário for submetido  Também usamos o helper @inputText() para criar uma caixa de texto baseada num campo do formulário
  • 43.
    43 Views  Implementando ométodo de ação lista() public class TarefaController extends Controller {    static Form<Tarefa> taskForm = Form.form(Tarefa.class);    // exibe a pagina index.scala.html passando dois     // parametros: List<Tarefa> e Form<Tarefa>    public static Result lista() {       return ok(views.html.index          .render(Tarefa.readAll(), taskForm));    }    ... }
  • 44.
    44 Views  Implementando ométodo de ação criar() public class TarefaController extends Controller {    public static Result criar() {       Form<Tarefa> form = taskForm.bindFromRequest();       if (form.hasErrors()) {          return badRequest(index.render(                     Tarefa.readAll(), form));       }       Tarefa.create(form.get());       return redirect(routes.TarefaController.lista());    }    ... }
  • 45.
    45 Views  Implementando ométodo de ação excluir() public class TarefaController extends Controller {    public static Result excluir(Integer id) {       Tarefa.delete(id);       return redirect(routes.TarefaController.lista());    } }
  • 46.
    46 Conclusão  Play! é umfull-stack Web framework  Suporte nativamente as linguagens: Scala e Java  Segue o modelo MVC  Integração entre as camadas bastante consistente e simples  Mecanismo de build integradao com SBT  Suporte a template dinâmicos
  • 47.
    47 Conclusão  Possui dezenas deplugins (extensão)  Permite desenvolvimento modular de aplicações  É suportado por diversos provedores Cloud  CloudBees, Heroku, OpenShift, etc.  Suporte a tecnologias emergentes:  WebSockets, Comet, JSON, HTML5, etc.  Permite criar validações diretamente no modelo  Mecanismos de testes automatizados integrados (JUnit e Fixtures)
  • 48.
  • 49.