Introdução Play framework

Post on 19-May-2015

1.313 views 2 download

description

Apresentação realizada na UNIDAVI em Rio do Sul, no evento do grupo de usuários Java local, JAVale!

Transcript of Introdução Play framework

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 projeto1 – 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çãoGET   /     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 aplicacaoGET    / controllers.Application.index()

# CRUD tarefasGET /tarefas controllers.TarefaController.lista()POST /tarefas controllers.TarefaController.criar()POST /tarefas/excluir/:idcontrollers.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=rootdb.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

@Entitypublic class Tarefa extends Model {

@Idpublic 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

@Entitypublic 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