SlideShare una empresa de Scribd logo
1 de 43
Descargar para leer sin conexión
Cambia la forma de desarrollar
tus aplicaciones web

Leganés, 6-7 Febrero 2014

@fatimacasau
¿Qué vamos a ver?
¿Qué es?
Características
Getting Started
Features + Código

@t3chfest 2014

@fatimacasau
JVM
Dinámico
Tiempo de ejecución
@CompileStatic (versión 2.x)
Ruby, Phyton, Smaltalk

@t3chfest 2014

@fatimacasau
Groovy ~ Java
Sencillo + Expresivo = Coding by Convention
GDK - Groovy Development Kit (JDK extension)
Groovy ~ Superversión de Java

@t3chfest 2014

@fatimacasau
Getting Started
Descarga:

http://groovy.codehaus.org/Download

Terminal: $ groovysh

$ groovyconsole

Web Console: http://groovyconsole.appspot.com/
IDEs:

@t3chfest 2014

@fatimacasau
Features
OOP
Clases: Getters/Setters y constructores implícitos
Closures
Sobrecarga de operadores
Soporte nativo para cadenas (Gstrings) y
colecciones

@t3chfest 2014

@fatimacasau
HelloWorld.java
class HelloWorld {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String greet() {
return "Hello " + name;
}
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.setName("Groovy");
System.out.println(helloWorld.greet());
}
}

@t3chfest 2014

@fatimacasau
HelloWorld.groovy
class HelloWorld {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String greet() {
return "Hello " + name;
}
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.setName("Groovy");
System.out.println(helloWorld.greet());
}
}

@t3chfest 2014

@fatimacasau
HelloWorld.groovy (groovy style)

!

class HelloWorld {
def name
def greet() {
"Hello $name"
}
}

!

def helloWorld = new HelloWorld(name: "Groovy")
println helloWorld.greet()

@t3chfest 2014

@fatimacasau
GStrings
// Múltiples líneas con y sin salto de línea (también con triple ")
assert '''hello,
world''' == 'hello,nworld‘

!

assert 'hello, 
world' == 'hello, world‘

!

// Sustitución de variables con dobles comillas
def name = 'Groovy'
assert "hello $name, how are you today?" == "hello Groovy, how are you
today?

!

def a = 'How are you? '
assert "The phrase '$a' has length ${a.size()}" =="The phrase 'How are you?'
has length 12"

@t3chfest 2014

@fatimacasau
Listas
def list = [5, 6, 7, 8]
assert list.get(2) == 7
assert list[2] == 7

!
assert
!

list instanceof java.util.List

def emptyList = []
assert emptyList.size() == 0

!

emptyList.add(5)
assert emptyList.size() == 1

!

emptyList << 3
assert emptyList.size() == 2

!

emptyList << 'Groovy'
assert emptyList.size() == [5, 3, 'Groovy']

@t3chfest 2014

@fatimacasau
Rangos
// an inclusive range
def range = 5..8
assert range instanceof java.util.List
assert range.size() == 4
assert range[2] == 7
assert range.contains(5)
assert range.contains(8)
// lets use a half-open range
range = 5..<8
assert range.size() == 3
assert range.contains(5)
assert ! range.contains(8)
assert range.from == 5
assert range.to == 7

!

range = 'a'..'d'
assert range == ['a','b','c','d']

@t3chfest 2014

@fatimacasau
Mapas
def map = [name: "Gromit", likes: "cheese", id: 1234]
assert map instanceof java.util.Map

!

assert map.get("name") == "Gromit"
assert map.get("id") == 1234

!

assert map["name"] == "Gromit"
assert map ['id'] == 1234

!

assert map.name == "Gromit"
assert map.id == 1234

!

def emptyMap = [:]
assert emptyMap.size () == 0

!

map.foo = 4
assert map.foo == 4

@t3chfest 2014

@fatimacasau
Closures
Bloques de código
Pueden asignarse a variables
Tienen variables implícitas
Pueden utilizar variables externas
Pueden pasarse como argumento de métodos

@t3chfest 2014

@fatimacasau
Closures

!
def
!

myConst = 5

def incByConst = { num ->
num + myConst
}

!
println
!

incByConst(10) // => 15

//variable implícita it
def clos = { print it }
clos( "hi there" ) //prints "hi there"

@t3chfest 2014

