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
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' •
¿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
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
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
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
[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")
(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!
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)
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
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
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
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"/>
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
solo una clase. ◦ No tenemos infraestructura de la aplicacion. ◦ Deben ser lo mas aisladas posibles ◦ ApiControllerUnitSpec , VideoUnitSpec ◦ Mock: VideoControllerUnitSpec
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
¿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