Está en la página 1de 43

Grails

Introduccin

Quienes soy?

Alejandro Mateo, Ingeniero de UDELAR


AQuA.

it

Que es Grails?
Framework de desarrollo web Construido sobre frameworks existentes (hibernate, spring, sitemesh, quartz, etc) Utiliza Groovy como lenguaje de programacin Compatible con libreras Java Plugins desarrollados por usuarios Toma principios de RoR

Grails

Hay cientos de frameworks para desarrollo web:

Struts, Wicket, Cocoon, Click, GWT, JSF, Seam, RIFE, Shale, Spring, Stripes, Tapestry, WebWork, etc

Cada uno con distintos niveles de madurez Distintas curvas de aprendizaje

Grails

Grails no reinventa la rueda, se basa en frameworks existentes e introduce un lenguaje dinmico Principios: DRY Dont repeat yourself Convention-over-Configuration - minimiza la configuracin en archivos externos Groovy Permite desarrollo gil De la empresa SpringSource, actualmente comprada por VMWare Versin actual 1.3.4

Si los lenguajes fueran barcos


JAVA

Rails/Grails

Si los lenguajes fueran barcos

PHP

Ventajas
Desarrollo rpido Alta productividad Reutilizacin de cdigo No debemos reinventar la rueda, permite concentrarnos en la solucin del problema

Configuracin del entorno de desarrollo


Bajar y extraer la ltima distribucin de Grails desde la pgina (grails.org) Definir variable GRAILS_HOME apuntando al directorio de Grails Aadir /bin de Grails a la variable PATH del sistema Asegurarse que est definido el JAVA_HOME apuntando a la JDK Descargar IDE

Netbeans 6.9 Sprint STS IntelliJ

Groovy

Caractersticas Generales

Lenguaje de programacin orientado a objetos Alternativa al lenguaje de programacin Java Dinmico con funcionalidades similares a la de Python, Ruby, Pearl y Smalltalk Puede compilarse a Java bytecode standard y ser usado en cualquier projecto Java

Caractersticas Generales (cont)

Closures Cdigo reutilizable y asignable Ej: each Operadores pueden ser sobrecargados Ej: Operador + puede ser usado para suma aritmtica o concatenacin de Strings Operador de navegacin segura: ? Comprueba que no haya nulls para continuar

Lenguaje: Strings
// Strings normales def nombre = Juan def apellido= Perez assert nombre * 2 == Juan Juan // true // GString def nombreCompleto = "$nombre $apellido" assert nombreCompleto == Juan Perez // true // Strings multi-lnea def multi = '''\ Esto es una prueba de strings multi-linea'''

Lenguaje: Strings (cont)


// Procesando caracteres assert hola'.toList() == [h, o, l, a] // true

def string = una prueba assert string.toList().unique().sort().join() == abenpru


// Invirtiendo palabras string.reverse() == gnirts

Lenguaje: Nmeros

Java

Soporta tipos primitivos y objetos Tiene clases wrapper para permitir conversin (ej: Integer) Java 5+ tiene autoboxing Trata todo como objetos a nivel de lenguaje Se utiliza BigDecimal por tipo por defecto para no enteros La sobrecarga de operadores se aplica a todas las operaciones comunes con nmeros

Groovy

Ej: 3 * 4 es lo mismo que 3.multiply(4)

Lenguaje: Nmeros
def x = 3 def y = 4 assert x + y == 7 // true assert x.plus(y) == 7 // true assert x instanceof Integer // true assert 4+ 3== 7 // 4.plus(3) assert 4-3== 1 // 4.minus(3) assert 4* 3== 12 // 4.multiply(12) assert 4% 3== 1 // 4.mod(3) assert 4** 3== 64 // 4.power(3) assert 4/ 3== 1.3333333333 // 4.div(3) assert 4.intdiv(3) == 1 // divisin normal de enteros

Lenguaje: Fechas
Casi el mismo soporte que Java Utiliza java.util.Date o java.util.Calendar Tiene soporte especial para cambiar fechas

date2 = date1 + 1.week 3.days + 6.hours

More utility methods expected for inputting and outputting dates Posibilidad de cambio con la especificacin JSR 310

Lenguaje: Listas, Mapas, Rangos

Listas & Mapas


Sintaxis especial para literales Mtodos comunes adicionales (sobrecarga de operadores)

def list = [3, new Date(), 'Jan'] def map = [a: 1, b: 2]

Rangos

Sintaxis especial para diversos tipos de rangos def letras = 'a'..'z' def numeros = 0..<10

Lenguaje: Listas
assert [1,2,3,4] == (1..4) assert [1,2,3] + [1] == [1,2,3,1] assert [1,2,3] << 1 == [1,2,3,1] assert [1,2,3,1] -[1] == [2,3] assert [1,2,3] * 2 == [1,2,3,1,2,3] assert [1,[2,3]].flatten() == [1,2,3] assert [1,2,3].reverse() == [3,2,1] assert [1,2,3].intersect([4,3,1]) == [3,1] assert [1,2,3].collect{ it+3 } == [4,5,6] assert[1,2,3,1].unique().size() == 3 assert [1,2,3,1].count(1) == 2 assert [1,2,3,4].min() == 1 assert [1,2,3,4].max() == 4 assert [1,2,3,4].sum() == 10 assert [4,2,1,3].sort() == [1,2,3,4] assert [4,2,1,3].findAll{ it%2 == 0 } == [4,2]

