Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Intro básica a Groovy & Grails

Intro básica a Groovy & Grails

Presentación para consumo interno en VirtualSoftware , 2013

jmiguel rodriguez

March 01, 2013
Tweet

More Decks by jmiguel rodriguez

Other Decks in Programming

Transcript

  1. Groovy Asumo que habeis visto ya la charla recomendada de

    Alvaro. Vamos a resumirla rápidamente
  2. • Lenguaje que corre en la maquina virtual Java <>

    Lenguaje Java • James Gosling: "mi mayor aportación ha sido la JVM, no el lenguaje" • Hasta ahora, los lenguajes dinámicos tenian que trampear la JVM, desde 2004 se comenzaron a estandarizar. • Los mayores avances en Java7 y Java8 seran para optimización de estos lenguajes
  3. • Hay cerca de 100 lenguajes que corren en la

    JVM. • Groovy el primero en ser admitido como estándar, otros muchos no lo son ni falta que hace • Clojure, Scala .. • Tambien implementaciones de otros lenguajes para correr en la JVM: Jython, JRuby, Ada, Basic que se benefician del 'write once, run everywhere' •
  4. Diferencias: • Imports por defecto • == es equals() .

    ¿Alguien quiere comparar referencias? • ; y return opcionales • Todas las exceptions son Unchecked: no es obligatorio usar try/catch • heredocs, interpolacion en cadenas • Cuando 'faltan' cosas (main, p.e), no es que no haga falta, es que Groovy 'se lo inventa en tiempo de compilación • get/set automáticos • Sobrecarga de operadores
  5. Listas lista = [33 , 55 , 22 , 44

    , 11 ] lista[2] => 55 lista.join(".") => 33.55.22.44.11 lista.sort(".") => 11.22.33.44.55 Mapas: map = ["Valor1": 1 , "Valor2" : "El segundo valor"] map["Valor1"] => 2 map.Valor1 => 2
  6. Cosas desordenadas: Closures: punteros a función Argumentos variables, por defecto

    it Metaprogramación (posibilidad de inyectar métodos en tiempo de ejecución a las clases o a las instancias). Posibilidad de interceptar llamadas a métodos inexistentes para tratar (por ejemplo, definir sobre la marcha) DSLs
  7. ¿Porque Grails? • Spring IO año pasado • Comparativa de

    frameworks http://www.slideshare. net/mraible/comparing-jvm-web-frameworks-spring-io-2012 (p.15) • Framework orientado a programas web • Alta productividad • Alta expresividad • Convención sobre configuración
  8. Clases de dominio • Contienen las clases que representan estructuras

    de datos • Se puede ver como equivalentes al modelo de datos, aunque en realidad dicho modelo se mantiene de forma automática mediante GORM e Hibernate • Implementan las relaciones entre entidades de dominio • Definen las validaciones • Pueden definir vistas para acceso a datos
  9. Clases de dominio (2) class Author { static hasMany =

    [books: Book] String name Date dateCreated Date lastUpdated } class Book { static belongsTo = [author: Author] String title } ...... def book = Book.get(1) ; book.delete() o def books = Book.findAllByName("El Señor de los Anillos")
  10. Clases de dominio (3) • eager y lazy fetch •

    bloqueo optimista o pesimista • Criteria: def criteria = Libro.createCriteria() def resultados = criteria { between("numeroDePaginas", 50, 100) eq("encuadernacion", "Rustica") or { like("autor", "%Reverte%") like("autor", "%Murakami%") } maxResults(10) order("autor", "desc") }
  11. Clases de dominio (4) • Named Queries static namedQueries =

    { availableVideos { eq('status',VideoStatus.AVAILABLE) } latestVideosAvailable {Integer max -> availableVideos() order 'dateCreated','desc' maxResults max ?: 10 } } .... def latestAvailable = Video.latestVideosAvailable(max).list()
  12. Clases de dominio (5) • Constraints class User { ...

    static constraints = { login size: 5..15, blank: false, unique: true password size: 5..15, blank: false email email: true, blank: false age min: 18 birthDate max: new Date() meCaeBienEsteUsuario blank: false, validator: { val, obj -> .... } } } .... user.save() ; user.hasErrors()
  13. Controllers 1. Recogen los parámetros de una página, los validan

    (puede que sobre la marcha construyan instancias de las clases de dominio que les toque) y llaman a un servicio para que haga todo el trabajo. 2. Recogen el resultado de la llamada del servicio y redirigen a la siguiente vista que tenga que mostrarse Nada mas!
  14. Controllers (2) • Los controladores tienen acciones: Son métodos publicos

    que (por CoC (Convention over Configuration)) se corresponden con acciones de las páginas: list, save, show.... • Los controllers tienen acceso a ciertos ámbitos (scopes) equivalentes las variables de session de http (en lwas): servletContext, session, request, params, flash • Un controller devuelve, tipicamente, un modelo y una vista (aqui tenemos el MVC)
  15. Controllers (3) • Modelo: Estructura de datos • Vista: presentación

    Aparte, el controller puede renderizar texto libre, o un template para ajax, o enlazar con otro controller, devolver un código de error (4XX, 5XX), devolver un JSON/XML para un API REST Nota: render Book.list() as JSON
  16. Servicios Son los que se deben encargar de realizar toda

    la logica de la aplicacion. Por defecto, son transaccionales. El mantener aqui la logica de negocio facilita la reutilizacion. Para usar un servicio en un controller hay que inyectarlo
  17. GSPs Son la definición de la parte visual de la

    aplicacion: plantillas y páginas que se pre-compilan en el serividor y devuelven el html al cliente Permiten, al estilo JSPs, incluir variables, ifs, bucles... dentro de la propia página mezclado con el html Aunque se soporta el formato <% %> JSP, no se aconseja La forma correcta es usando tags creados en taglibs. Lataglib principal viene de serie pero podemos crear propias
  18. GSPs Ejemplo: <g:each in="${[1,2,3]}" var="num"> <p>Number ${num}</p> </g:each> O enlaces

    'pre-creados': <g:link controller="book" action="list">Book List</g:link>
  19. Templates y Layouts Templates comienzan con _ (ej: _myTemplate.gsp) Layouts

    estan en la carpeta grails-app/views/layouts Se pueden aplicar layouts para cada página o layouts por convencion tanto a nivel de controlador como de accion <r:require modules="jquery, main, blueprint, charting"/>
  20. Veamos la anatomia de una aplicación real ... y nos

    ponermos a hacer algo desde cero. Algo mejor que un Hello World, ¿no?
  21. Creando una aplicacion básica • grails create-app charlaprj • cd

    charlaprj • grails integrate-with intellij • grails integrate-with git ◦ git init ◦ git status ◦ git add . ◦ git status ◦ git commit -m "JIRA-1: Initial commit" ◦ (Creamos el repo remoto. I have code...)
  22. Creando una aplicacion básica (II) • Creamos proyecto en Idea

    ◦ Nota: Vista grails • Veamos la estructura del proyecto
  23. Creamos un par de clases de dominio • Primero editamos

    Config.groovy: grails.project.groupId = 'es.virtualsw.charlaprj' Llegó el gran momento . . . . . . . . . . . . . . 3 2 1 $ grails create-domain-class Factura $ grails create-domain-class LineaDeFactura
  24. Recuperamos commit f0b3db0 Validators (por defecto blank: false, null: false)

    constraints , hasErrors() Hacemos lo que no se debe hacer: scaffolding $ grails generate-all es.virtualsw.charlaprj.Factura $ grails generate-all es.virtualsw.charlaprj. LineaDeFactura ¿Porque no usar scaffolding?. A veces podria esta bien
  25. Recuperamos commit 51d0be6 Tenemos scaffoling dbConsole (solo en desarrollo) Recuperamos

    commit b7cd49c - BootStrap y poco mas create-domain-class Cliente create-controller Cliente
  26. Testing: Sobre viral fest • Pruebas unitarias ◦ Se prueba

    solo una clase. ◦ No tenemos infraestructura de la aplicacion. ◦ Deben ser lo mas aisladas posibles ◦ ApiControllerUnitSpec , VideoUnitSpec ◦ Mock: VideoControllerUnitSpec
  27. • Pruebas de integracion ◦ Prueban integración entre modulos o

    servicios ◦ Tenemos parte de la infraestructura: hibernate y Spring (lo que incluye springSecurity y el resto de plugins que tengamos) ◦ No tenemos intraestructura http ◦ RegistrationCodeServiceIntegrationSpec ◦ VideoServiceIntegrationSpec
  28. • Pruebas funcionales ◦ Prueban la aplicacion de verdad ◦

    ¿Como?. Con la aplicacion completa corriendo y con uno o varios navegadores ◦ Veamos el código en Viralfest (aunque casca por los ultimos cambios) ◦ grails test-app functional: -Dgeb.env=firefox - echoOut