En el grupo de google de ITP_JAVA y en Springperu pueden encontrar mas detalles sobre este evento, los diferentes demos y codigo fuentes de las demos.
Por mi parte, ya les dije que soy parte de joedayz y soy el encargado de la investigación e integración con nuestro framework en grails, hice una pequeña demo en grails, no fue la gran cosa pero el objetivo era dar a conocer las bondades que nos ofrece desarrollar con grails, ya que casi nadie sabia lo que es grails (al menos en la conferencia nadie sabia sobre este framework).
La aplicacion que hice se trataba de un mantenimiento de libros con autor, incluyendo una busqueda para libros y exportacion a excel y a pdf... ahhh y ademas explicamos como configurar la Base de datos en nuestro proyecto. Todo esto en menos de 30 minutos, claro explicando cada punto que estaba dando y por supuesto, respondiendo preguntas del público presente.
Les dejo con la explicacion del proyectito que hice:
El primer paso logicamente es descargarme Grails, configurar la variable de entorno para grails (Grails_Home) y tambien de java (Java_Home).
Verificamos si es que todo esta conforme con el siguiente script: grails help, si todo esta conforme, te deberia mostrar la version de grails que estas utilizando y una lista de scripts que puedes usar.
Bueno procedamos a la creación de nuestro proyecto
[sourcecode language='java']
grails create-app BookStore
[/sourcecode]
Con este Script creamos una estructura básica para nuestro proyecto.
Entramos al directorio de nuestra aplicacion: cd Bookstore
Resumire las carpetas que se han creado:
* grails-app: Carpeta donde tendremos que modificar para su funcionamiento(controllers, vistas, clases de dominio, taglibs, configuraciones,etc.)
* lib: Librerías para nuestro proyecto
* plugins: Plugins instalados
* scripts: Scripts Gant
* src: Clases java o groovy adicionales.
* test: Para pruebas unitarias o de integracion para nuestro proyecto
* web-app: css, imágenes, html, etc.
Crearemos una clase dominio que se llamara Book
[sourcecode language='java']
grails create-domain-class Book
[/sourcecode]
Una clase dominio vendría hacer el corazon de nuestra aplicación, una de las caracteristicas mas importantes que tienen las clases dominio es que automáticamente son mapeadas en un tabla fisica de nuestra Base de datos, y son persitentes (despues vamos a configurar la BD).
Abrimos nuestra clase dominio, que se encuentra en BookStore/grails-app/domain/Book.groovy
Break: (explicar dos puntos)
- Recordemos que grails esta basado en Groovy, es por ello que lleva una extension .groovy.
- Podemos abrir nuestras clases groovy con cualquier editor de texto, o si prefieren pueden utilizar cualquiera de los Plugin que estan disponibles para los IDEs.
Modificamos nuestra clase dominio Book poniendo solamente esto:
String titulo
String autor
Ahora Crearemos nuestro Controller para nuestra Clase domino Book.
[sourcecode language='java']
grails create-controller Book
[/sourcecode]
A continuacion veremos un concepto muy conocido en lenguajes dinamicos:
Scaffolding, básicamente es la generación de código automático para una aplicación CRUD.
Abrimos nuestro controller BookController (BookStore/grails-app/controller), y ponemos
BookController.groovy
[sourcecode language='java']
def scaffold = Book
[/sourcecode]
y eso es todo lo que tenemos que hacer para tener nuestra aplicacion CRUD para Book.
Ahora escribimos en consola el sgte script, para correr nuestra aplicación:
[sourcecode language='java']
grails run-app
[/sourcecode]
listo, lo podemos ver en http://localhost:8080/Bookstore
Si es que tienen un tomcat instalado y esta utilizando el puerto 8080, les va a salir un error, esto se soluciona de la sgte manera:
[sourcecode language='java']
grails -Dserver.port=9090 run-app
[/sourcecode]
y nuestra aplicacion correra en el 9090.
http://localhost:8090/Bookstore
Bien, si todo va bien debereria mostrarte la aplicacion CRUD.
En Grails viene por defecto embebido un contenedor de servlet Jetty y una BD en memoria HSQL.
Ahora modificaremos los datos de nuestra BD, y eso lo vamos hacer en el archivo DataSource
BookStore\grails-app\conf\DataSource.groovy
en nuestro caso vamos a cambiarla a Mysql:
[sourcecode language='java']
dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
dialect = org.hibernate.dialect.MySQLInnoDBDialect
username = "root"
password = "root"
}
// en la parte de environments modificamos la
// parte development
development {
dataSource {
dbCreate = "update"
url = "jdbc:mysql//localhost:3306/MyDataBase"
username = "root"
password = "root"
}
}
[/sourcecode]
Modificamos nuestra clase domino Book
[sourcecode language='java']
String titulo
Date fecha
String editorial
Autor autor
//constrainsts es para poner validaciones
static constraints = {
titulo(nullable:false, blank:false, size:1..80)
fecha()
editorial(nullable:false, blank:false, size:1..60)
autor(nullable:false, blank:false, size:1..60)
}
[/sourcecode]
Creamos una clase dominio Autor:
ponemos en consola
[sourcecode language='java']
grails create-domain-class Autor
[/sourcecode]
y abrimos la clase y modificamos su contenido
[sourcecode language='java']
String nombre
String apellido
static constraints = {
nombre(nullable:false, blank:false, size:1..80)
apellido(nullable:false, blank:false, size:1..80)
}
[/sourcecode]
Ok.. todo bien!!!
Bien ahora nos toca aprender otro script generate-all, este script nos va generar toda nuestra vista y controladores para una clase dominio especifica.
Entonces escribimos en consola el sgte script
[sourcecode language='java']
grails generate-all Book
[/sourcecode]
Nos preguntará si es que queremos sobreescribir el controller que ya anteriormente hemos creado... le decimos que si ('y').
Igualmente hacemos lo mismo para la clase dominio Autor.
[sourcecode language='java']
grails generate-all Autor
[/sourcecode]
y corremos nuestra aplicacion
[sourcecode language='java']
grails run-app
[/sourcecode]
ya esta.... tenemos dos CRUD con validaciones y persistentes.
Ahora vamos hacer algo nuevo.
instalaremos un plugin para dar una nueva funcionalidad a mi aplicación. En este caso sera un plugin para busquedas.
[sourcecode language='java']
grails install-plugin searchable
[/sourcecode]
añadiremso a nuestra clase de dominio Book, la sgte variable:
[sourcecode language='java']
String titulo.....
//Variable para la busquedas.
static searchable = true
static constraints = {....
[/sourcecode]
y generamos la vista y controller para Book
[sourcecode language='java']
grails generate-all Book
[/sourcecode]
corremos nuestra aplicacion, y obtendremos este resultado.
update 25-05-09
Bueno, ahora lo que vamos hacer es exportar nuestra lista a un excel y a un pdf.
Comenzaremos primero con la instalación del plugin export:
[sourcecode language='java']
grails install-plugin export
[/sourcecode]
Despues de la instalación añadiremos a nuestro archivo Config.groovy
[sourcecode language='java']
grails.mime.types = [ html: ['text/html','application/xhtml+xml'],
xml: ['text/xml', 'application/xml'],
text: 'text/plain',
js: 'text/javascript',
rss: 'application/rss+xml',
atom: 'application/atom+xml',
css: 'text/css',
csv: 'text/csv',
pdf: 'application/pdf',
excel: 'application/vnd.ms-excel',
all: '*/*',
json: ['application/json','text/json'],
form: 'application/x-www-form-urlencoded',
multipartForm: 'multipart/form-data'
]
[/sourcecode]
En nuestro archivo list.gsp de nuestra clase dominio Book (BookStore\grails-app\views\book), ponemos lo sgte:
[sourcecode language='java']
...
...
....
[/sourcecode]
y en el controller modificamos lo sgte:
[sourcecode language='java']
import org.codehaus.groovy.grails.commons.ConfigurationHolder
class BookController {
def exportService
....
def list = {
params.max = Math.min( params.max ? params.max.toInteger() : 10, 100)
if(!params.max) params.max = 10
if(params?.format && params.format != "pdf"){
response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
response.setHeader("Content-disposition", "attachment; filename=books.${params.format}")
exportService.export("pdf", response.outputStream,Book.list(params), [:], [:]) }
if(params?.format && params.format != "excel"){ response.contentType=ConfigurationHolder.config.grails.mime.types[params.format]
response.setHeader("Content-disposition", "attachment; filename=books.${params.format}")
exportService.export("excel", response.outputStream,Book.list(params), [:], [:]) }
[ bookInstanceList: Book.list( params ), bookInstanceTotal: Book.count() ]
}
......
[/sourcecode]
y ya esta.... tenemos la exportacion de excel y de pdf. El Plugin export soporta los sgtes formatos:
* CSV
* Excel
* ODS
* XML
Conclusión:
Grails ha nacido para ser un framework con el que sea agradable trabajar, sin repetir código (autogeneracion de codigo),con una curva de aprendizaje relativamente baja, con instalacion de plugin que facilitan tareas, etc, un largo etc.
Allli esta el codigo completo.
BookStore
RECURSOS
www.grails.org
www.groovy.org.es
www.manual-de-grails.es --->libro en español
http://www.ibm.com/developerworks/java/library/j-grails01158/
1 comentario:
Thanks for posting, I really enjoyed reading your newest post. I think you should post more often, you obviously have talent for blogging!
Publicar un comentario