Introdução Play framework

1,791 views

Published on

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

Published in: Technology

Introdução Play framework

  1. 1. Play! FrameworkKeuller Magalhãeskeuller.magalhaes@gmail.comwww.playframework.com.br2013
  2. 2. 2Sobre...Coordenador de desenvolvimento e projetos na área detelecom;Entusiasta de metodologias ágeis Lean, Scrum, XP, Kanban edesenvolvimento Web, HTML5 e noSQL;Possui algumas certificações de mercado, como: SCJA, SCJP,SCEA, CSM, CSPO e CSD;Viciado em jogos (Halo, CoD, Skyrim, AssassinsCreed,DarkSiders)Criador do site da comunidade brasileirawww.playframework.com.br
  3. 3. 3Agenda O que é ?Play! No MundoArquitetura de ComponentesProjetoRotas e ControladoresModelosViews
  4. 4. 4Agenda O que é ?Play! No MundoArquitetura de ComponentesProjetoRotas e ControladoresModelosViews
  5. 5. 5O 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. 6O 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 dedados
  7. 7. 7O 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. 8Agenda O que é ?Play! No MundoArquitetura de ComponentesProjetoRotas e ControladoresModelosViews
  9. 9. 9Play! no Mundo
  10. 10. 10Play! no MundoEstatística do Google Trends Junho/2013!
  11. 11. 11Play! no MundoEstatística do Google Trends Junho/2013!
  12. 12. 12Agenda O que é ?Play! No MundoArquitetura de ComponentesProjetoRotas e ControladoresModelosViews
  13. 13. 13Arquitetura de ComponentesHTTPRoutesCotroladoresModel ModelHTML XML JSONBaseada 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. 14Arquitetura de Componentes●Componentes:●Rotas (URLs)●Controladores (fluxo)●Modelos (entidades)●Templates (views)●Extensão através de plugins●Suporte a aplicações modularesSimples Assim!!! :-)
  15. 15. 15Agenda O que é ?Play! No MundoArquitetura de ComponentesProjetoRotas e ControladoresModelosViews
  16. 16. 16Projeto Precisa de uma versão do Java 1.6+Podemos fazer o download do Play!www.playframework.orgwww.playframework.com.brDevemos descompactá-lo numa pastaAdicionamos o caminho da pasta no classpath dosistemaexport PATH=”$PATH:$PLAY_HOME”
  17. 17. 17ProjetoCriamos uma aplicação com Play!$ play new todoPodemos escolher dois templates de projeto1 – criar uma aplicação Scala2 – criar uma aplicação JavaDepois acessamos a pasta do projto$ cd todo
  18. 18. 18Projeto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. 19. 19Projeto
  20. 20. 20Agenda O que é ?Play! No MundoArquitetura de ComponentesProjetoRotas e ControladoresModelosViews
  21. 21. 21Rotas e ControladoresRotas são mapeamentos entre URL e controladores O arquivo conf/routes contem a definição detodas 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. 22. 22Rotas e ControladoresPlay! é um framework MVC (baseado em ação)Um controlador é uma classe Java dentro dopacote controllers e que estende a classeControllerUma ação é um método público estático queretorna um objeto Result
  23. 23. 23Rotas 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. 24Rotas 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 existentessegunda: cria uma nova tarefaterceira: remove uma tarefa pelo id
  25. 25. 25Rotas e ControladoresVamos definir a classe controladorapublic 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. 26Rotas e ControladoresSe executarmos nossa aplicação, veremos
  27. 27. 27Agenda O que é ?Play! No MundoArquitetura de ComponentesProjetoRotas e ControladoresModelosViews
  28. 28. 28Modelos Um objeto de modelo é na verdade um POJO O modelo pode ser usado como uma representaçãoda uma entidade do banco de dados Play! oferece suporte a dois mecanismos depersistência (ORM): Ebean JPA A configuração padrão usa Ebean ORM
  29. 29. 29Modelos Criando nosso objeto de modelopublic 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. 30ModelosPor padrão Play! usa o banco H2 embarcadoPara utilizarmos o MySQL5, precisamos do driver Edite o arquivo project/Build.scalaval appDependencies = Seq(   “mysql” % “mysql­connector­java” % “5.1.25”,   javaCore,   javaJdbc,   JavaEbean)
  31. 31. 31ModelosConfigurando nossa conexão com banco de dados Edite o arquivo conf/application.confdb.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 descomentarebean.defaults=”models.*”Precisamos transformar nosso modelo numaentidade persistente
  32. 32. 32Modelos 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. 33. 33Modelos 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. 34. 34Agenda O que é ?Play! No MundoArquitetura de ComponentesProjetoRotas e ControladoresModelosViews
  35. 35. 35ViewsUma é um template de página HTML com código descript 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 decomponentes visuais para criação de interfacesgráficas
  36. 36. 36Views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, baseadanuma página de layout padrão main.scala.html
  37. 37. 37ViewsTemplates podem receber parâmetros de qualquertipo de dadosUsamos o caracter especial @ para informar comandoScala no templateEm nosso exemplo anterior, estamos passando umparâmetro do tipo String, na variável message@(message: String)
  38. 38. 38ViewsO mecanismo de templates do Play! nos permitereutilizar outros templatesviews bases para as páginas da aplicaçãoEm nosso exemplo anterior, estamos usando otemplate main.scala.html como base da nossapágina
  39. 39. 39Views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. 40. 40Views@(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. 41. 41ViewsNo template anterior criamos um código paraexibir 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 paraexibir os itens da coleção tasks
  42. 42. 42Views●Para completar nosso template, adicionamos o código aseguir:    <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 quedeverá ser invocada, quando o formulário for submetidoTambém usamos o helper @inputText() para criar umacaixa de texto baseada num campo do formulário
  43. 43. 43Views 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. 44Views 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. 45Views 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. 46ConclusãoPlay! é um full-stack Web frameworkSuporte nativamente as linguagens: Scala e JavaSegue o modelo MVCIntegração entre as camadas bastante consistentee simplesMecanismo de build integradao com SBTSuporte a template dinâmicos
  47. 47. 47Conclusã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. 48. 48Q&A
  49. 49. 49Muito Obrigado!!!Keuller Magalhãeskeuller.magalhaes@gmail.comwww.playframework.com.br

×