Lo que viene con Grails 1.1
Todavía no he tenido oportunidad(¿tiempo?) de probar las betas de la versión 1.1 de Grails, pero ya llevo unas semanas siguiendo un poco las novedades que están llegando con las tres betas que se han publicado, tanto con las relesae notes como en la lista de correo.
Hay cosas que me parecen muy interesantes: el trabajo que se ha hecho en cuanto infraestructura, el manejo de submits duplicados, el “nuevo” framework de testing, las mejoras para el desarrollo de plugins, poder usar GORM fuera de Grails…
Estas son las principales novedades:
GORM:
GORM es standalone, ya se puede usar fuera de Grails.
Se completan los eventos de GORM con afterInsert, afterUpdate y afterDelete.
Persistencia de colecciones de tipos básicos, como colecciones de String:
class Person {
static hasMany = [nicknames:String]
}
Persistencia de coleciones de tipos enum:
enum VehicleStatus { OFF, IDLING, ACCELERATING, DECELARATING }
class Truck {
static hasMany = [statuses:VehicleStatus]
}
Acceder a objetos persistentes en modo sólo lectura, buscándolos por id:
def book = Book.read(1)
Ordenación por defecto a nivel de clase y en las asociaciones:
class Book {
String title
static mapping = {
sort "title"
}
}
class Author {
static hasMany = [books:Book]
static mapping = {
books sort:"title"
}
}
Obtención por lotes a nivel de clase y en asociaciones:
class Book {
String title
static mapping = {
batchSize 15
}
}
Mejoras en los finders dinámicos. Se podrá utilizar el sufijo InList, cachear queries y usar bloqueo pesismista:
def books = Book.findByAuthorInList(['Dierk Koenig', 'Graeme Rocher'])
def book = Book.findByTitle("Groovy in Action", [cache:true] )
def book = Book.findByTitle("Groovy in Action", [lock:true] )
Relaciones uno a muchos unidireccionales con mapeo heredado, usando joinTable:
class Book {
String title
static belongsTo = Author
static hasMany = [authors:Author]
static mapping = { authors joinTable:[name:"mm_author_books", key:'mm_book_id' ] }
}
class Author {
String name
static hasMany = [books:Book]
static mapping = { books joinTable:[name:"mm_author_books", key:'mm_author_id'] }
}
Los tipos Enum pueden especificar un método getId() que GORM llamará para persistir el estado del enum
enum Country {
AUSTRIA('at'),
UNITED_STATES('us'),
GERMANY('de');
final String id
Country(String id) { this.id = id } }
Plugins:
Plugins globales, para instalar en todas las aplicaciones
grails install-plugin webtest -global
Múltiples repositorios de plugins:
grails.plugin.repos.discovery.myRepository="http://svn.codehaus.org/grails/trunk/grails-test-plugin-repo"
grails.plugin.repos.distribution.myRepository="https://svn.codehaus.org/grails/trunk/grails-test-plugin-repo"
Resolución transitiva de depndencias entre plugins.
Se puede definir un ámbito y el entorno donde un plugin se cargará o empaquetará
def environments = ['dev', 'test']
def scopes = [excludes:'war']
Desarrollo modular de aplicaciones usando plugins, sin necesidad de instalarlos y pudiendo estar en cualquier lugar del sistema de ficheros. Muy útil para probar un plugin propio en una aplicación real(esto antes resultaba incómodo), o para unir en una aplicación funcionalidades repartidas en plugins.
Testing:
Se ha añadido testing plugin como framework de tests que mejora el de las versiones 1.0.x
Data Binding:
Se pueden definir de qué propiedades se hace el binding:
person.properties["firstName","lastName"] = params
Es posible hacer binding de colecciones de objetos, Grails se encarga de instanciar los objetos y los índices:
<g:textField name="books[0].title" value="the Stand" />
<g:textField name="books[1].title" value="the Shining" />
<g:textField name="books[2].title" value="Red Madder" />
Scaffolding:
El scaffolding dinámico también generará las vistas usando los templates generados(y personalizados) con install-templates.
El scaffolding ahora soporta relaciones muchos a muchos y asociaciones uno a muchos unidireccionales.
Controllers:
Manejo de submits duplicados o invalidos usando el patrón Synchronizer Token:
//en el gsp
<g:form useToken="true">...</g:form>
//controlador
withForm {
// good request
}.invalidToken {
// bad request
}
Además de redireccionar ya es posible hacer forward de una petición:
forward controller:"home", action:"index"
Groovy Server Pages:
Ya es posible utilizar librerías de tags JSP, de igual forma que cualquier librería de tags GSP:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:formatNumber value="${10}" pattern=".00"/>
${fmt.formatNumber(value:10, pattern:".00")}
Un namespace propio para usar templates, tmpl:
//template _tableRow.gsp
<tr>
<td class="prop">${label}</td>
<td class="value">${value}</td>
</tr>
//Otro gsp
<tmpl:tableRow label="one" value="two" />
Es posible hacer includes de la respuesta de otro controlador, acción o vista en la vista actual:
<g:include controller="book" action="list"/>
Posibilidad de renderizar templates de los plugins:
<g:render template="pathToTemplateFile" plugin="miplugin"/>
Ahora los gsp se renderizan más rápido, evitando el uso de StringBuffer y StringWriter.
Infraestructura:
Grails viene con un plugin de Maven y un arquetipo:
mvn grails:create-pom
Integración con Ivy y Ant, crea el build.xml y el ivy.xml para construir la aplicación Grails sin que sea necesario que Grails esté instalado en el servidor.
BeanBuilder (el DSL de Spring), ahora soporta los namespaces de Spring pudiendo utilizar así el soporte de AOP.
Nuevo API para acceder al entorno de ejecución y a los meta datos de la aplicación:
switch(Environment.current) {
case Environment.DEVELOPMENT:
configureForDevelopment()
break
case Environment.PRODUCTION:
configureForProduction()
break
}
def metadata = grails.util.Metadata.current
println metadata.applicationName
println metadata.applicationVersion
Nuevo DSL para configurar Log4j
La configuración de los builds se ha flexibilizado pudiendo configurar diferentes aspectos en el nuevo BuildConfig
Posibilidad de encriptar las contraseñas del DataSource
–
Veremos qué añadidos/mejoras más aparecen en las RC y hasta que esté disponible Grails 1.1
February 2nd, 2009 at 7:22 pm
Hola tengo en mi programa un punto en el que debe sumar 2008 + 1; son dos int, me deberia devolver 2009 pero me devuelve 20081, sabes porque pueda ser?? gracias
February 2nd, 2009 at 9:15 pm
Hola Lili,
He estado pensando si contestarte o no, o simplemente borrar tu comentario:
1- Lo que preguntas NO tiene relación alguna con el post, para esto existen muchos foros donde te podrían ayudar.
2- Te está concatenando y no sumando… ¿Seguro que son 2 int?, ¿sobrecarga de operadores?
3- Cuando preguntes en un FORO, ayuda poner el código que no hace lo que esperas, en este caso está claro que te está concatenando.
3- No dices ni en que lenguaje de programación lo estás haciendo ¿Groovy?, ¿sobrecarga de operadores?…
4- Parece que tratas de hacer algo con fechas, me pregunto si es lo más conveniente usar int o un objeto tipo fecha(o algo similar en el lenguaje que estés trabajando)
En fin, que aún intentándolo, no creo haberte ayudado demasiado
February 3rd, 2009 at 9:50 pm
Hola, soy un fan de esta herramienta, y ya he hecho mis pinitos en ella con resultados sorprendentes (relación calidad-funcionalidad-tiempo asombrosa).
Simplemente quería recabar tu opinión sobre el futuro de este producto ahora que Spring ha hecho la compra de g2one, como crees que va a evolucionar y si la inversión en tiempo y esfuerzo de desarrollo de aplicaciones está garantizado a futuro.
Se que es difícil responder, pero te pido tu opinión
Gracias.
February 4th, 2009 at 4:58 am
Hola niceperl, pues no veo respuestas fáciles, no
Sobre la compra de g2one por parte de spring source, pues me parece una buena noticia, estando en el portfolio de spring puede tener más “fácil” la entrada al mundo empresarial.
Sobre la inversión de tiempo y esfuerzo en desarrollar aplicaciones con Grails, pues yo pienso que sí.
La comunidad está creciendo poco a poco y goza de buena salud, aparte de que lo haya comprado Spring: el tráfico en la lista de correo va aumentando, van apareciendo más plugins de todo tipo, se están publicando bastantes libros, parece que al menos en países anglosajones está teniendo buena aceptación(en UK se han desarrollado varios proyectos para empresas reconocidas como Pepsi y Sky)…
Sobre como va a evolucionar, pues lo más inminente está en el Roadmap, lo más probable es que se siga trabajando en facilitar la integración con otras tecnologías. Pero a mi me gustaría que se trabajara en hacer más sencillo/limpio el uso de REST, en que se crearan más taglibs que los que vienen de serie, named routes… en fin, que se trabajara también en mejorar la parte web.
Por curiosidad, ¿alguna url de algo que hayas desarrollado?
March 12th, 2009 at 3:12 pm
Hola que tal tengo un bronx con u gsp ya que dentro de un form he agregado un
esperaba que al ejecutarlo se fuera directo a ejecutar el action y el controler jajajaja pero no pasa nada ya he revisado que este bien el nombre del accion dentro de mi form y de mi controler pero no va por ahi puesto que decidi poner y por fin ejecuto el action pero esta no es la forma natural ya probe en Opera en Firefox y dios me ayude hasta en Explorer y nada. En fin muchas gracias por leerlo, saludos de Orizaba para el mundo
March 12th, 2009 at 3:20 pm
jajajaja que chido me quito mis tags va de nuez g:actionSubmit value=”Entrar” y lo cambie por input type=”submit” value=”login” y de nuevo muchas gracias
March 12th, 2009 at 6:47 pm
Hola Albinegro,
jejeje, recuerdo que también me confundí una vez con esto. Una opción es como dices, poner un input normalmente en HTML, pero puedes usar el tag submitButton, el actionSubmit es para enviar el formulario a una acción diferente a la del form(cuando se renderiza usa JS para hacerlo)
http://grails.org/doc/1.0.x/ref/Tags/actionSubmit.html
March 17th, 2009 at 12:38 pm
Excelente!!!! muchas gracias para la otra prometo leer la referencia de grails.
Saludos
March 23rd, 2009 at 3:17 pm
Hola que tal Dany uhmm otra ves molestando trato de hacer un ejercicio completo haciendo las operaciones basicas en una BD y si se puede ejecute algun Store (limosnero y con garrote) aunque sea sobre un solo dominio en grails y Mysql no se si ya has posteado algo o puedas recomendarme algun tutorial en fin muchas Gracias y saludos
March 24th, 2009 at 3:49 pm
Si te he entendido bien, sólo descargándote el driver de mysql y cambiando la configuración del DataSource ya sería suficiente.
Ahora no sé decirte una referencia concreta, pero hay algunos posts o proyectos open source por ahí que te pueden servir.