@fatimacasau
Loopsy estructuras de control
if(){}else{}

!

while(){}

!

for(i in [1,2,3]){}
for(i=0;i<5;i++){}
for(i=0;j=10;i<10;i++;j--){}
for(i=0;…;i<10;…;n++){}

!

[1,2,3].each{ println it }
[“a”,“b”,“c”].eachWithIndex(){it,i-> println “$i : $it”}

!

3.times(){…}
5.upto(10){…}
10.1.downto(1.1){…}
0.step(10,2){…}
(1.. 5).each{…}
@t3chfest 2014

@fatimacasau
La ‘verdad’ en Groovy
Falso
Null

new Object()

0

1

[]

[1,2,3]

[:]

[name:'fatima']

""

@t3chfest 2014

Verdad

'abc'

@fatimacasau
Sobrecarga de Operadores
Operator

Method

a == b
a != b

a.equals(b) or
a.compareTo(b) == 0 **
!a.equals(b)

a <=> b

a.compareTo(b)

a > b

a.compareTo(b) > 0

a >= b

a.compareTo(b) >= 0

a < b

a.compareTo(b) < 0

No NullPointerException
@t3chfest 2014

@fatimacasau
Otros Operadores
Not operator (!)
!expresión

Spread operator (*.)
list*.attribute

Safe navigation operator (?.)
object?.attribute

Elvis operator (?:)
a = a?:""
@t3chfest 2014

@fatimacasau
Más…

!

Groovy SQL

!

sql.execute('insert into people (firstName, lastName) values (?,?)',
[firstName, lastName])
sql.eachRow('Select * from Person') {}

!
Dates
!

plus(), minus(), after(), before()
GregorianCalendar, String.format(String format, GregorianCalendar c)

!
Expresiones regulares
!
"potatoe" ==~ /potatoe/
!
Files

eachFile(), eachDir(), eachLine()…
@t3chfest 2014

@fatimacasau
Libros
!

@t3chfest 2014

@fatimacasau
!
Documentación oficial

!

Groovy Codehaus: http://groovy.codehaus.org/Documentation

!
!
Ejercicios

!

Groovy Koans:
https://github.com/cjudd/groovy_koans

!
!
@t3chfest 2014

@fatimacasau
¿Qué vamos a ver?
¿Qué es?
Principios y filosofía
Ventajas
Getting Started
Arquitectura

@t3chfest 2014

@fatimacasau
Plataforma para el desarrollo de aplicaciones web
JavaEE
Construido sobre un conjunto de frameworks
consolidados
Apoyado por una extensa librería de plugins
Soluciona todas las necesidades en el desarrollo de
aplicaciones web
Facilita el desarrollo de dichas aplicaciones
Utiliza GROOVY como lenguage

@t3chfest 2014

@fatimacasau
!
!
!
!
!
!
!
!
!
!

Tomcat y H2 incluidos para desarrollo rápido

@t3chfest 2014

@fatimacasau
Principios y filosofía
Patrón MVC (Modelo, Vista, Controlador)
CoC (Convention over Configuration)
Nombres descriptivos
Localización de ficheros que indican lo que son
Paradigma Coding by Convention de GROOVY

!
DRY (Don’t Repeat Yourself)
Inyección de dependencias

@t3chfest 2014

@fatimacasau
¿Por qué?
Menos código + menos errores = ++productividad
Fly reloading
Abstracción de los frameworks sobre los que se
asienta
Línea de comandos (run-app, war, install-plugin…)
Eliminación de XML’s gracias a CoC
Extensa librería de plugins

@t3chfest 2014

@fatimacasau
Getting Started
JDK

y JAVA_HOME

Download: http://grails.org/download
Terminal:

$ grails run-app

$ grails>

IDE’s:
Crear una aplicación
grails> create-app myApp
@t3chfest 2014

@fatimacasau
Comandos

grails [environment]* [command name]

!

Environments: dev, test, prod

!

Custom Environment: -Dgrails.env=myEnv

!

Comandos más usados:
run-app
war
clean
install-plugin
test-app
create-domain-class
create-controller
ceate-service
generate-all

@t3chfest 2014

@fatimacasau
Configuración
Config.groovy
Ejemplo: my.property.text = “hola”
Acceso: grailsApplication.config.my.property.text

BuildConfig.groovy
Datasource.groovy
Bootstrap.groovy
ApplicationResources.groovy
UrlMappings.groovy
@t3chfest 2014

