Grails – The search is over
       Aécio Costa
      Felipe Coutinho
Grails – The search is over

Groovy
   Características
   Groovy x Java
   Regra dos 80/20


Grails
   Cenário Atual do Desenvolvimento Web
   Características
   Arquitetura
   Demo
Grails – The search is over

Groovy - Características
  Inspirada no Python, Ruby...;

  Linguagem Dinâmica;

  Plataforma Java;

  Especificação do JCP (JSR 241);

  Copy/Paste Compatibilty.
Grails – The search is over

O que Groovy tem de diferente de Java?
  Tipagem dinâmica;

  Recurso: attribute accessor;

  Closure;

  Métodos Dinâmicos;

  e mais...
Grails – The search is over

Tipagem dinâmica

def name = “João”


def names = [“João”, “José”, “Geraldo”]
Grails – The search is over

Atribute accessor
class User{

    String nome
    Integer idade

}

def user = new User(name:”João”, age: 23)

user.nome = “Pedro”
Grails – The search is over

Closure
def name = “Paulo”

def printName = {println “Hello, ${name}”}

printName()


def listNames = [“Gabriela”, “Maria”]

def sayHello = {println it}

listNames.each(sayHello)
Grails – The search is over

Métodos Dinâmicos

def methodName = “getYearBorn”

user.”${methodName}”()

new User().”getDayBorn”()
Grails – The search is over

Além de...
Sobre carga de operadores;

Ranges;

MetaPrograming;

e etc...
Grails – The search is over

Groovy veio acabar com a Regra dos 80/20
           (Princípio de Pareto)
Grails – The search is over
import java.util.ArrayList;
import java.util.List;

class Seletor {

   private List selectBooksNameLessThan(List bookNames, int length) {
      List resultado = new ArrayList();
      for (int i = 0; i < bookNames.size(); i++) {
            String candidate = (String) bookNames.get(i);
            if (candidate.length() < length) {
                  resultado.add(candidate);
            }
      }
      return resultado;
   }