Lenguaje: Mapas
def mapa = [a:1, 'b':2] println mapa // ["a":1, "b":2] println mapa.a// 1 println mapa['a'] // 1 println mapa.keySet() // ["a", "b"]

Lenguaje: Estructuras de control


if (1) // ... if (object) // ... if (list) // ... for (item in iterable) { }

miMapa.each{ key, value -> println $key : $value }

Lenguaje: Closures

Datos y cdigo pueden ser almacenados en variables, ser pasados, combinados en formas estructuradas para formar algoritmos y datos ms complejos duplicar = { num -> num * 2 } println duplicar(3) // => 6 procesarLuegoImprimir = { num, closure -> num = closure(num); println "num es $num } procesarLuegoImprimir(3, doubleNum) // => num es 6 procesarLuegoImprimir(10) { it / 2 } // => num es 5

Expresiones Regulares
a?
a* a+ a|b [woeirjsd] [1-9] [^13579] (ie) ^a a$

machea 0 o 1 ocurrencia de a
machea 0 o ms ocurrencias de a machea 1 o ms ocurrencias de a machea con a o b machea cualquier carcter especificado machea cualquier carcter en el rango machea cualquier carcter que no est contenido agrupar una expresin machea un a al comienzo de una lnea machea un a al final de una lnea

a o string vaco
string vaco, a, aa, aaa, etc 'a', 'aa', 'aaa', etc 'a' or 'b' 'w', 'o', 'e', 'i', 'r', 'j', 's', 'd' '1', '2', '3', '4', '5', '6', '7', '8', '9' incluso digitos y otros caracteres ie a a

Imports por defecto


java.io.* java.lang.* java.math.BigDecimal java.math.BigInteger java.net.* java.util.* groovy.lang.* groovy.util.*

Looping
while (expr) { } for

Para cualquier array, coleccin, Map, etc Se puede usar el for de Java
each() eachWithIndex()

Con closures

Switch
Es compatible con Java Maneja cualquier valor para el Switch

instanceof (si el valor del case es una clase) expresiones regulares colecciones (incluido rangos)

default debe estar al final del switch

Ejemplo de Switch

Statements en varias lneas

Asignaciones mltiples

Ejemplos:

def (a, b) = [1, 2] //a ==1 y b == 2 def (Integer i, String s) = [1, 'Groovy'] def (a, b, c) = [1,2]
a

== 1 b == 2 c == null

Parntesis opcionales

Se puede omitir los parntesis si el mtodo tiene al menos un parmetro


println Hola Mundo! ficha.mover desde:[3,4], hasta:[4,5] def bean = new Expando(nombre:Juan", lugar:Montevideo", id:123)

Navegacin segura

Con ?. podemos evitar los NullPointerException

Extras
Ejecutar Proceso proc = "ls -l".execute() println(proc.in.text) println(proc.returnCode()) Bajar pgina web print http://www.google.com".toURL().text Agregar un JAR al classpath en tiempo de ejecucin this.getClass().classLoader.rootLoader.addURL(ne w File(nuevojar.jar").toURL())

Builders
Surgen por las complicaciones que implican las estructuras de rbol en los lenguajes tradicionales Provee un modo fcil de construir estructuras de datos jerrquicas Lo hace a travs de closures Por defecto: NodeBuilder, MarkupBuilder, AntBuilder y SwingBuilder

Tips
[1,2,3].each { print it; return } //imprime 123 [1,2,3].each { print it; throw new RuntimeException() } Shuffling

[1, 2, 3, 4, 5].sort { Math.random() } Collections.shuffle(list)

Gstring como template

Diferencias con JAVA

== significa equals para todos los tipos


En java == significa identidad para objetos y equals para tipos primitivos Identidad en groovy con is
foo.is(bar)

Declarando un array

int[] a = {1,2,3}; //no funciona en groovy int[] a = [1,2,3] //funciona en groovy

Diferencias con JAVA


for (int i=0; i < len; i++) {...} funciona en groovy for (i in 0..len-1) {...} for (i in 0..<len) {...} len.times {...}

Diferencias con JAVA


; son opcionales return es opcional Mtodos y clases son por defecto public

Qu es MVC?

Modelo-Vista-Controlador Patrn de arquitectura y diseo de software Descrito por primera vez en 1979 Muy utilizado en aplicaciones web

Introduccin al patrn MVC

Modelo

Capa de lgica del negocio

Modela los datos y el comportamiento Responsable de:


Consultas

a la base Calculos logicos del negocio Procesar rdenes

Independiente de la presentacin

Vista

Capa de presentacin

Muestra informacin Muestra resultados de la lgica del negocio No le interesa como se obtuvo la informacin, o de donde viene (responsabilidad del modelo)

Controlador

Capa de control Sirve como la conexin lgica entre las acciones del usuario y los servicios del negocio Responsable de las decisiones de presentacin (ej: idioma, niveles de acceso, etc) Un request entra a la aplicacin a travs de la capa de control, la cul decidir como debe ser manejado y que informacin debe ser retornada

Flujo MVC

Flujo de datos en una aplicacin MVC

También podría gustarte