Desarrollo ágil de aplicaciones web
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
@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
@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
@fatimacasau
@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
Tomcat y H2 incluidos para desarrollo rápido
@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
@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
@fatimacasau
@fatimacasau