The document discusses Groovy and Grails. It begins by explaining some of Groovy's key features like dynamic typing, closures, and implicit imports. It then demonstrates how these features simplify and shorten Java code. The document concludes by describing Grails, a web framework that uses Groovy. It outlines some of Grails' main capabilities like persistence, validation, scaffolding, and its convention over configuration approach to web development.
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);
}
}
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
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)
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/