Grails Introducción
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 programación Compatible con librerías 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 dinámico Principios: DRY Don t repeat yourself Convention-over-Configuration - minimiza la configuración en archivos externos Groovy Permite desarrollo ágil De la empresa SpringSource, actualmente comprada por VMWare Versión actual 1.3.4
Si los lenguajes fueran barcos JAVA Rails/Grails
Si los lenguajes fueran barcos PHP
Ventajas Desarrollo rápido Alta productividad Reutilización de código No debemos reinventar la rueda, permite concentrarnos en la solución del problema
Configuración del entorno de desarrollo Bajar y extraer la última distribución de Grails desde la página (grails.org) Definir variable GRAILS_HOME apuntando al directorio de Grails Añadir /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
Características Generales Lenguaje de programación orientado a objetos Alternativa al lenguaje de programación Java Dinámico con funcionalidades similares a la de Python, Ruby, Pearl y Smalltalk Puede compilarse a Java bytecode standard y ser usado en cualquier projecto Java
Características Generales (cont) Closures Código reutilizable y asignable Ej: each Operadores pueden ser sobrecargados Ej: Operador + puede ser usado para suma aritmética o concatenación de Strings Operador de navegación 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-línea 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: Números Java Soporta tipos primitivos y objetos Tiene clases wrapper para permitir conversión (ej: Integer) Java 5+ tiene autoboxing Groovy 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 números Ej: 3 * 4 es lo mismo que 3.multiply(4)
Lenguaje: Números 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 // división 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 especificación JSR 310
Lenguaje: Listas, Mapas, Rangos Listas & Mapas Sintaxis especial para literales Métodos 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 código pueden ser almacenados en variables, ser pasados, combinados en formas estructuradas para formar algoritmos y datos más 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? machea 0 o 1 ocurrencia de a a o string vacío a* machea 0 o más ocurrencias de a string vacío, a, aa, aaa, etc a+ machea 1 o más ocurrencias de a 'a', 'aa', 'aaa', etc a b machea con a o b 'a' or 'b' [woeirjsd] machea cualquier carácter especificado 'w', 'o', 'e', 'i', 'r', 'j', 's', 'd' [1-9] machea cualquier carácter en el rango '1', '2', '3', '4', '5', '6', '7', '8', '9' [^13579] machea cualquier carácter que no está contenido incluso digitos y otros caracteres (ie) agrupar una expresión ie ^a machea un a al comienzo de una línea a a$ machea un a al final de una línea 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, colección, Map, etc Se puede usar el for de Java Con closures each() eachwithindex()
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 líneas
Asignaciones múltiples 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
Paréntesis opcionales Se puede omitir los paréntesis si el método tiene al menos un parámetro println Hola Mundo! ficha.mover desde:[3,4], hasta:[4,5] def bean = new Expando(nombre: Juan", lugar: Montevideo", id:123)
Navegación segura Con?. podemos evitar los NullPointerException
Extras Ejecutar Proceso proc = "ls -l".execute() println(proc.in.text) println(proc.returncode()) Bajar página web print http://www.google.com".tourl().text Agregar un JAR al classpath en tiempo de ejecución 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 fácil de construir estructuras de datos jerárquicas Lo hace a través 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 Métodos y clases son por defecto public
Qué es MVC? Modelo-Vista-Controlador Patrón de arquitectura y diseño de software Descrito por primera vez en 1979 Muy utilizado en aplicaciones web
Introducción al patrón MVC
Modelo Capa de lógica del negocio Modela los datos y el comportamiento Responsable de: Consultas a la base Calculos logicos del negocio Procesar órdenes Independiente de la presentación
Vista Capa de presentación Muestra información Muestra resultados de la lógica del negocio No le interesa como se obtuvo la información, o de donde viene (responsabilidad del modelo)
Controlador Capa de control Sirve como la conexión lógica entre las acciones del usuario y los servicios del negocio Responsable de las decisiones de presentación (ej: idioma, niveles de acceso, etc) Un request entra a la aplicación a través de la capa de control, la cuál decidirá como debe ser manejado y que información debe ser retornada
Flujo MVC Flujo de datos en una aplicación MVC