@fatimacasau
Environments
!
grails.util.Environment

!
Custom environments

!
Detección de entornos:

!

environments {
production{
configureForDevelopment()
}
…
}
_______________________________________
import grails.util.Environment

!

switch (Environment.current) {
case Environment.DEVELOPMENT
configureForDevelopment()
break
…
}
@t3chfest 2014

@fatimacasau
Arquitectura MVC
Modelo - domains (GORM), services (Spring)
Vista – views & templates (gsp’s), TagLibs
Controlador – controllers & actions, filtros

@t3chfest 2014

@fatimacasau
GORM
Grails Object Relational Mapping (Hibernate 3)
Clases de dominio
getters y setters implícitos
constructores por defecto
eventos

Mapeos sin configuración
save(), delete(), list(), count()…
Constraints para validación
namedQueries
@t3chfest 2014

@fatimacasau
GORM
Mapeo de relaciones
One-To-One, One-To-Many, Many-To-Many
Finders dinámicos
findAllBy(), findBy(), findWhere()…
Para búsquedas más complejas
HQL, criterias, detachedCriterias, executeQueries
Ordenación y paginación
sort, order, max, offset …
@t3chfest 2014

@fatimacasau
Controllers
Actions
Closures
Métodos que reciben parámetros que vienen del formulario
Redirect de otros actions, mappings
Renders de vistas, templates, texto, json, xml

Command Objects
Objeto flash para enviar messages
Filtros que interceptan controllers, actions, views

@t3chfest 2014

@fatimacasau
Servicios

!

Spring

!

Inyección automática en:

!

Otros servicios
Controllers
Domains
TagLibs

@t3chfest 2014

class MyService {
def anyMethod(){
//…
}
}
_______________________________________
class MyController {
def myService
def anyAction(){
//…
myService.anyMethod(…)
//…
}
}

@fatimacasau
GSP’s
Groovy Server Pages
Templates, includes
Reutilización de código
Extensa librería de Tags sin configuración
g:each, g:if, g:form, g:formRemote,
g:formatDate, g:link, g:remoteLink,
g:remoteFunction, g:datePicker, g:set …

@t3chfest 2014

@fatimacasau
URL Mappings

!

class UrlMappings {
static mappings = {

!

"/product"(controller: "product", action: "list")
"/"(view: "/index") // map the root URL
"/product/$id"(controller: "product")
"403"(controller: "errors", action: "forbidden")
"/product/$id"(controller:"product") {
action = [GET:"show", PUT:"update", DELETE:"delete“,
POST:"save"]
}
name accountDetails: "/details/$acctNumber" {
controller = 'product' action = 'accountDetails'
}
}
}

@t3chfest 2014

@fatimacasau
Deployment
Command line
Para ejecutar
Puerto por defecto 8080: grails run-app
Especificar puerto: grails -Dserver.port=8090 run-app

Generar un war:
Entorno de producción por defecto: grails war
Especificar entorno: grails -Dgrails.env=myEnv war

@t3chfest 2014

@fatimacasau
Más…
!
jQuery
!
Ajax
!
Creación de Plugins
!
SpringSecurity Plugin
!
I18n
!
Testing con Spock integrado
!
Scripts: Gant
!
Injección de dependencias con
!

Spring: Spring DSL’s, resources.groovy

Scaffolding – No recomendado

@t3chfest 2014

@fatimacasau
Documentación de grails

!

http://grails.org/doc/latest/guide/

Listas de correo

!

http://grails.org/Mailing+lists

Grails Blog

!

http://grails.org/blog

Issue Tracker

!

http://jira.grails.org/browse/GRAILS

Grupo de Google – Grails en Castellano

http://groups.google.es/group/grailsencastellano

@t3chfest 2014

@fatimacasau
Eventos

@t3chfest 2014

@fatimacasau
https://github.com/fatimacasau/blog-example-grails-app

@t3chfest 2014

@fatimacasau

Más contenido relacionado

La actualidad más candente

Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Raul Fraile
 
Introducción a recaptcha 3.0
Introducción a recaptcha 3.0Introducción a recaptcha 3.0
Introducción a recaptcha 3.0Jesús Ayús
 
Introducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGRIntroducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGRJuan Belón Pérez
 
