Share
Embed
Groovy & Grails
Betabeers
August 05, 2012
Transcript
45 slides
-
Fátima Casaú Pérez 5 años como Instructor y
Desarrollador de Software Especializado en: ◦ Plataforma Java ◦ Groovy & Grails ◦ Metodologías Ágiles Contacto: ◦ [email protected] ◦ @fatimacasau ◦ fatimacasau @fatimacasau -
Lenguaje dinámico Máquina Virtual de Java (JVM)
Acceso al API de Java GDK extensión de JDK Sobrecarga de operadores, tipado dinámico, closures… Java <> Groovy @fatimacasau -
Menos líneas dé código Menos errores Expresividad
Flexibilidad Aumento de la productividad @fatimacasau -
Sintaxis muy parecida a Java ◦ Curva de aprendizaje
plana Mismo modelo de programación - OO Acceso al API de Java - JDK Librerías propias - GDK Dinámico, expresivo, … Closures, sobrecarga de operadores, manejo de cadenas, … Coding by Convention @fatimacasau -
Dynamic Typing Tipado dinámico de datos Tiempo de
ejecución Ejemplo1: Variables Ejemplo2: Métodos @fatimacasau -
Manejo de colecciones Soporte nativo para: ◦ Listas ◦
Rangos ◦ Mapas @fatimacasau -
Strings & GStrings Cadenas en múltiples líneas con o
sin saltos ◦ Triples """ Uso de /, ' , " ó """ Sustitución de variables ◦ Uso de dobles " y ${} ejemplos @fatimacasau -
Closures Bloque de código ◦ Se define, se asigna
a una variable, se ejecuta después Puede asignarse a variables Variables implícitas ◦ it para closures con un solo argumento Free variables ◦ Referencia a variables de fuera de la closure ejemplos @fatimacasau -
Facilitan el manejo de algunos tipos de datos: ◦
Números ◦ Colecciones ◦ Cadenas ◦ Mapas ◦ … Operadores de Groovy Métodos de Java ◦ Lista de operadores y métodos Implementar los métodos anteriores en nuestros objetos (Groovy/Java) permite el uso de los operadores @fatimacasau -
Otros operadores ◦ Spread * items*.id ◦ Elvis
?: def b = a ?: '' ◦ Safe navigation ?. object?.property @fatimacasau -
Expresiones Regulares Groovy soporta expresiones regulares A través
de la expresión ~ =~ devuelve un Matcher() ==~ devuelve true/false si el String coincide con el patrón ejemplos @fatimacasau -
Loops ◦ while y for se pueden sustituir por
.each & .eachWithIndex if/else ◦ Operador ternario def x = y>0 ? 1 : -1 def x = y ?: 0 swith/case ◦ Cualquier tipo de datos en el “switch” y diferentes tipos de datos en los “case” @fatimacasau -
Groovy SQL import groovy.sql.Sql def sql = Sql.newInstance( 'jdbc:jtds:sqlserver://serverName/dbName- CLASS;domain=domainName',
'username', 'password', 'net.sourceforge.jtds.jdbc.Driver' ) sql.eachRow( 'select * from tableName' ) { println "$it.id -- ${it.firstName} -- " } o eachRow o firsRow o executeQuery inserts, updates, deletes … @fatimacasau -
Domain Specific Languages Lenguaje para modelar una parte del
dominio Resuelve problemas de ◦ Definición ◦ Modelado ◦ Representación Llamados mini-lenguajes Antepasado XML’s en JAVA ◦ struts-config.xml ◦ spring-config.xml ◦ … @fatimacasau -
Externos Internos CSS Styles Datasources por entornos en
groovy @fatimacasau -
Un kōan (公案; Japonés: kōan, Chino: gōng'àn) es, en la
tradición zen, un problema que el maestro plantea al novicio para comprobar sus progresos. http://es.wikipedia.org/wiki/Kōan La mejor forma de aprender y comprender el lenguaje Utilizan test unitarios Enseñan el lenguaje Groovy y su API Procedimiento: ◦ Ejecutar los Koans que fallan intencionadamente ◦ Sustituir __ para hacerlos funcionar koans @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 Software Libre - Bajo la licencia Apache 2.0 Software License @fatimacasau -
Patrón MVC (Modelo, Vista, Controlador) CoC (Convention over
Configuration) ◦ Nombres y localización de ficheros indican lo que son ◦ Paradigma Coding by Convention de GROOVY DRY (Don’t Repeat Yourself) ◦ Reutilización de código Inyección de dependencias @fatimacasau -
5 veces menos líneas de código ◦ Menos código
+ menos errores = productividad Fly reloading ◦ Recarga en caliente Capa de abstracción ◦ Facilita el uso de los frameworks sobre los que está construido Línea de comandos ◦ run-app, war, install-plugin… Eliminación de XML’s gracias a CoC Extensa librería de plugins @fatimacasau -
JDK 1.6 y JAVA_HOME Download GRAILS (v. 2.1)
◦ Trabajar por línea de comandos definir GRAILS_HOME ◦ Trabajar con Springsource Tool Suite Download Springsource Tool Suite ◦ Extensiones: Grails support & Groovy eclipse plugin Crear una aplicación ◦ command line: grails> create-app myApp ◦ o, en STS New Grails project @fatimacasau -
grails [environment]* [command name] Environments: dev, test, prod
o si es un entorno custom -Dgrails.env=myEnv Comandos más usados: ◦ run-app ◦ war ◦ clean ◦ install-plugin ◦ test-app ◦ create-domain-class ◦ create-controller ◦ ceate-service ◦ generate-all @fatimacasau -
Configuración básica: ◦ grails-app/conf/Config.groovy Ejemplo: my.property.text = “hola”
Acceso: grailsApplication.config.my.property.text Dependencias de librerías y plugins ◦ grails-app/conf/BuildConfig.groovy Base de datos ◦ grails-app/conf/Datasource.groovy Acciones al principio y al final ◦ grails-app/conf/Bootstrap.groovy Recursos: layout, javascript, css… ◦ Plugin Resources integrado ◦ MyAppResources.groovy ◦ Tag r:require en gsp’s @fatimacasau -
grails.util.Environment Custom environments Detección de entornos: environments
{ production{ … } … } Import grails.util.Environment switch (Environment.current) { case Environment.DEVELOPMENT: configureForDevelopment() break … } @fatimacasau -
Modelo ◦ domains – GORM Vista ◦ views
◦ Templates ◦ Includes ◦ Tags Controlador ◦ controllers ◦ Interacción con servicios ◦ Filtros @fatimacasau -
GORM – Grails Object Relational Mapping ◦ Hibernate 3
Clases de dominio – POGO’S ◦ Plain Old Groovy Object ◦ getters y setters implícitos Sin configuración ◦ Mapeos automáticos Otros métodos implícitos ◦ save(), delete(), list(), count()… Constraints para validación @fatimacasau -
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 … @fatimacasau -
Actions ◦ Closures ◦ Métodos que reciben parámetros que
vienen del formulario ◦ Redirect, chain, … Otros actions en el mismo controlador o de otros ◦ Renders views templates json … Interacción con la capa de servicios Objeto flash para enviar messages Filtros que interceptan controllers, actions, views para realizar comprobaciones, acciones, restricciones… @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:formatDate, g:link, g:datePicker, g:set … @fatimacasau -
Ejemplo class SimpleTagLib { def emoticon = { attrs,
body -> out << body() << (attrs.happy == 'true' ? " :-)" : " :-(") } } ◦ Uso <g:emoticon happy="true">Hi John</g:emoticon> Tag g:dateFormat def dateFormat = { attrs, body -> out << new java.text.SimpleDateFormat(attrs.format).format(attrs.date) } ◦ Uso <g:dateFormat format="dd-MM-yyyy" date="${new Date()}" /> @fatimacasau -
Inyección automática en: ◦ Otros servicios ◦ Controllers ◦
Domains class MyController { def myService def anyAction(){ //… myService.anyMethod(…) //… } } class MyService { def anyMethod(){ //… } } @fatimacasau -
URL’s bonitas Configuración ◦ grails-app/conf/UrlMappings.groovy class UrlMappings {
static mappings = { } } @fatimacasau -
DSL’s para mapear URL’s a: ◦ controllers y actions
"/product"(controller: "product", action: "list") ◦ views "/"(view: "/index") // map the root URL ◦ Con variables "/product/$id"(controller: "product") ◦ Response Codes "403"(controller: "errors", action: "forbidden") ◦ RESTful API para métodos HTTP "/product/$id"(controller:"product") { action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"] } @fatimacasau -
Command line ◦ Para ejecutar Puerto por defecto
8080: grails run-app Especificar un puerto: grails -Dserver.port=8090 run-app ◦ Generar un war: Entorno de producción por defecto: grails war Especificar un entorno: grails -Dgrails.env=myEnv @fatimacasau -
jQuery Ajax Creación de Plugins Security
◦ SpringSecurity Plugin Internacionalización ◦ I18n Testing ◦ Mocks Scripts ◦ Gant Injección de dependencias con Spring ◦ Spring DSL’s ◦ grails-app/conf/spring/resources.groovy Grails e Hibernate ◦ grails-app/conf/hibernate/hibernate.cfg.xml Scaffolding – No recomendado … @fatimacasau -
Documentación de grails ◦ http://grails.org/doc/latest/guide/ Listas de correo
◦ http://grails.org/Mailing+lists Nabble forums ◦ http://grails.1312388.n4.nabble.com/Grails-user-f1312389.html 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 Escuela de groovy Meetup Madrid GUG ◦ http://www.meetup.com/madrid-gug/ @fatimacasau