SlideShare ist ein Scribd-Unternehmen logo
1 von 49
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Desenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHPDesenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHPSérgio Vilar
 
Anatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesAnatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesRafael Ponte
 
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e ZendAnálise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e ZendThiago Sinésio
 
Desenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e ServletsDesenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e ServletsIgo Coelho
 
Arquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAOArquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAOLeonardo Sousa
 
JSF e outras tecnologias Java Web - IMES.java
JSF e outras tecnologias Java Web - IMES.javaJSF e outras tecnologias Java Web - IMES.java
JSF e outras tecnologias Java Web - IMES.javaEduardo Bregaida
 
As grandes novidades do JSF 2.0!
As grandes novidades do JSF 2.0!As grandes novidades do JSF 2.0!
As grandes novidades do JSF 2.0!Diego Santos
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
JavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividadeJavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividadeRafael Ponte
 
Spring 3: Uma Plataforma além do Framework
Spring 3: Uma Plataforma além do FrameworkSpring 3: Uma Plataforma além do Framework
Spring 3: Uma Plataforma além do FrameworkDr. Spock
 
Introdução ao JavaServer Faces
Introdução ao JavaServer FacesIntrodução ao JavaServer Faces
Introdução ao JavaServer FacesWillian Watanabe
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks phpIgor Moura
 
Desafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFDesafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFRafael Ponte
 
Java 8 - A Evolução da Linguagem
Java 8 - A Evolução da LinguagemJava 8 - A Evolução da Linguagem
Java 8 - A Evolução da LinguagemPetronio Candido
 
Introdução a Grails: Um framework veloz e poderoso
Introdução a Grails: Um framework veloz e poderosoIntrodução a Grails: Um framework veloz e poderoso
Introdução a Grails: Um framework veloz e poderosoBruno Lopes
 

Was ist angesagt? (20)

Desenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHPDesenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHP
 
Anatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesAnatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer Faces
 
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e ZendAnálise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
 
Desenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e ServletsDesenvolvimento web em java com JSP e Servlets
Desenvolvimento web em java com JSP e Servlets
 
Arquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAOArquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAO
 
JSF e outras tecnologias Java Web - IMES.java
JSF e outras tecnologias Java Web - IMES.javaJSF e outras tecnologias Java Web - IMES.java
JSF e outras tecnologias Java Web - IMES.java
 
As grandes novidades do JSF 2.0!
As grandes novidades do JSF 2.0!As grandes novidades do JSF 2.0!
As grandes novidades do JSF 2.0!
 
Aula parte 2 de JSF 2.2
Aula parte 2 de JSF 2.2Aula parte 2 de JSF 2.2
Aula parte 2 de JSF 2.2
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
JavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividadeJavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividade
 
Apresentação jsf 1_2
Apresentação jsf 1_2Apresentação jsf 1_2
Apresentação jsf 1_2
 
Spring 3: Uma Plataforma além do Framework
Spring 3: Uma Plataforma além do FrameworkSpring 3: Uma Plataforma além do Framework
Spring 3: Uma Plataforma além do Framework
 
Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018
 
Introdução ao JavaServer Faces
Introdução ao JavaServer FacesIntrodução ao JavaServer Faces
Introdução ao JavaServer Faces
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
Desafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFDesafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSF
 
Java 8 - A Evolução da Linguagem
Java 8 - A Evolução da LinguagemJava 8 - A Evolução da Linguagem
Java 8 - A Evolução da Linguagem
 
Framework web 02 - 2016
Framework web 02 - 2016Framework web 02 - 2016
Framework web 02 - 2016
 
Introdução a Grails: Um framework veloz e poderoso
Introdução a Grails: Um framework veloz e poderosoIntrodução a Grails: Um framework veloz e poderoso
Introdução a Grails: Um framework veloz e poderoso
 
Apresentação JSF
Apresentação JSFApresentação JSF
Apresentação JSF
 

Ähnlich wie Play! Framework Introdução

Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Lucas Augusto Carvalho
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com AngularElmano Cavalcanti
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Alex Guido
 
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como CódigoCurso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como CódigoGuilhermeJorgeAragod
 
Minicurso code igniter aula 2
Minicurso code igniter   aula 2Minicurso code igniter   aula 2
Minicurso code igniter aula 2lfernandomcj
 
Desenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosDesenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosRodolfo Fadino Junior
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Eric Gallardo
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniterAnderson Gonçalves
 
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...WeOp - The Operations Summit
 
Entendendo Frameworks web com Python
Entendendo Frameworks web com PythonEntendendo Frameworks web com Python
Entendendo Frameworks web com PythonLuiz Aldabalde
 
Entendendo Framework Web com Python
Entendendo Framework Web com PythonEntendendo Framework Web com Python
Entendendo Framework Web com PythonPythOnRio
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifaguestea329c
 
Documentação CakePHP - Português Br
Documentação CakePHP -  Português BrDocumentação CakePHP -  Português Br
Documentação CakePHP - Português BrLuiz Ladeira
 

Ähnlich wie Play! Framework Introdução (20)

Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
Grails
GrailsGrails
Grails
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.
 
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como CódigoCurso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
 
Minicurso code igniter aula 2
Minicurso code igniter   aula 2Minicurso code igniter   aula 2
Minicurso code igniter aula 2
 
Desenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosDesenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São Carlos
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniter
 
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
 
Entendendo Frameworks web com Python
Entendendo Frameworks web com PythonEntendendo Frameworks web com Python
Entendendo Frameworks web com Python
 
Entendendo Framework Web com Python
Entendendo Framework Web com PythonEntendendo Framework Web com Python
Entendendo Framework Web com Python
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifa
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
Documentação CakePHP - Português Br
Documentação CakePHP -  Português BrDocumentação CakePHP -  Português Br
Documentação CakePHP - Português Br
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Oficial
OficialOficial
Oficial
 

Play! Framework Introdução

  • 2. 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. 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
  • 10. 10 Play! no Mundo Estatística do Google Trends Junho/2013!
  • 11. 11 Play! no Mundo Estatística do 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 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. 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 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. 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. 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/
  • 20. 20 Agenda  O que é ?  Play! No Mundo  Arquitetura de Componentes  Projeto  Rotas e Controladores  Modelos  Views
  • 21. 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. 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  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. 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. 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. 26 Rotas e Controladores  Se executarmos 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 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. 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. 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ã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. 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. 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. 34 Agenda  O que é ?  Play! No Mundo  Arquitetura de Componentes  Projeto  Rotas e Controladores  Modelos  Views
  • 35. 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. 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. 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. 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. 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>
  • 41. 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. 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. 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. 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. 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. 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. 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)