Node js Alt.net Hispano
Node js Alt.net HispanoNode js Alt.net Hispano
Node js Alt.net Hispanohdgarcia
 
Las buenas prácticas oficiales para aplicaciones Symfony
Las buenas prácticas oficiales para aplicaciones SymfonyLas buenas prácticas oficiales para aplicaciones Symfony
Las buenas prácticas oficiales para aplicaciones Symfonysymfony_bcn
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - TrovitJordi Gerona
 
Php basico y avanzado
Php basico y avanzadoPhp basico y avanzado
Php basico y avanzadodrakatiadiaz
 
Codemotion Madrid 2013 - [PHP] desarrollo de extensiones en c c++
Codemotion Madrid 2013 - [PHP] desarrollo de extensiones en c c++Codemotion Madrid 2013 - [PHP] desarrollo de extensiones en c c++
Codemotion Madrid 2013 - [PHP] desarrollo de extensiones en c c++Daniel González Cerviño
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016Agencia INNN
 
Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytestHector Canto
 
Open Source Modern Web Development
Open Source Modern Web DevelopmentOpen Source Modern Web Development
Open Source Modern Web DevelopmentJaime Irurzun
 
Despliegue de aplicaciones PHP
Despliegue de aplicaciones PHPDespliegue de aplicaciones PHP
Despliegue de aplicaciones PHPAlicantePHP
 
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008javier ramirez
 

La actualidad más candente (19)

Taller de Capistrano
Taller de CapistranoTaller de Capistrano
Taller de Capistrano
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain
 
Php Con Postgres
Php Con PostgresPhp Con Postgres
Php Con Postgres
 
Introducción a recaptcha 3.0
Introducción a recaptcha 3.0Introducción a recaptcha 3.0
Introducción a recaptcha 3.0
 
Introducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGRIntroducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGR
 
Iniciacion a PHP (I)
Iniciacion a PHP (I)Iniciacion a PHP (I)
Iniciacion a PHP (I)
 
Dar lab1819
Dar lab1819Dar lab1819
Dar lab1819
 
Node js Alt.net Hispano
Node js Alt.net HispanoNode js Alt.net Hispano
Node js Alt.net Hispano
 
Las buenas prácticas oficiales para aplicaciones Symfony
Las buenas prácticas oficiales para aplicaciones SymfonyLas buenas prácticas oficiales para aplicaciones Symfony
Las buenas prácticas oficiales para aplicaciones Symfony
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - Trovit
 
Php basico y avanzado
Php basico y avanzadoPhp basico y avanzado
Php basico y avanzado
 
Codemotion Madrid 2013 - [PHP] desarrollo de extensiones en c c++
Codemotion Madrid 2013 - [PHP] desarrollo de extensiones en c c++Codemotion Madrid 2013 - [PHP] desarrollo de extensiones en c c++
Codemotion Madrid 2013 - [PHP] desarrollo de extensiones en c c++
 
ATIX05
ATIX05ATIX05
ATIX05
 
Manual PHP 7
Manual PHP 7Manual PHP 7
Manual PHP 7
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016
 
Testing efectivo con pytest
Testing efectivo con pytestTesting efectivo con pytest
Testing efectivo con pytest
 
Open Source Modern Web Development
Open Source Modern Web DevelopmentOpen Source Modern Web Development
Open Source Modern Web Development
 
Despliegue de aplicaciones PHP
Despliegue de aplicaciones PHPDespliegue de aplicaciones PHP
Despliegue de aplicaciones PHP
 
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
Javier.Ramirez.Rails.Hot.Or.Not.Conferenciarails2008
 

Destacado

Upload files with grails
Upload files with grailsUpload files with grails
Upload files with grailsEric Berry
 
Programación Reactiva con RxJava
Programación Reactiva con RxJavaProgramación Reactiva con RxJava
Programación Reactiva con RxJavaParadigma Digital
 
Manuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octManuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octParadigma Digital
 
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!Paradigma Digital
 
¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?Paradigma Digital
 

Destacado (8)

Overview atlas (1)
Overview atlas (1)Overview atlas (1)
Overview atlas (1)
 
Upload files with grails
Upload files with grailsUpload files with grails
Upload files with grails
 
Programación Reactiva con RxJava
Programación Reactiva con RxJavaProgramación Reactiva con RxJava
Programación Reactiva con RxJava
 
