Upload
keuller-magalhaes
View
1.311
Download
2
Embed Size (px)
DESCRIPTION
Apresentação realizada na UNIDAVI em Rio do Sul, no evento do grupo de usuários Java local, JAVale!
Citation preview
Play! Framework
Keuller Magalhães
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” % “mysqlconnectorjava” % “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/jquery1.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
www.playframework.com.br