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...
Getting Started
Descarga:

http://groovy.codehaus.org/Download

Terminal: $ groovysh

$ groovyconsole

Web Console: http:/...
Features
OOP
Clases: Getters/Setters y constructores implícitos
Closures
Sobrecarga de operadores
Soporte nativo para cade...
HelloWorld.java
class HelloWorld {
private String name;
public void setName(String name) {
this.name = name;
}
public Stri...
HelloWorld.groovy
class HelloWorld {
private String name;
public void setName(String name) {
this.name = name;
}
public St...
HelloWorld.groovy (groovy style)

!

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

!

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

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

!
assert
!

list instanceof java.util.List

de...
Rangos
// an inclusive range
def range = 5..8
assert range instanceof java.util.List
assert range.size() == 4
assert range...
Mapas
def map = [name: "Gromit", likes: "cheese", id: 1234]
assert map instanceof java.util.Map

!

assert map.get("name")...
Closures
Bloques de código
Pueden asignarse a variables
Tienen variables implícitas
Pueden utilizar variables externas
Pue...
Closures

!
def
!

myConst = 5

def incByConst = { num ->
num + myConst
}

!
println
!

incByConst(10) // => 15

//variabl...
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++;...
La ‘verdad’ en Groovy
Falso
Null

new Object()

0

1

[]

[1,2,3]

[:]

[name:'fatima']

""

@t3chfest 2014

Verdad

'abc'...
Sobrecarga de Operadores
Operator

Method

a == b
a != b

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

a <=> b

a.c...
Otros Operadores
Not operator (!)
!expresión

Spread operator (*.)
list*.attribute

Safe navigation operator (?.)
object?....
Más…

!

Groovy SQL

!

sql.execute('insert into people (firstName, lastName) values (?,?)',
[firstName, lastName])
sql.ea...
Libros
!

@t3chfest 2014

@fatimacasau
!
Documentación oficial

!

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

!
!
Ejercicios

!

Groovy Koans:
ht...
¿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 p...
!
!
!
!
!
!
!
!
!
!

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
Lo...
¿Por qué?
Menos código + menos errores = ++productividad
Fly reloading
Abstracción de los frameworks sobre los que se
asie...
Getting Started
JDK

y JAVA_HOME

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

$ grails run-app

$ grails>

IDE’s:
Crea...
Comandos

grails [environment]* [command name]

!

Environments: dev, test, prod

!

Custom Environment: -Dgrails.env=myEn...
Configuración
Config.groovy
Ejemplo: my.property.text = “hola”
Acceso: grailsApplication.config.my.property.text

BuildCon...
Environments
!
grails.util.Environment

!
Custom environments

!
Detección de entornos:

!

environments {
production{
con...
Arquitectura MVC
Modelo - domains (GORM), services (Spring)
Vista – views & templates (gsp’s), TagLibs
Controlador – contr...
GORM
Grails Object Relational Mapping (Hibernate 3)
Clases de dominio
getters y setters implícitos
constructores por defec...
GORM
Mapeo de relaciones
One-To-One, One-To-Many, Many-To-Many
Finders dinámicos
findAllBy(), findBy(), findWhere()…
Para ...
Controllers
Actions
Closures
Métodos que reciben parámetros que vienen del formulario
Redirect de otros actions, mappings
...
Servicios

!

Spring

!

Inyección automática en:

!

Otros servicios
Controllers
Domains
TagLibs

@t3chfest 2014

class M...
GSP’s
Groovy Server Pages
Templates, includes
Reutilización de código
Extensa librería de Tags sin configuración
g:each, g...
URL Mappings

!

class UrlMappings {
static mappings = {

!

"/product"(controller: "product", action: "list")
"/"(view: "...
Deployment
Command line
Para ejecutar
Puerto por defecto 8080: grails run-app
Especificar puerto: grails -Dserver.port=809...
Más…
!
jQuery
!
Ajax
!
Creación de Plugins
!
SpringSecurity Plugin
!
I18n
!
Testing con Spock integrado
!
Scripts: Gant
!
...
Documentación de grails

!

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

Listas de correo

!

http://grails.org/Mailing+lists

Gra...
Eventos

@t3chfest 2014

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

@t3chfest 2014

@fatimacasau
Upcoming SlideShare
Loading in...5
×

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

265

Published on

Fátima Casaú, especializada en Groovy & Grails y en Metodologías Ágiles, nos explicó en esta charla cómo Groovy & Grails están revolucionando el desarrollo de aplicaciones web.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
265
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Cambia la forma de desarrollar tus aplicaciones web Leganés, 6-7 Febrero 2014 @fatimacasau
  2. 2. ¿Qué vamos a ver? ¿Qué es? Características Getting Started Features + Código @t3chfest 2014 @fatimacasau
  3. 3. JVM Dinámico Tiempo de ejecución @CompileStatic (versión 2.x) Ruby, Phyton, Smaltalk @t3chfest 2014 @fatimacasau
  4. 4. Groovy ~ Java Sencillo + Expresivo = Coding by Convention GDK - Groovy Development Kit (JDK extension) Groovy ~ Superversión de Java @t3chfest 2014 @fatimacasau
  5. 5. Getting Started Descarga: http://groovy.codehaus.org/Download Terminal: $ groovysh $ groovyconsole Web Console: http://groovyconsole.appspot.com/ IDEs: @t3chfest 2014 @fatimacasau
  6. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 17. La ‘verdad’ en Groovy Falso Null new Object() 0 1 [] [1,2,3] [:] [name:'fatima'] "" @t3chfest 2014 Verdad 'abc' @fatimacasau
  18. 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. 19. Otros Operadores Not operator (!) !expresión Spread operator (*.) list*.attribute Safe navigation operator (?.) object?.attribute Elvis operator (?:) a = a?:"" @t3chfest 2014 @fatimacasau
  20. 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
  21. 21. Libros ! @t3chfest 2014 @fatimacasau
  22. 22. ! Documentación oficial ! Groovy Codehaus: http://groovy.codehaus.org/Documentation ! ! Ejercicios ! Groovy Koans: https://github.com/cjudd/groovy_koans ! ! @t3chfest 2014 @fatimacasau
  23. 23. ¿Qué vamos a ver? ¿Qué es? Principios y filosofía Ventajas Getting Started Arquitectura @t3chfest 2014 @fatimacasau
  24. 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. 25. ! ! ! ! ! ! ! ! ! ! Tomcat y H2 incluidos para desarrollo rápido @t3chfest 2014 @fatimacasau
  26. 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. 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. 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. 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. 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. 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. 32. Arquitectura MVC Modelo - domains (GORM), services (Spring) Vista – views & templates (gsp’s), TagLibs Controlador – controllers & actions, filtros @t3chfest 2014 @fatimacasau
  33. 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. 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. 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. 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. 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. 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. 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. 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. 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
  42. 42. Eventos @t3chfest 2014 @fatimacasau
  43. 43. https://github.com/fatimacasau/blog-example-grails-app @t3chfest 2014 @fatimacasau
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×