Cómo usar google analytics
Cómo usar google analyticsCómo usar google analytics
Cómo usar google analytics
 
Transformación Digital
Transformación DigitalTransformación Digital
Transformación Digital
 
Manuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octManuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4oct
 
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
 
¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?
 

Similar a Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones web

Android Tips & Tricks - Boosting your productivity
Android Tips & Tricks - Boosting your productivityAndroid Tips & Tricks - Boosting your productivity
Android Tips & Tricks - Boosting your productivityFe
 
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaRealizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaAndres Almiray
 
Tu api ha muerto larga vida a tu dsl
Tu api ha muerto  larga vida a tu dslTu api ha muerto  larga vida a tu dsl
Tu api ha muerto larga vida a tu dslJorge Aguilera
 
Groovy & Grails
Groovy & GrailsGroovy & Grails
Groovy & Grailsbetabeers
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesDani Latorre
 
Introduccion a grails en Campusparty
Introduccion a grails en CampuspartyIntroduccion a grails en Campusparty
Introduccion a grails en CampuspartyJose Juan R. Zuñiga
 
Realizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaRealizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaSoftware Guru
 
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLabFIB
 
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018  Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018 Codemotion
 
Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)videos
 
Node Js & 3D Printer
Node Js & 3D PrinterNode Js & 3D Printer
Node Js & 3D Printernanusefue
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Fernando Petrola
 

Similar a Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones web (20)

Android Tips & Tricks - Boosting your productivity
Android Tips & Tricks - Boosting your productivityAndroid Tips & Tricks - Boosting your productivity
Android Tips & Tricks - Boosting your productivity
 
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y EficaciaRealizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
 
Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
Tu api ha muerto larga vida a tu dsl
Tu api ha muerto  larga vida a tu dslTu api ha muerto  larga vida a tu dsl
Tu api ha muerto larga vida a tu dsl
 
Groovy & Grails
Groovy & GrailsGroovy & Grails
Groovy & Grails
 
Seguridad en Android
Seguridad en AndroidSeguridad en Android
Seguridad en Android
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
 
Introduccion a grails en Campusparty
Introduccion a grails en CampuspartyIntroduccion a grails en Campusparty
Introduccion a grails en Campusparty
 
Empezando con Angular 2
Empezando con Angular 2Empezando con Angular 2
Empezando con Angular 2
 
Viernes Tecnicos DTrace
Viernes Tecnicos DTraceViernes Tecnicos DTrace
Viernes Tecnicos DTrace
 
Gwt III - Avanzado
Gwt III - AvanzadoGwt III - Avanzado
Gwt III - Avanzado
 
Realizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaRealizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficacia
 
Taller de Grails
Taller de GrailsTaller de Grails
Taller de Grails
 
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+DinLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
inLab FIB MeteorJS workshop by uLab UPC - Telefonica I+D
 
Presnetación Go
Presnetación GoPresnetación Go
Presnetación Go
 
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018  Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
 
Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)
 
Node Js & 3D Printer
Node Js & 3D PrinterNode Js & 3D Printer
Node Js & 3D Printer
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014
 

Más de Paradigma Digital

Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Paradigma Digital
 
Java 8 time to join the future
Java 8  time to join the futureJava 8  time to join the future
Java 8 time to join the futureParadigma Digital
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxParadigma Digital
 
Orquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixOrquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixParadigma Digital
 
Meetup microservicios: API Management
Meetup microservicios: API ManagementMeetup microservicios: API Management
Meetup microservicios: API ManagementParadigma Digital
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.Paradigma Digital
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxParadigma Digital
 
Implementando microservicios
Implementando microserviciosImplementando microservicios
Implementando microserviciosParadigma Digital
 
Equipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma DigitalEquipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma DigitalParadigma Digital
 
Analysis of Websites as Graphs for SEO
Analysis of Websites as Graphs for SEOAnalysis of Websites as Graphs for SEO
Analysis of Websites as Graphs for SEOParadigma Digital
 
Use Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projectsUse Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projectsParadigma Digital
 

Más de Paradigma Digital (20)

Ddd + ah + microservicios
Ddd + ah + microserviciosDdd + ah + microservicios
Ddd + ah + microservicios
 
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
 
Have you met Istio?
Have you met Istio?Have you met Istio?
Have you met Istio?
 
Linkerd a fondo
Linkerd a fondoLinkerd a fondo
Linkerd a fondo
 
