Grails joe dayz

1,104
-1

Published on

Published in: Education, Spiritual
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,104
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
15
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Grails joe dayz

  1. 1. GrailsJosé Díaz Díaz y colaboradores.
  2. 2. Primera Edición, Julio de 2011www.joedayz.peEl libro se ha publicado bajo la Licencia Creative Commons 2
  3. 3. Índice general Índice general Prólogo Agradecimientos Autores del Libro ¿Cuál es el objetivo de este libro? CAPITULO I: INTRODUCCION CAPITULO II: EL PROYECTO CAPITULO III: FUNDAMENTOS DE LA WEB TEKDAYZ
  4. 4. A Dios por la paciencia que tiene conmigo y porque me ha proveido todo lo que mi corazón necesita. A la memoria de Paco, mi Padre y mejor amigo, a quien admiro y recuerdo todos los días de mi vida.A Catalina mi gran Madre que me enseño a ganarme la vida desde muy niño y siempre me ha apoyado en lo personal y profesional. A Miryan mi linda esposa, quien salva mi vida día a día. Me ha dado cuatro hijos maravillosos: Elías, Felipe, Liam y Deborah. A la Iglesia y el Camino Neocatecumenal quienes me hacen ver mis miserias y me transmiten la fe que quiero compartir con mis hijos.
  5. 5. Prólogo
  6. 6. Agradecimientos
  7. 7. Autores del LibroJosé Amadeo Martin Díaz Díaz Nací en la ciudad de Huacho en Lima- Perú el 6 de Noviembre de 1974. Mis padres fueron José Francisco Díaz La Rosa y Catalina Díaz Baca. De ahí que mis apellidos sean “Díaz al cuadrado”. Mi infancia transcurrió en el distrito de Ventanilla de la provincia Constitucional del Callao. Mis padres y yo llegamos a dicho distrito en el año 1980. Estudie toda mi primaria en el Colegio Nacional Victor Andres Belaunde N° 5053 y toda mi secundaria en el Colegio Nuestra Señora de Belén. Termine mis estudios secundarios en el año 1990.Tras cuatro años de trabajar para pagarme mis estudios superiores ingrese a laPontificia Universidad Católica del Perú en el año 1994. Claro esta, dichos ahorrossólo alcanzarían para el primer y segundo ciclo. Bueno ese era mi plan “A”, no habíaplan “B” porque no tenía la menor idea de lo que pasaría cuando se acaben misahorros.En el tercer ciclo paso lo que nunca me espere. Tuve que dejar de estudiar un ciclo porla muerte de mi padre (Cancer). La Universidad informada por mi padre antes de morirque mi situación se complicaría, me facilito un préstamo integral que me exigía solomuy buenas notas y en su lugar me daba estudios, asistencia medica y una módicaasignación mensual para subsistir. A mis 19 años no tenía más que elegir, así quedecidí aceptar y continuar con mis estudios. Es un acontecimiento que de todo corazónhubiese querido no pasar, pero, la historia de uno se compone de momentos que no
  8. 8. podemos controlar.Finalmente, tras cinco años de carrera, logre terminar en quinto superior como Bachillerde Ingeniería Informática en el año 2000, para posteriormente titularme como Ingenieropor Tesis en el año 2002.Luego desarrollaría siete años de experiencia laboral en el periodo comprendido del2000 al 2007. En Agosto del 2007 decido independizarme fundando JOEDAYZ.COM miconsultora de desarrollo y entrenamiento de software. Desde esa fecha marca mi iniciocomo emprendedor independiente apoyado de un gran grupo humano que ha permitidoque en el 2011 hallamos desarrollado proyectos a nivel nacional y sudamericano conun éxito rotundo en cada uno de ellos.Desde el año 2010 también inicie mi labor académica como docente en la carrera deIngeniería de Sistemas de la Universidad Peruana de Ciencias Aplicadas gracias a larecomendación e invitación de mi amigo Lennon Shimokawa.Bueno eso es lo que en lo profesional me ha dado muchas satisfacciones. En lopersonal mi vida inicia con uno de los mejores días de mi vida. El casamiento con mipreciosa esposa Miryan Ramirez Ortega en el año 2005 quien me ha dado cuatro hijosmaravillosos: Elías, Felipe, Liam (en el cielo) y Deborah a los cuales dedico todas lasacciones, servicios, productos que desarrollo en mi vida.Esto último de repente a nadie le puede sonar importante, pero, para mi si ha sidoimportante ser parte del Camino Neocatecumenal desde el año 2003. Gracias al apoyode mi comunidad y de mis Catequistas mi vida personal y profesional ha dado un girode 360°. Siempre en busca de la verdad por delante y con una vocación de serviciopara la comunidad y clientes.Espero en verdad que este primer libro le sea de gran utilidad a quien lo lea y esperono sea el último también que escriba. Sean constructivos y levantenme la moral para elsegundo libro.Se que muchos profesionales como yo no tienen tiempo, así que intentare hacerlo muydidactico para que pueda despertar el lado cognitivo del lector y el aprendizaje seapermanente.Su colaborador José Díaz.
  9. 9. ¿Cuál es el objetivo de este libro?El objetivo de este libro es proporcionar información tecnológica en nuestro idioma natal ya quela mayoría de los libros recientes están en ingles. Así que no hay excusa para leerlo.Brindar a la comunidad información disponible de forma gratuita para que lo pueda aplicar ensu ámbito profesional y generar oportunidades para ellos.Como Docente y Profesional tengo a mi alcance mucha información que cuando estudiaba oegresaba me era casi imposible de tener. Incluso en las empresas en las que he trabajado noexiste una biblioteca, y si la empresa decide pagar un curso (raro en verdad), son pocos losinvitados a dicho curso.Siendo más directos este libro es para todos aquellos que ante la excusa de que no haypresupuesto, esta en otro idioma, estoy en otro país y comprar el físico me resulta muy caro, noleen o se quedan con lo que ven en el día a día. En una carrera como la informática o sistemaseso es suicidio.Pues aquí esta este libro digital totalmente disponible para todos los interesados en desarrollaraplicaciones web para la plataforma JEE de una manera ágil y productiva.
  10. 10. CAPITULO I: INTRODUCCION
  11. 11. CAPITULO II: EL PROYECTODesarrollaremos una aplicación real en varias iteraciones. Lo que si garantizo que luego dever como se desarrolla esta aplicación de cero e incluyendo temas avanzados podras tomar tusegundo proyecto sin problemas.2.1 Introducción a TekDayz.peEn Lima-Perú se estan realizando en estos últimos tiempos muchas confererenciastecnológicas, open spaces y vamos a aprovechar la coyuntura para desarrollar una aplicaciónweb que le permita a la comunidad anunciar, planear, y promover localmente conferencias,open spaces. Entonces la aplicación nos ayudara a organizar un evento: hacer una lista decosas por haer, el dashboard de un organizador (voluntarios, sponsors, potenciales asistentes),un foro de discusión y una pagina del evento totalmente personalizada para ayudar con lapromoción. Veremos que con Grails esto sera posible de una manera sencilla y rapida.2.2 Requerimientos de la AplicaciónLa lista de funcionalidades a realizar en nuestra aplicación: ● Crear nuevos eventos ● Mostrar detalles del evento ● Editar detalles del evento ● Crear usuarios / organizadores ● Permitir a usuarios voluntarios ayudar ● Añadir usuarios a eventos ● Permitir usuarios anonimos registrar su interes ● Crear sponsors ● Añadir sponsors a eventos ● Tener una lista por defecto de tareas ● Añadir/remover tareas
  12. 12. ● Asignar tareas a usuarios ● Post a un Foro ● Responder un mensaje en el foro ● Mostrar hilos de mensajes en el foro ● Personalizar pagina de eventos ● Permitir acceso a la pagina del evento con un simple URL2.3 Iteración CeroEn esta iteración configuraremos nuestro entorno de desarrollador grails.Instalando Grails 1. En primer lugar hay que ir a la pagina http://grails.org/Download y bajar el .zip o .tar.gz segun corresponda. 2. Descomprimio el .zip en una carpeta G:Toolsgrails-1.3.7, por ejemplo 3. Añado la variable de entorno GRAILS_HOME apuntando al directorio del punto 2. Luego añado al path %GRAILS_HOME%bin. 4. Me aseguro que una versión de JDK 5+ este instalada y que exista su variable de entorno JAVA_HOME.Para testear nuestra aplicación tipeamos:
  13. 13. Scripts de GrailsGrails viene con scripts predefinidos los cuales se ejecutan con el comando grails. Tenemosscripts para crear aplicaciones, ejecutar tests o ejecutar la aplicación.Tipeemos por ejemplo:Nota: Nosotros tambien podemos construir nuestros propios scripts.Configurando nuestro espacio de trabajo$grails create-app TekDayz
  14. 14. Grails entonces crea una estructura de directorios y archivos.Entramos a la aplicación y la ejecutamos así:$cd TekDayz$grails run-appNota: Si tu puerto 8080 esta ocupado. Puedes cambiar de puerto con esta sentenciagrails -Dserver.port 28080 run-appOJO: El comando lo tienes que llamar desde el directorio TekDayz
  15. 15. Grails nos avisa que esta en un entorno de desarrollo, ver las lineas:Environment set to developmentDesarrollar en el modo de desarrollo nos permite hacer autoreload, hacer cambios y verlosinmediatemente sin necesidad de bajar el contenedor. Asimismo, nos permite trabajar con unabase de datos en memoria.
  16. 16. Con otros frameworks necesitaria añadir librerias para obtener estos servicios, crear paginaspor defecto, crear y modificar xmls. Con Grails esto ya se ha obtenido con un simple comando.Anatomía de un proyecto en GrailsCon el comando create-app se han creado varios directorios y archivos. Estos siguen elprincipio de grails “convencion sobre configuracion”, así que cada directorio tiene una razon deser.A continuación una breve descripción de cada directorio: ● grails-app: Es el directorio principal de la aplicacion. Contiene los siguientes directorios ○ conf: contiene los archivos de configuracion para Hibernate y Spring si se desea usar. ○ controllers: aqui tenemos las clases controller, que son los puntos de entrada a nuestra aplicacion grails ○ domain: tiene las clases de dominio, representa la persistencia de datos ○ i18n: guarda los archivos properties para la internacionalizacion ○ services: aqui estaran las clases de servicio, las cuales son beans manejados por spring ○ taglib: aqui tenemos tag libraries personalizados para groovy server pages (GSP) ○ utils: para clases utilitarias, codigo reutilizable ○ views: para guardar las vistas GSP ● lib: aqui estaran los jars externos que por alguna razon necesitamos (como los drivers jdbc) ● scripts: puede contener scripts groovy personalizados que seran utilizados en la aplicacion ● src: contiene directorios para archivos java y groovy. Los archivos en este directorio estan disponibles para la aplicacion en tiempo de ejecucion. ● test: contiene diretorios para test unitarios y de integracion. ● web-app: contiene directrios para imagenes, css, y javascript.
  17. 17. El archivo application.properties se usa para guardar el nombre de nuestra aplicación y laversión, asimismo la lista de plug-ins que se ha usado.La versión, por defecto, para nuestra aplicacion Grails es la 0.1 (app.version=0.1).En este punto seguro nos hemos preguntado con que herramienta podemos modificar losarchivos de nuestro proyecto. Pues para suerte nuestra tenemos magnificos IDEs comoEclipse, NetBeans y Intellij IDEA que nos permiten administrar una gran cantidad de archivosy nos dan el soporte en la sintaxis. Aunque te comento que con el uso de “convencion sobreconfiguracion” y la limpia sintaxis de Groovy, se puede depender menos del IDE, así quepuedes usar hasta notepad.
  18. 18. CAPITULO III: FUNDAMENTOS DE LA WEB TEKDAYZEn este capitulo, se implementaran tres caracteristicas de TekDayz. Tendremos al terminar laposibilidad de crear, ver y modificar nuevas conferencias tecnicas (code camps, open space, olo que queramos). A todos estos nos referiremos como eventos.
  19. 19. Grails nos permite realizar la creacion, modificacion y elminacion de nuestras clases de dominioinmediatamente.3.1 Creando una clase de dominioEl corazón de una aplicación en grails es su modelo de dominio, esto es, el conjunto de clasesde domino y sus relaciones.Una clase de dominio representa data persistente y por defecto, es utilizado para crear unatabla en la base de datos. Grails tiene un script para crear una clase de dominio denominadocreate-domain-class.Vamos a crear la clase TekEvento con el siguiente comando:$ grails create-domain-class TekEventoGrails crea la clase de dominio y el test unitario.Esa clase TekEvento.groovy la crea grails en ...grails-appdomaintekdayz
  20. 20. El contenido inicial es:Vamos a añadir el siguiente código:package tekdayzclass TekEvento { String city String name String organizer String venue Date startDate Date endDate String description static constraints = { }}Por ahora, vemos que organizer esta como String, más adelante crearemos la clase User parahacer un diseño más orientado a objetos.Vamos a continuación a añadir el método toString() para obtener una salida personalizada:String toString(){ "$name, $city"}
  21. 21. 3.2 Más acerca de clase de dominioAhora que tenemos la clase TekEvento creada ya podemos crear instancias de esta clase yguardar los mismos en la base de datos. Podemos realizar busquedas de instancias existentespor medio de su id o sus properties. ¿te preguntaras donde esta toda esa funcionalidad?La pregunta es valida porque ya podemos llamar a métodos como TekEvento.save(),TekEvento.list() y TekEvento.findAllByStartGreaterThan(new Date()-30).Nota: ¿Si Groovy es un lenguaje dinamico, porque has especificado tipos a tus propiedades?Por ahora, la razón es simple para que nos cree la tabla de la base de datos acorde con esostipos de datos.Antes de dejar las clases de dominio de las cuales hablaremos a lo largo del libro, tenemos quehacer notar que Grails añade dos propiedades persistentes: id y version a nuestras clases dedominio. Estas propiedades son ambas Integers. La propiedad id es el unico PK en la tabla quees creada y el version es usado por Grails para optimistic concurrency.3.3 Probando nuestras clases de dominioComo se menciono anteriormente Grails hace las tareas correctas para nosotros, como crearclases test de nuestras clases de dominio. Así que vamos a añadir un test para nuestra claseTekEvento.Nota: Cuando trabajas con un lenguaje dinamico como Groovy, trabajar con test automatizadoses muy importante. Ademas con Groovy es mucho mas facil hacerlo que con Java o C#. Ver elcapitulo 16 de Programming GroovyGrails ya incluye el JUnit testing framework, por esa razón nos provee dos tipos de testing,unitario y de integración. Desde que el objetivo de un test unitario es simplemente testear unasimple clase aisladamente, los test unitarios en Grails no proveen acceso a ninguno de loscomportamientos dinamicos que estan disponibles en otros momentos.Abrimos TekEventoTests.groovy en TekDayztestunittekdayz y deberíamos ver algo asi:package tekdayzimport grails.test.*class TekEventoTests extends GrailsUnitTestCase {
  22. 22. protected void setUp() { super.setUp() } protected void tearDown() { super.tearDown() } void testSomething() { }}Nosotros podemos añadir los tests que deseemos tan solo colocandole la palabra test al inicio.Vamos a reemplazar testSomething() por testToString(). void testToString() { def tekEvento = new TekEvento(name: Spring One, city: Lima, PE, organizer: Jose Diaz, venue: Av. Universitaria, startDate: new Date(6/8/2011), endDate: new Date(6/8/2011), description: Desarrollo agil en JEE...) assertEquals Spring One, Lima, PE, tekEvento.toString() }El test es simple estamos creando un new TekEvento usando el constructor con argumentospor nombre y luego asignando este a la variable tekEvento y posteriormente verificando elassert de que el valor esperado es igual a tekEvento.toString().Grails provee un script llamado test-app que por defecto ejecuta todos los test unitarios y deintegracion de la aplicación. Podemos usar el flag -unit para probar y ejecutar solo los testunitarios.$ grails test-app -unit
  23. 23. Cada testCase es mostrado, y cada test individual es listado con su resultado. El resultadopuede ser SUCCESS, FAILURE, o ERROR. FAILURE significa que el test se ejecuto con uno omas fallas de assertion. ERROR significa que una excepcion ocurrió. Si el evento es FAILUREo ERROR, encontraremos informacion muy util en los reportes HTML que Grails produce. Lalinea final es la salida que test-app da y es la ubicación de dichos reportes.3.4 Trabajando con nuestro dominioEl paso siguiente es permitir a los usuarios crear instancias TekEvento. Para poder hacer estonecesitamos crear una clase controller. Las clases controller son los despachadores de unaaplicación Grails. Todos los requests desde el browser son atentidos por un controller. Grailstambien tiene un script para crear controllers:$ grails create-controller TekEventoEsto creara el archivo TekEventoController.groovy en TekDayzgrails-appcontrollerstekdayz ytest/unit/TekEventoControllerTests.groovypackage tekdayz
  24. 24. class TekEventoController { def index = { }}La linea def index = {} es una acción. Nosotros durante el desarrollo tendremos controllerscon muchas acciones en su interior. Pero, ahora tomaremos ventaja de una de las grandescaracteristicas de grails denominado dynamic scaffolding.El Dynamic scaffolding genera un controller con un conjunto de acciones y vistas respectivas(paginas). Para tener todo lo mencionado, vamos a modificar TekEventoController y dejarlo asi:class TekEventoController { def scaffold = TekEvento}Ejecutamos la aplicación y veremos un link a TekEventoController en la pagina index.Dicho link llama a la vista list que es una de las primeras vistas disponibles gracias alscaffolding, asi como tambien: create, edit y show.La lista esta vacía porque no hemos creado ningun evento. Pero podemos crear un newTekEvento con el botón etiquetado como New TekEvento.3.5 Modificando Código que no existe
  25. 25. El scaffolding tiene algunos issues que describimos a continuación: ● La vista List ○ El logo de grails, es algo que debemos cambiar para el sitio web ○ La columna id es una columna que los usuarios no deberían ver ○ ¿Como podemos cambiar el orden de las columnas? ● La vista create ○ El logo y orden de campos tambien afectan a esta vista ○ No ha suficiente espacio para el campo Description e ingresar contenido significativo ○ No necesitamos ingresar minutos y segundos para la fecha de inicio y fin de un eventoComo vemos se necesita realizar cambios y haremos eso personalizando la clase TekEVento.Constraints de nuestra clase de Dominio
  26. 26. Grails usa nuestra clase de dominio para hacer algunas decisiones cuando usamos elscaffolding. Por ejemplo, los tipos de las propiedades son usados para determinar queelementos HTML se utilizaran. Pero, nosotros podemos añadir nuestro propio constraintsa nuestra clase de dominio. Los constraints son una forma de decirle a Grails como seranlas propiedades de nuestra clase de dominio. Tambien los constraints son utilizados pararealizar validaciones cuando grabamos, para determinar algunos aspectos en la generación delesquema de base de datos, y para las vistas generadas por scaffolding. Entonces usaremoslos dos primeros usos modificando TekDays/grails-app/domain/TekEvent.groovy y añadir elsiguiente codigo: static constraints = { name() city() description(maxSize:5000) organizer() venue() startDate() endDate() }Los constraints consisten de bloques de codigo, los cuales son llamados Groovy closure.Dentro de cada bloque listamos cada una de la propiedades, seguida por parentesis. Dentro dedichos parentesis incluimos uno o mas pares de key/valor que representan a la regla aplicadaa dicha propiedad. El orden que le demos a las propiedades en el bloque constraint serausado para determinar el orden de display en la vista generada por scaffolding. El constraintmaxSize que hemos añadido afectara al campo description y tambien afectara al esquemade generacion de la base de datos. Por ejemplo, en MySQL el campo description sera de tipoTEXT, los otros campos que no se han delimitado seran de tipo VARCHAR(255).
  27. 27. 3.6 Bootstrapping data de pruebaNo he encontrado la traducción, así que usaremos el termino gringo. El problema que tenemosahora con la aplicación es que no persiste la información que ingremos permanentemente.Cada vez que reiniciemos la aplicación, la data ingresada se perderá. Esto es porque se estautilizando una base de datos in-memory. Haremos que TekDays apunte a una base de datosreal, pero, por ahora, la base de datos in-memory HSQL es suficiente para nuestro inicio.Entonces si queremos tener datos ya pre cargados, grails nos da el siguiente archivo ekDays/grails-app/conf/BootStrap.groovy. Ese archivo tiene un metodo init() el cual es ejecutado aliniciar nuestra aplicacion. Si nosotros creamos instancias TekEvento ahí, tendremos cada vezque iniciemos la aplicacion data de prueba. Modifiquemos dicho archivo.
  28. 28. class BootStrap { def init = { servletContext -> def event1 = new tekdayz.TekEvento(name: Agile Open Lima, city: Monterrico, LI, organizer: Lennon Shimokawa, venue: PRI, startDate: new Date(7/02/2011), endDate: new Date(7/02/2011), description: Esta no sera una tipica conferencia. Seran open spaces sobre distintos temas de interes como kanban, scrum, xp, play, etc.) if (!event1.save()){ event1.errors.allErrors.each{error -> println "Un error ocurrio con el event1: ${error}" } } def event2 = new tekdayz.TekEvento(name: Java 4 Ever, city: San Miguel, LI, organizer: Jose Diaz, venue: Universitaria, startDate: new Date(8/12/2011), endDate: new Date(8/12/2011), description: Este evento sera para tocar las novedades con java 7, spring 3,grails, play.) if (!event2.save()){ event2.errors.allErrors.each{error -> println "Un error ocurrio con el evento2: ${error}" } } } def destroy = { }}Notaran que estamos usando (‘’’) tres simple apostrofes para la descripcion. Esta es una formaque nos permite Groovy para declarar un string en multiples lineas sin tener que usar el signo+.Si el grabar la instancia domain falla, su propiedad errors sera populada con uno o mas objetosError, lo cual nos dara mucha informacion sobre lo que sucedio.
  29. 29. Una vez salvado nuestros cambios, ejecutamos la aplicacion otra vez y veremos el resultado.
  30. 30. CAPITULO IV: TRABAJANDO CON RELACIONESEn esta iteración vamos a añadir mas clases de dominio y definir las relaciones entre ellos.El evento es la clave para nuestra aplicacion TekDayz, pero, nosotros no podemos tener unevento sin organizadores, voluntarios entusiastas que ayudaran en el tema. Los Organizadores
  31. 31. y Voluntarios son dos roles de usuarios. El mismo usuario puede ser organizador en un eventoy volutario en uno o mas. La clase de dominio TekDayz debe reflejar dichas relaciones, pero,este toma mas de una forma en una relación.

×