Grails - The search is over
-
Upload
felipe-coutinho -
Category
Software
-
view
107 -
download
1
description
Transcript of Grails - The search is over
Instituto de Inovação com TIC
Inovação é a gente!
INTERVALO CESAR
Grails – The search is over
Aécio Costa
Felipe Coutinho
Grails – The search is over
GroovyCaracterísticasGroovy x JavaRegra dos 80/20
Grails Cenário Atual do Desenvolvimento WebCaracterísticasArquiteturaDemo
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
}
Seletor.groovy
Grails – The search is over
Groovy é Java
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
Grails – The search is over
Welcome to
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# Bookbook.label=Livrobook.title.label=Titulobook.person.label=Pessoabook.releaseDate.label=Data de lancamento
# Personperson.label=Pessoaperson.name.label=Nomeperson.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.groovyDataSource.groovy
development { dataSource { pooled = true driverClassName = "com.mysql.jdbc.Driver” username = “root" password = “root" 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
Grails – The search is over
bibliografia sugerida
http://groovy.codehaus.org/http://grails.org/
perguntas ???
Aécio Costa – [email protected] –
www.aeciocosta.com.br
Felipe Coutinho – [email protected] – www.felipelc.com
contato