Horneando apis
Horneando apisHorneando apis
Horneando apis
 
Java 8 time to join the future
Java 8  time to join the futureJava 8  time to join the future
Java 8 time to join the future
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFlux
 
Orquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixOrquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace Netflix
 
Meetup microservicios: API Management
Meetup microservicios: API ManagementMeetup microservicios: API Management
Meetup microservicios: API Management
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
 
Implementando microservicios
Implementando microserviciosImplementando microservicios
Implementando microservicios
 
Equipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma DigitalEquipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma Digital
 
Python y Flink
Python y FlinkPython y Flink
Python y Flink
 
Kafka y python
Kafka y pythonKafka y python
Kafka y python
 
Cultura Digital Paradigma
Cultura Digital ParadigmaCultura Digital Paradigma
Cultura Digital Paradigma
 
Introducción a Kubernetes
Introducción a KubernetesIntroducción a Kubernetes
Introducción a Kubernetes
 
Analysis of Websites as Graphs for SEO
Analysis of Websites as Graphs for SEOAnalysis of Websites as Graphs for SEO
Analysis of Websites as Graphs for SEO
 
Use Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projectsUse Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projects
 
Introducción a Django
Introducción a DjangoIntroducción a Django
Introducción a Django
 

Último

KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 

Último (16)

KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 

Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones web

  • 1. Cambia la forma de desarrollar tus aplicaciones web Leganés, 6-7 Febrero 2014 @fatimacasau
  • 2. ¿Qué vamos a ver? ¿Qué es? Características Getting Started Features + Código @t3chfest 2014 @fatimacasau
  • 3. JVM Dinámico Tiempo de ejecución @CompileStatic (versión 2.x) Ruby, Phyton, Smaltalk @t3chfest 2014 @fatimacasau
  • 4. Groovy ~ Java Sencillo + Expresivo = Coding by Convention GDK - Groovy Development Kit (JDK extension) Groovy ~ Superversión de Java @t3chfest 2014 @fatimacasau
  • 5. Getting Started Descarga: http://groovy.codehaus.org/Download Terminal: $ groovysh $ groovyconsole Web Console: http://groovyconsole.appspot.com/ IDEs: @t3chfest 2014 @fatimacasau
  • 6. Features OOP Clases: Getters/Setters y constructores implícitos Closures Sobrecarga de operadores Soporte nativo para cadenas (Gstrings) y colecciones @t3chfest 2014 @fatimacasau
  • 7. HelloWorld.java class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } } @t3chfest 2014 @fatimacasau
  • 8. HelloWorld.groovy class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } } @t3chfest 2014 @fatimacasau
  • 9. HelloWorld.groovy (groovy style) ! class HelloWorld { def name def greet() { "Hello $name" } } ! def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet() @t3chfest 2014 @fatimacasau
  • 10. GStrings // Múltiples líneas con y sin salto de línea (también con triple ") assert '''hello, world''' == 'hello,nworld‘ ! assert 'hello, world' == 'hello, world‘ ! // Sustitución de variables con dobles comillas def name = 'Groovy' assert "hello $name, how are you today?" == "hello Groovy, how are you today? ! def a = 'How are you? ' assert "The phrase '$a' has length ${a.size()}" =="The phrase 'How are you?' has length 12" @t3chfest 2014 @fatimacasau
  • 11. Listas def list = [5, 6, 7, 8] assert list.get(2) == 7 assert list[2] == 7 ! assert ! list instanceof java.util.List def emptyList = [] assert emptyList.size() == 0 ! emptyList.add(5) assert emptyList.size() == 1 ! emptyList << 3 assert emptyList.size() == 2 ! emptyList << 'Groovy' assert emptyList.size() == [5, 3, 'Groovy'] @t3chfest 2014 @fatimacasau
  • 12. Rangos // an inclusive range def range = 5..8 assert range instanceof java.util.List assert range.size() == 4 assert range[2] == 7 assert range.contains(5) assert range.contains(8) // lets use a half-open range range = 5..<8 assert range.size() == 3 assert range.contains(5) assert ! range.contains(8) assert range.from == 5 assert range.to == 7 ! range = 'a'..'d' assert range == ['a','b','c','d'] @t3chfest 2014 @fatimacasau
  • 13. Mapas def map = [name: "Gromit", likes: "cheese", id: 1234] assert map instanceof java.util.Map ! assert map.get("name") == "Gromit" assert map.get("id") == 1234 ! assert map["name"] == "Gromit" assert map ['id'] == 1234 ! assert map.name == "Gromit" assert map.id == 1234 ! def emptyMap = [:] assert emptyMap.size () == 0 ! map.foo = 4 assert map.foo == 4 @t3chfest 2014 @fatimacasau
  • 14. Closures Bloques de código Pueden asignarse a variables Tienen variables implícitas Pueden utilizar variables externas Pueden pasarse como argumento de métodos @t3chfest 2014 @fatimacasau
  • 15. Closures ! def ! myConst = 5 def incByConst = { num -> num + myConst } ! println ! incByConst(10) // => 15 //variable implícita it def clos = { print it } clos( "hi there" ) //prints "hi there" @t3chfest 2014 @fatimacasau
  • 16. Loopsy estructuras de control if(){}else{} ! while(){} ! for(i in [1,2,3]){} for(i=0;i<5;i++){} for(i=0;j=10;i<10;i++;j--){} for(i=0;…;i<10;…;n++){} ! [1,2,3].each{ println it } [“a”,“b”,“c”].eachWithIndex(){it,i-> println “$i : $it”} ! 3.times(){…} 5.upto(10){…} 10.1.downto(1.1){…} 0.step(10,2){…} (1.. 5).each{…} @t3chfest 2014 @fatimacasau
  • 17. La ‘verdad’ en Groovy Falso Null new Object() 0 1 [] [1,2,3] [:] [name:'fatima'] "" @t3chfest 2014 Verdad 'abc' @fatimacasau
  • 18. Sobrecarga de Operadores Operator Method a == b a != b a.equals(b) or a.compareTo(b) == 0 ** !a.equals(b) a <=> b a.compareTo(b) a > b a.compareTo(b) > 0 a >= b a.compareTo(b) >= 0 a < b a.compareTo(b) < 0 No NullPointerException @t3chfest 2014 @fatimacasau
  • 19. Otros Operadores Not operator (!) !expresión Spread operator (*.) list*.attribute Safe navigation operator (?.) object?.attribute Elvis operator (?:) a = a?:"" @t3chfest 2014 @fatimacasau
  • 20. Más… ! Groovy SQL ! sql.execute('insert into people (firstName, lastName) values (?,?)', [firstName, lastName]) sql.eachRow('Select * from Person') {} ! Dates ! plus(), minus(), after(), before() GregorianCalendar, String.format(String format, GregorianCalendar c) ! Expresiones regulares ! "potatoe" ==~ /potatoe/ ! Files eachFile(), eachDir(), eachLine()… @t3chfest 2014 @fatimacasau
  • 22. ! Documentación oficial ! Groovy Codehaus: http://groovy.codehaus.org/Documentation ! ! Ejercicios ! Groovy Koans: https://github.com/cjudd/groovy_koans ! ! @t3chfest 2014 @fatimacasau
  • 23. ¿Qué vamos a ver? ¿Qué es? Principios y filosofía Ventajas Getting Started Arquitectura @t3chfest 2014 @fatimacasau
  • 24. Plataforma para el desarrollo de aplicaciones web JavaEE Construido sobre un conjunto de frameworks consolidados Apoyado por una extensa librería de plugins Soluciona todas las necesidades en el desarrollo de aplicaciones web Facilita el desarrollo de dichas aplicaciones Utiliza GROOVY como lenguage @t3chfest 2014 @fatimacasau
  • 25. ! ! ! ! ! ! ! ! ! ! Tomcat y H2 incluidos para desarrollo rápido @t3chfest 2014 @fatimacasau
  • 26. Principios y filosofía Patrón MVC (Modelo, Vista, Controlador) CoC (Convention over Configuration) Nombres descriptivos Localización de ficheros que indican lo que son Paradigma Coding by Convention de GROOVY ! DRY (Don’t Repeat Yourself) Inyección de dependencias @t3chfest 2014 @fatimacasau
  • 27. ¿Por qué? Menos código + menos errores = ++productividad Fly reloading Abstracción de los frameworks sobre los que se asienta Línea de comandos (run-app, war, install-plugin…) Eliminación de XML’s gracias a CoC Extensa librería de plugins @t3chfest 2014 @fatimacasau
  • 28. Getting Started JDK y JAVA_HOME Download: http://grails.org/download Terminal: $ grails run-app $ grails> IDE’s: Crear una aplicación grails> create-app myApp @t3chfest 2014 @fatimacasau
  • 29. Comandos grails [environment]* [command name] ! Environments: dev, test, prod ! Custom Environment: -Dgrails.env=myEnv ! Comandos más usados: run-app war clean install-plugin test-app create-domain-class create-controller ceate-service generate-all @t3chfest 2014 @fatimacasau
  • 30. Configuración Config.groovy Ejemplo: my.property.text = “hola” Acceso: grailsApplication.config.my.property.text BuildConfig.groovy Datasource.groovy Bootstrap.groovy ApplicationResources.groovy UrlMappings.groovy @t3chfest 2014 @fatimacasau
  • 31. Environments ! grails.util.Environment ! Custom environments ! Detección de entornos: ! environments { production{ configureForDevelopment() } … } _______________________________________ import grails.util.Environment ! switch (Environment.current) { case Environment.DEVELOPMENT configureForDevelopment() break … } @t3chfest 2014 @fatimacasau
  • 32. Arquitectura MVC Modelo - domains (GORM), services (Spring) Vista – views & templates (gsp’s), TagLibs Controlador – controllers & actions, filtros @t3chfest 2014 @fatimacasau
  • 33. GORM Grails Object Relational Mapping (Hibernate 3) Clases de dominio getters y setters implícitos constructores por defecto eventos Mapeos sin configuración save(), delete(), list(), count()… Constraints para validación namedQueries @t3chfest 2014 @fatimacasau
  • 34. GORM Mapeo de relaciones One-To-One, One-To-Many, Many-To-Many Finders dinámicos findAllBy(), findBy(), findWhere()… Para búsquedas más complejas HQL, criterias, detachedCriterias, executeQueries Ordenación y paginación sort, order, max, offset … @t3chfest 2014 @fatimacasau
  • 35. Controllers Actions Closures Métodos que reciben parámetros que vienen del formulario Redirect de otros actions, mappings Renders de vistas, templates, texto, json, xml Command Objects Objeto flash para enviar messages Filtros que interceptan controllers, actions, views @t3chfest 2014 @fatimacasau
  • 36. Servicios ! Spring ! Inyección automática en: ! Otros servicios Controllers Domains TagLibs @t3chfest 2014 class MyService { def anyMethod(){ //… } } _______________________________________ class MyController { def myService def anyAction(){ //… myService.anyMethod(…) //… } } @fatimacasau
  • 37. GSP’s Groovy Server Pages Templates, includes Reutilización de código Extensa librería de Tags sin configuración g:each, g:if, g:form, g:formRemote, g:formatDate, g:link, g:remoteLink, g:remoteFunction, g:datePicker, g:set … @t3chfest 2014 @fatimacasau
  • 38. URL Mappings ! class UrlMappings { static mappings = { ! "/product"(controller: "product", action: "list") "/"(view: "/index") // map the root URL "/product/$id"(controller: "product") "403"(controller: "errors", action: "forbidden") "/product/$id"(controller:"product") { action = [GET:"show", PUT:"update", DELETE:"delete“, POST:"save"] } name accountDetails: "/details/$acctNumber" { controller = 'product' action = 'accountDetails' } } } @t3chfest 2014 @fatimacasau
  • 39. Deployment Command line Para ejecutar Puerto por defecto 8080: grails run-app Especificar puerto: grails -Dserver.port=8090 run-app Generar un war: Entorno de producción por defecto: grails war Especificar entorno: grails -Dgrails.env=myEnv war @t3chfest 2014 @fatimacasau
  • 40. Más… ! jQuery ! Ajax ! Creación de Plugins ! SpringSecurity Plugin ! I18n ! Testing con Spock integrado ! Scripts: Gant ! Injección de dependencias con ! Spring: Spring DSL’s, resources.groovy Scaffolding – No recomendado @t3chfest 2014 @fatimacasau
  • 41. Documentación de grails ! http://grails.org/doc/latest/guide/ Listas de correo ! http://grails.org/Mailing+lists Grails Blog ! http://grails.org/blog Issue Tracker ! http://jira.grails.org/browse/GRAILS Grupo de Google – Grails en Castellano http://groups.google.es/group/grailsencastellano @t3chfest 2014 @fatimacasau