   public static void main(String[] args) {
     List books = new ArrayList();
     books.add("Harry Potter");
     books.add("A Vila");
     books.add(“O Exorcista");

       Seletor s = new Seletor();
       List selected = s.selectBooksNameLessThan(books, 10);
       System.out.println("Total Selecionados: " + selecionados.size());

       for (int i = 0; i < selected.size(); i++) {
             String sel = (String) selecionados.get(i);
             System.out.println(sel);
       }

   }
Grails – The search is over

O que realmente interessa no código anterior?
Grails – The search is over
import java.util.ArrayList;
import java.util.List;

class Seletor {

   private List selectBooksNameLessThan(List bookNames, int length) {
      List resultado = new ArrayList();
      for (int i = 0; i < bookNames.size(); i++) {
            String candidate = (String) bookNames.get(i);
            if (candidate.length() < length) {
                  resultado.add(candidate);
            }
      }
      return resultado;
   }

   public static void main(String[] args) {
     List books = new ArrayList();
     books.add("Harry Potter");
     books.add("A Vila");
     books.add(“O Exorcista");

       Seletor s = new Seletor();
       List selected = s.selectBooksNameLessThan(books, 10);
       System.out.println("Total Selecionados: " + selecionados.size());

       for (int i = 0; i < selected.size(); i++) {
             String sel = (String) selecionados.get(i);
             System.out.println(sel);
       }

   }
Grails – The search is over
Grails – The search is over

Closure e import implícito
Grails – The search is over
import java.util.ArrayList;
import java.util.List;

class Seletor {

   private List selectBooksNameLessThan(List bookNames, int length) {
      List resultado = new ArrayList();
      for (int i = 0; i < bookNames.size(); i++) {
            String candidate = (String) bookNames.get(i);
            if (candidate.length() < length) {
                  resultado.add(candidate);
            }
      }
      return resultado;
   }

   public static void main(String[] args) {
     List books = new ArrayList();
     books.add("Harry Potter");
     books.add("A Vila");
     books.add(“O Exorcista");

       Seletor s = new Seletor();
       List selected = s.selectBooksNameLessThan(books, 10);
       System.out.println("Total Selecionados: " + selecionados.size());

       for (int i = 0; i < selected.size(); i++) {
             String sel = (String) selecionados.get(i);
             System.out.println(sel);
       }

   }
Grails – The search is over
class Seletor {

    private List selectBooksNameLessThan(List bookNames, int length) {
       List resultado = new ArrayList();
       bookNames.each { String candidate ->
            if (candidate.length() < length) {
                  resultado.add(candidate);
            }
       }
       return resultado;
    }

    public static void main(String[] args) {
      List books = new ArrayList();
      books.add("Harry Potter");
      books.add("A Vila");
      books.add(“O Exorcista");

        Seletor s = new Seletor();
        List selected = s.selectBooksNameLessThan(books, 10);
        System.out.println("Total Selecionados: " + selecionados.size());

        selected.each { String sel ->
            System.out.println(sel);
        }

    }
}
Grails – The search is over

Closure e import implícito
Declaração e Assinatura de Métodos
Grails – The search is over
class Seletor {

    private List selectBooksNameLessThan(List bookNames, int length) {
       List resultado = new ArrayList();
       bookNames.each { String candidate ->
            if (candidate.length() < length) {
                  resultado.add(candidate);
            }
       }
       return resultado;
    }

    public static void main(String[] args) {
      List books = new ArrayList();
      books.add("Harry Potter");
      books.add("A Vila");
      books.add(“O Exorcista");

        Seletor s = new Seletor();
        List selected = s.selectBooksNameLessThan(books, 10);
        System.out.println("Total Selecionados: " + selecionados.size());

        selected.each { String sel ->
            System.out.println(sel);
        }

    }
}
Grails – The search is over
List selectBooksNameLessThan(List bookNames, int length) {
    List resultado = new ArrayList();
    bookNames.each { String candidate ->
         if (candidate.length() < length) {
               resultado.add(candidate);
         }
    }
    return resultado;
}

List books = new ArrayList();
books.add("Harry Potter");
books.add("A Vila");
books.add(“O Exorcista");

Seletor s = new Seletor();
List selected = s.selectBooksNameLessThan(books, 10);
System.out.println("Total Selecionados: " + selecionados.size());

selected.each { String sel ->
    System.out.println(sel);
}
Grails – The search is over

Closure e import implícito
Declaração e Assinatura de Métodos
Tipagem Estática
Grails – The search is over
List selectBooksNameLessThan(List bookNames, int length) {
    List resultado = new ArrayList();
    bookNames.each { String candidate ->
         if (candidate.length() < length) {
               resultado.add(candidate);
         }
    }
    return resultado;
}

List books = new ArrayList();
books.add("Harry Potter");
books.add("A Vila");
books.add(“O Exorcista");

Seletor s = new Seletor();
List selected = s.selectBooksNameLessThan(books, 10);
System.out.println("Total Selecionados: " + selecionados.size());

selected.each { String sel ->
    System.out.println(sel);
}
Grails – The search is over
def selectBooksNameLessThan(bookNames, length) {
    def resultado = new ArrayList();
    bookNames.each { candidate ->
         if (candidate.size() < length) {
               resultado.add(candidate);
         }
    }
    return resultado;
}

def books = new ArrayList();
books.add("Harry Potter");
books.add("A Vila");
books.add(“O Exorcista");

def selected = s.selectBooksNameLessThan(books, 10);
System.out.println("Total Selecionados: " + selecionados.size());

selected.each { sel ->
    System.out.println(sel);
}
Grails – The search is over

Closure e import implícito
Declaração e Assinatura de Métodos
Tipagem Estática
Instância simplificada de Listas
Não necessidade de “return”
“;” não obrigatório
Impressão simples
Grails – The search is over
def selectBooksNameLessThan(bookNames, length) {
    def resultado = new ArrayList();
    bookNames.each { candidate ->
         if (candidate.size() < length) {
               resultado.add(candidate);
         }
    }
    return resultado;
}

def books = new ArrayList();
books.add("Harry Potter");
books.add("A Vila");
books.add(“O Exorcista");

def selected = s.selectBooksNameLessThan(books, 10);
System.out.println("Total Selecionados: " + selecionados.size());

selected.each { sel ->
    System.out.println(sel);
}
Grails – The search is over
def selectBooksNameLessThan(bookNames, length) {
    def resultado = [];
    bookNames.each { candidate ->
         if (candidate.size) < length) {
               resultado.add(candidate)
         }
    }
    resultado
}

def books = ["Harry Potter”, "A Vila”, “O Exorcista”]
def selected = s.selectBooksNameLessThan(books, 10)
println "Total ${selecionados.size()}”

selected.each { sel ->
    println sel
}
Grails – The search is over

Closure e import implícito
Declaração e Assinatura de Métodos
Tipagem Estática
Instância simplificada de Listas
Não necessidade de “return”
“;” não obrigatório
Impressão simples
Métódos Dinâmicos
Grails – The search is over
def selectBooksNameLessThan(bookNames, length) {
    def resultado = [];
    bookNames.each { candidate ->
         if (candidate.size) < length) {
               resultado.add(candidate)
         }
    }
    resultado
}

def books = ["Harry Potter”, "A Vila”, “O Exorcista”]
def selected = s.selectBooksNameLessThan(books, 10)
println "Total ${selecionados.size()}”

selected.each { sel ->
    println sel
}
Grails – The search is over
def selectBooksNameLessThan(bookNames, length) {
    bookNames.findAll { it.size() < length }
}

def books = ["Harry Potter”, "A Vila”, “O Exorcista”]
def selected = s.selectBooksNameLessThan(books, 10)
println "Total ${selecionados.size()}”

selected.each { sel ->
    println sel
}
Grails – The search is over
def selectBooksNameLessThan(bookNames, length) {
    bookNames.findAll { it.size() < length }
}

def books = ["Harry Potter”, "A Vila”, “O Exorcista”]
def selected = s.selectBooksNameLessThan(books, 10)
println "Total ${selecionados.size()}”

selected.each { sel ->
    println sel
}
Grails – The search is over
def books = ["Harry Potter”, "A Vila”, “O Exorcista”]
def selected = books. findAll { it.size() <= 5}
println "Total ${selecionados.size()}”

selected.each { sel ->
    println sel
}
Grails – The search is over
def books = ["Harry Potter”, "A Vila”, “O Exorcista”]
def selected = books. findAll { it.size() <= 5}
println "Total ${selecionados.size()}”

selected.each { sel ->
    println sel
}




Seletor.groovy
Grails – The search is over
def books = ["Harry Potter”, "A Vila”, “O Exorcista”]
def selected = books. findAll { it.size() <= 5}
println "Total ${selecionados.size()}”

selected.each { sel ->
    println sel
                                                        Groovy é Java
}




Seletor.groovy
Grails – The search is over
Cenário Atual Web

   Persistência
   Validações
   Logs
   Visualização
   Controladores
   Controle Transacional
   Injeção de Dependências
   Ajax
   Redirecionador de URL’s
   Configuração por ambiente
   Internacionalização
Grails – The search is over
Grails – The search is over




   Welcome to
Grails – The search is over



 Framework Web de Alta produtividade para plataforma Java;
 Programação por convenção;
 MVC nativo;
 Fácil bootstrap;
 GORM;
 Scaffolding;
 Plugins;
 e tudo que você viu lá atras...
Grails – The search is over
Arquitetura do Grails
Grails – The search is over

Passos para criar a Aplicação


   $ grails create-app booklibrary

   $ grails run-app
Grails – The search is over

Classes de domínio

   $ grails create-domain-class cesar.example.Book

class Book {
   String title
   Date releaseDate
   String ISBN
}
Grails – The search is over

Scaffolding

INSERT, UPDATE, DELETE, SEARCH

$ grails generate-all cesar.example.Book
Grails – The search is over

Validations (Constraints)

DSL interna baseada no recurso builder da linguagem Groovy;

Constraints: http://grails.org/doc/latest/ref/Constraints/Usage.html

static constraints = {
        title(blank: false)
        ISBN(blank: false, unique: true)
 }
Grails – The search is over
Relacionamento

$ grails create-domain-class cesar.example.Person

class Person {
   static hasMany = [books: Book]
   String name
   String email
   String password

    static constraints = {
      name(blank: false)
      email(blank: false, email: true)
      password(blank: false, password: true)
    }
}

Na classe Book:
static belongsTo = [person: Person]
Grails – The search is over
View

.gsp

i18n
# Book
book.label=Livro
book.title.label=Titulo
book.person.label=Pessoa
book.releaseDate.label=Data de lancamento

# Person
person.label=Pessoa
person.name.label=Nome
person.password.label=Senha
Grails – The search is over
GORM

def books = Book.list(max:10, order:”name”)

def books = Book.findByName(“The Developer”)

def books = Book.findAllByPriceLessThan(10.0)

def books = Book.findAllByTitleLikeAndPriceBetween(“Harry %”,
40.0, 70.0)
Grails – The search is over
GORM

class BookController {
  def find() {
     def books = Book.findAllByTitleLike("%"+params.like+"%")
     render(view: "list", model: [bookInstanceList: books,
bookInstanceTotal: books.size()])
   }
}

<div>
  <br/>
  <g:form name="myForm" url="[controller:'book',action:'find']">
    <g:actionSubmit value="Find" />
    <g:textField name="like" value="" />
  </g:form>
</div>
Grails – The search is over

WebService REST

import grails.converters.*

  def showRest() {
    def bookInstance = Book.get(params.id)
    if(!bookInstance){
        render new Book() as JSON
        return
    }
    render bookInstance as JSON
  }
Grails – The search is over
Configuração por ambiente

   BuildConfig.groovy
   DataSource.groovy

   development {
      dataSource {
        pooled = true
        driverClassName = "com.mysql.jdbc.Driver”
        username = "book"
        password = "book123"
        dbCreate = "create-drop"
        dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
        url =
   "jdbc:mysql://localhost:3306/book_dev?autoreconnect=true"
      }
   }

$ grails install-dependency mysql:mysql-connector-java:5.1.16
Grails – The search is over
Plugins

GWT
LDAP
Spring Security
Spring WS
Maill
Feeds
Quartz
Axis2
Wicket
Grails – The search is over

Deploy

$ grails war

http://ec2-184-73-69-212.compute-1.amazonaws.com:8080/manager

http://ec2-184-73-69-212.compute-1.amazonaws.com:8080/booklibrary-0.1/
bibliografia sugerida
http://groovy.codehaus.org/
http://grails.org/
perguntas ???
contato

Aécio Costa – aecio.costa@cesar.org.br – www.aeciocosta.com.br

Felipe Coutinho – flc@cesar.org.br – www.felipelc.com

More Related Content

PPT
Grails - The search is over
PDF
The Ring programming language version 1.8 book - Part 41 of 202
PDF
The Ring programming language version 1.5.1 book - Part 34 of 180
PPTX
H base programming
PDF
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
PPTX
Java 8 Examples
KEY
関数潮流(Function Tendency)
PPTX
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Grails - The search is over
The Ring programming language version 1.8 book - Part 41 of 202
The Ring programming language version 1.5.1 book - Part 34 of 180
H base programming
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
Java 8 Examples
関数潮流(Function Tendency)
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor

What's hot (20)

PDF
dotSwift 2016 : Beyond Crusty - Real-World Protocols
PPTX
Programming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
PDF
The Ring programming language version 1.6 book - Part 38 of 189
PDF
Realm to Json & Royal
PPT
Tips and Tricks of Developing .NET Application
PDF
Alternate JVM Languages
PPTX
Linq introduction
PDF
The Ring programming language version 1.7 book - Part 39 of 196
PDF
Swift tips and tricks
PPT
Python tutorial
PDF
The Ring programming language version 1.9 book - Part 44 of 210
PDF
Python Crawler
KEY
Potential Friend Finder
PDF
Scala - en bedre og mere effektiv Java?
PDF
Scala for Java Developers - Intro
PDF
Php code for online quiz
PDF
webScrapingFunctions
KEY
ぐだ生 Java入門第一回(equals hash code_tostring)
PPTX
Ciklum net sat12112011-alexander fomin-expressions and all, all, all
PDF
Presentatie - Introductie in Groovy
dotSwift 2016 : Beyond Crusty - Real-World Protocols
Programming Java - Lection 07 - Puzzlers - Lavrentyev Fedor
The Ring programming language version 1.6 book - Part 38 of 189
Realm to Json & Royal
Tips and Tricks of Developing .NET Application
Alternate JVM Languages
Linq introduction
The Ring programming language version 1.7 book - Part 39 of 196
Swift tips and tricks
Python tutorial
The Ring programming language version 1.9 book - Part 44 of 210
Python Crawler
Potential Friend Finder
Scala - en bedre og mere effektiv Java?
Scala for Java Developers - Intro
Php code for online quiz
webScrapingFunctions
ぐだ生 Java入門第一回(equals hash code_tostring)
Ciklum net sat12112011-alexander fomin-expressions and all, all, all
Presentatie - Introductie in Groovy
Ad

Similar to Grails: The search is over (20)

PPT
2007 09 10 Fzi Training Groovy Grails V Ws
PPT
Groovy Introduction - JAX Germany - 2008
PDF
Groovy and Grails talk
PDF
ODP
Agile web development Groovy Grails with Netbeans
ODP
Groovygrailsnetbeans 12517452668498-phpapp03
PDF
Atlassian Groovy Plugins
PDF
PPT
Groovy & Grails: Scripting for Modern Web Applications
PDF
The Future of JVM Languages
PDF
awesome groovy
PDF
OpenLogic
PDF
Grails Launchpad - From Ground Zero to Orbit
PDF
Paradigmas de programação funcional + objetos no liquidificador com scala
PPT
Groovy presentation
PDF
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge
PPT
Introduction To Groovy 2005
PPTX
Switching from java to groovy
PDF
Introduction to Oracle Groovy
KEY
Groovy & Grails
2007 09 10 Fzi Training Groovy Grails V Ws
Groovy Introduction - JAX Germany - 2008
Groovy and Grails talk
Agile web development Groovy Grails with Netbeans
Groovygrailsnetbeans 12517452668498-phpapp03
Atlassian Groovy Plugins
Groovy & Grails: Scripting for Modern Web Applications
The Future of JVM Languages
awesome groovy
OpenLogic
Grails Launchpad - From Ground Zero to Orbit
Paradigmas de programação funcional + objetos no liquidificador com scala
Groovy presentation
Groovy in the Enterprise - Case Studies - TSSJS Prague 2008 - Guillaume Laforge
Introduction To Groovy 2005
Switching from java to groovy
Introduction to Oracle Groovy
Groovy & Grails
Ad

More from Aécio Costa (7)

PDF
Android - de usuários a desenvolvedores
PDF
Desafios e perspectivas para TV Conectada
PDF
Facebook api além de meros usuários
PDF
Google tv desafios e oportunidades na tv conectada
PDF
Refinamento e boas práticas de programação
PPT
Introdução ao Google TV
PDF
Java: Muito mais que uma linguagem!
Android - de usuários a desenvolvedores
Desafios e perspectivas para TV Conectada
Facebook api além de meros usuários
Google tv desafios e oportunidades na tv conectada
Refinamento e boas práticas de programação
Introdução ao Google TV
Java: Muito mais que uma linguagem!

Grails: The search is over

  • 1. Grails – The search is over Aécio Costa Felipe Coutinho
  • 2. Grails – The search is over Groovy  Características  Groovy x Java  Regra dos 80/20 Grails  Cenário Atual do Desenvolvimento Web  Características  Arquitetura  Demo
  • 3. Grails – The search is over Groovy - Características Inspirada no Python, Ruby...; Linguagem Dinâmica; Plataforma Java; Especificação do JCP (JSR 241); Copy/Paste Compatibilty.
  • 4. Grails – The search is over O que Groovy tem de diferente de Java? Tipagem dinâmica; Recurso: attribute accessor; Closure; Métodos Dinâmicos; e mais...
  • 5. Grails – The search is over Tipagem dinâmica def name = “João” def names = [“João”, “José”, “Geraldo”]
  • 6. Grails – The search is over Atribute accessor class User{ String nome Integer idade } def user = new User(name:”João”, age: 23) user.nome = “Pedro”
  • 7. Grails – The search is over Closure def name = “Paulo” def printName = {println “Hello, ${name}”} printName() def listNames = [“Gabriela”, “Maria”] def sayHello = {println it} listNames.each(sayHello)
  • 8. Grails – The search is over Métodos Dinâmicos def methodName = “getYearBorn” user.”${methodName}”() new User().”getDayBorn”()
  • 9. Grails – The search is over Além de... Sobre carga de operadores; Ranges; MetaPrograming; e etc...
  • 10. Grails – The search is over Groovy veio acabar com a Regra dos 80/20 (Princípio de Pareto)
  • 11. Grails – The search is over import java.util.ArrayList; import java.util.List; class Seletor { private List selectBooksNameLessThan(List bookNames, int length) { List resultado = new ArrayList(); for (int i = 0; i < bookNames.size(); i++) { String candidate = (String) bookNames.get(i); if (candidate.length() < length) { resultado.add(candidate); } } return resultado; } public static void main(String[] args) { List books = new ArrayList(); books.add("Harry Potter"); books.add("A Vila"); books.add(“O Exorcista"); Seletor s = new Seletor(); List selected = s.selectBooksNameLessThan(books, 10); System.out.println("Total Selecionados: " + selecionados.size()); for (int i = 0; i < selected.size(); i++) { String sel = (String) selecionados.get(i); System.out.println(sel); } }
  • 12. Grails – The search is over O que realmente interessa no código anterior?
  • 13. Grails – The search is over import java.util.ArrayList; import java.util.List; class Seletor { private List selectBooksNameLessThan(List bookNames, int length) { List resultado = new ArrayList(); for (int i = 0; i < bookNames.size(); i++) { String candidate = (String) bookNames.get(i); if (candidate.length() < length) { resultado.add(candidate); } } return resultado; } public static void main(String[] args) { List books = new ArrayList(); books.add("Harry Potter"); books.add("A Vila"); books.add(“O Exorcista"); Seletor s = new Seletor(); List selected = s.selectBooksNameLessThan(books, 10); System.out.println("Total Selecionados: " + selecionados.size()); for (int i = 0; i < selected.size(); i++) { String sel = (String) selecionados.get(i); System.out.println(sel); } }
  • 14. Grails – The search is over
  • 15. Grails – The search is over Closure e import implícito
  • 16. Grails – The search is over import java.util.ArrayList; import java.util.List; class Seletor { private List selectBooksNameLessThan(List bookNames, int length) { List resultado = new ArrayList(); for (int i = 0; i < bookNames.size(); i++) { String candidate = (String) bookNames.get(i); if (candidate.length() < length) { resultado.add(candidate); } } return resultado; } public static void main(String[] args) { List books = new ArrayList(); books.add("Harry Potter"); books.add("A Vila"); books.add(“O Exorcista"); Seletor s = new Seletor(); List selected = s.selectBooksNameLessThan(books, 10); System.out.println("Total Selecionados: " + selecionados.size()); for (int i = 0; i < selected.size(); i++) { String sel = (String) selecionados.get(i); System.out.println(sel); } }
  • 17. Grails – The search is over class Seletor { private List selectBooksNameLessThan(List bookNames, int length) { List resultado = new ArrayList(); bookNames.each { String candidate -> if (candidate.length() < length) { resultado.add(candidate); } } return resultado; } public static void main(String[] args) { List books = new ArrayList(); books.add("Harry Potter"); books.add("A Vila"); books.add(“O Exorcista"); Seletor s = new Seletor(); List selected = s.selectBooksNameLessThan(books, 10); System.out.println("Total Selecionados: " + selecionados.size()); selected.each { String sel -> System.out.println(sel); } } }
  • 18. Grails – The search is over Closure e import implícito Declaração e Assinatura de Métodos
  • 19. Grails – The search is over class Seletor { private List selectBooksNameLessThan(List bookNames, int length) { List resultado = new ArrayList(); bookNames.each { String candidate -> if (candidate.length() < length) { resultado.add(candidate); } } return resultado; } public static void main(String[] args) { List books = new ArrayList(); books.add("Harry Potter"); books.add("A Vila"); books.add(“O Exorcista"); Seletor s = new Seletor(); List selected = s.selectBooksNameLessThan(books, 10); System.out.println("Total Selecionados: " + selecionados.size()); selected.each { String sel -> System.out.println(sel); } } }
  • 20. Grails – The search is over List selectBooksNameLessThan(List bookNames, int length) { List resultado = new ArrayList(); bookNames.each { String candidate -> if (candidate.length() < length) { resultado.add(candidate); } } return resultado; } List books = new ArrayList(); books.add("Harry Potter"); books.add("A Vila"); books.add(“O Exorcista"); Seletor s = new Seletor(); List selected = s.selectBooksNameLessThan(books, 10); System.out.println("Total Selecionados: " + selecionados.size()); selected.each { String sel -> System.out.println(sel); }
  • 21. Grails – The search is over Closure e import implícito Declaração e Assinatura de Métodos Tipagem Estática
  • 22. Grails – The search is over List selectBooksNameLessThan(List bookNames, int length) { List resultado = new ArrayList(); bookNames.each { String candidate -> if (candidate.length() < length) { resultado.add(candidate); } } return resultado; } List books = new ArrayList(); books.add("Harry Potter"); books.add("A Vila"); books.add(“O Exorcista"); Seletor s = new Seletor(); List selected = s.selectBooksNameLessThan(books, 10); System.out.println("Total Selecionados: " + selecionados.size()); selected.each { String sel -> System.out.println(sel); }
  • 23. Grails – The search is over def selectBooksNameLessThan(bookNames, length) { def resultado = new ArrayList(); bookNames.each { candidate -> if (candidate.size() < length) { resultado.add(candidate); } } return resultado; } def books = new ArrayList(); books.add("Harry Potter"); books.add("A Vila"); books.add(“O Exorcista"); def selected = s.selectBooksNameLessThan(books, 10); System.out.println("Total Selecionados: " + selecionados.size()); selected.each { sel -> System.out.println(sel); }
  • 24. Grails – The search is over Closure e import implícito Declaração e Assinatura de Métodos Tipagem Estática Instância simplificada de Listas Não necessidade de “return” “;” não obrigatório Impressão simples
  • 25. Grails – The search is over def selectBooksNameLessThan(bookNames, length) { def resultado = new ArrayList(); bookNames.each { candidate -> if (candidate.size() < length) { resultado.add(candidate); } } return resultado; } def books = new ArrayList(); books.add("Harry Potter"); books.add("A Vila"); books.add(“O Exorcista"); def selected = s.selectBooksNameLessThan(books, 10); System.out.println("Total Selecionados: " + selecionados.size()); selected.each { sel -> System.out.println(sel); }
  • 26. Grails – The search is over def selectBooksNameLessThan(bookNames, length) { def resultado = []; bookNames.each { candidate -> if (candidate.size) < length) { resultado.add(candidate) } } resultado } def books = ["Harry Potter”, "A Vila”, “O Exorcista”] def selected = s.selectBooksNameLessThan(books, 10) println "Total ${selecionados.size()}” selected.each { sel -> println sel }
  • 27. Grails – The search is over Closure e import implícito Declaração e Assinatura de Métodos Tipagem Estática Instância simplificada de Listas Não necessidade de “return” “;” não obrigatório Impressão simples Métódos Dinâmicos
  • 28. Grails – The search is over def selectBooksNameLessThan(bookNames, length) { def resultado = []; bookNames.each { candidate -> if (candidate.size) < length) { resultado.add(candidate) } } resultado } def books = ["Harry Potter”, "A Vila”, “O Exorcista”] def selected = s.selectBooksNameLessThan(books, 10) println "Total ${selecionados.size()}” selected.each { sel -> println sel }
  • 29. Grails – The search is over def selectBooksNameLessThan(bookNames, length) { bookNames.findAll { it.size() < length } } def books = ["Harry Potter”, "A Vila”, “O Exorcista”] def selected = s.selectBooksNameLessThan(books, 10) println "Total ${selecionados.size()}” selected.each { sel -> println sel }
  • 30. Grails – The search is over def selectBooksNameLessThan(bookNames, length) { bookNames.findAll { it.size() < length } } def books = ["Harry Potter”, "A Vila”, “O Exorcista”] def selected = s.selectBooksNameLessThan(books, 10) println "Total ${selecionados.size()}” selected.each { sel -> println sel }
  • 31. Grails – The search is over def books = ["Harry Potter”, "A Vila”, “O Exorcista”] def selected = books. findAll { it.size() <= 5} println "Total ${selecionados.size()}” selected.each { sel -> println sel }
  • 32. Grails – The search is over def books = ["Harry Potter”, "A Vila”, “O Exorcista”] def selected = books. findAll { it.size() <= 5} println "Total ${selecionados.size()}” selected.each { sel -> println sel } Seletor.groovy
  • 33. Grails – The search is over def books = ["Harry Potter”, "A Vila”, “O Exorcista”] def selected = books. findAll { it.size() <= 5} println "Total ${selecionados.size()}” selected.each { sel -> println sel Groovy é Java } Seletor.groovy
  • 34. Grails – The search is over Cenário Atual Web  Persistência  Validações  Logs  Visualização  Controladores  Controle Transacional  Injeção de Dependências  Ajax  Redirecionador de URL’s  Configuração por ambiente  Internacionalização
  • 35. Grails – The search is over
  • 36. Grails – The search is over Welcome to
  • 37. Grails – The search is over Framework Web de Alta produtividade para plataforma Java; Programação por convenção; MVC nativo; Fácil bootstrap; GORM; Scaffolding; Plugins; e tudo que você viu lá atras...
  • 38. Grails – The search is over Arquitetura do Grails
  • 39. Grails – The search is over Passos para criar a Aplicação $ grails create-app booklibrary $ grails run-app
  • 40. Grails – The search is over Classes de domínio $ grails create-domain-class cesar.example.Book class Book { String title Date releaseDate String ISBN }
  • 41. Grails – The search is over Scaffolding INSERT, UPDATE, DELETE, SEARCH $ grails generate-all cesar.example.Book
  • 42. Grails – The search is over Validations (Constraints) DSL interna baseada no recurso builder da linguagem Groovy; Constraints: http://grails.org/doc/latest/ref/Constraints/Usage.html static constraints = { title(blank: false) ISBN(blank: false, unique: true) }
  • 43. Grails – The search is over Relacionamento $ grails create-domain-class cesar.example.Person class Person { static hasMany = [books: Book] String name String email String password static constraints = { name(blank: false) email(blank: false, email: true) password(blank: false, password: true) } } Na classe Book: static belongsTo = [person: Person]
  • 44. Grails – The search is over View .gsp i18n # Book book.label=Livro book.title.label=Titulo book.person.label=Pessoa book.releaseDate.label=Data de lancamento # Person person.label=Pessoa person.name.label=Nome person.password.label=Senha
  • 45. Grails – The search is over GORM def books = Book.list(max:10, order:”name”) def books = Book.findByName(“The Developer”) def books = Book.findAllByPriceLessThan(10.0) def books = Book.findAllByTitleLikeAndPriceBetween(“Harry %”, 40.0, 70.0)
  • 46. Grails – The search is over GORM class BookController { def find() { def books = Book.findAllByTitleLike("%"+params.like+"%") render(view: "list", model: [bookInstanceList: books, bookInstanceTotal: books.size()]) } } <div> <br/> <g:form name="myForm" url="[controller:'book',action:'find']"> <g:actionSubmit value="Find" /> <g:textField name="like" value="" /> </g:form> </div>
  • 47. Grails – The search is over WebService REST import grails.converters.* def showRest() { def bookInstance = Book.get(params.id) if(!bookInstance){ render new Book() as JSON return } render bookInstance as JSON }
  • 48. Grails – The search is over Configuração por ambiente BuildConfig.groovy DataSource.groovy development { dataSource { pooled = true driverClassName = "com.mysql.jdbc.Driver” username = "book" password = "book123" dbCreate = "create-drop" dialect = "org.hibernate.dialect.MySQL5InnoDBDialect" url = "jdbc:mysql://localhost:3306/book_dev?autoreconnect=true" } } $ grails install-dependency mysql:mysql-connector-java:5.1.16
  • 49. Grails – The search is over Plugins GWT LDAP Spring Security Spring WS Maill Feeds Quartz Axis2 Wicket
  • 50. Grails – The search is over Deploy $ grails war http://ec2-184-73-69-212.compute-1.amazonaws.com:8080/manager http://ec2-184-73-69-212.compute-1.amazonaws.com:8080/booklibrary-0.1/
  • 53. contato Aécio Costa – aecio.costa@cesar.org.br – www.aeciocosta.com.br Felipe Coutinho – flc@cesar.org.br – www.felipelc.com