Manual Practico Capacitacion Grails

download Manual Practico Capacitacion Grails

of 26

Transcript of Manual Practico Capacitacion Grails

FRAMEWORK WEB GRAILSCapacitacin Empresarial a medida.

Fecha: Capacitador: Tema: Modalidad:

Febrero del ao 2012 Ing. Santiago Tapia Y. Desarrollo Rpido para Java Empresarial con el framework Grails v2.0 Video Conferencia Horas: 32 horas

MANUAL PRCTICO - CAPACITACIN SOBRE EL FRAMEWORK GRAILS:El presente manual est ideado para que se compagine con la teora expuesta en las dispositivas del curso, brindando el conjunto de pasos que se deben seguir para generar las aplicaciones de la vida real que se desarrollaron a lo largo de la presente capacitacin. NOTA: La versin del Grails con la que se trabajar el presente manual es la versin 1.3.7.

INDICE

Creacin de un proyecto Grais (2) Ejecutando el Proyecto en Tomcat (2) Creando Domain Clases (3) Validacin: Constratints (5) Creando Controllers (5) Scaffolding (6) Estadsticas (stats) (7) i18n (7) Custom Validators (8) Test Unitarios y de Integracin (8) Relaciones (9) One to Many (10) One To One (10) Many To Many (11) Bootstrapping (12) Migrar a otra Base de Datos (13) Generate-all (14) URL y Controllers (14) Views, Templates (14) Partial Templates (15) CSS (15) Tag Libs (16) Install-templates (17) Seguridad (18) Spring Security Core (21) Partabilidad, Exportacin y Deploying del Proyecto (25)

Empleando la consola de comandos ingresamos el comando grails create-app curso

La ejecucin de dicho comando generar mucha accin en la consola y con sto el esqueleto del proyecto, que debe aclararse todo proviene dela convencin que lleva Grails por atrs. NOTA: La explicacin detallada de cada una de las carpetas generadas se puede hallar en las diapositivas del curso.

Al tener ya nuestra aplicacin creada (y en un estado funcional), corremos la aplicacin para verificarlo mediante el comando grails run-app

Habr mucho movimiento en la consola y finalmente se nos notificar que la aplicacin est corriendo en el servidor. NOTA: se indica la urlincluido el puerto con el que podemos acceder a la aplicacin

En un browser apuntamos a la direccin que se nos indica y el resultado ser el siguiente:

NOTA: En caso de querer modificar la vista que se muestra por default al correr la aplicacin podemos hacerlo accediendo al archivo index.gsp enel path siguiente >/curso/grails-app/views/index.gsp

Partiendo del hecho que Grails entre sus postulados primarios est permitir que el desarrollador centre sus esfuerzos en crear la lgica denegocio en lugar de esfuerzo en tareas de carpintera como creacin desde cero de vistas, para lograr esto Grails sugiere que en primera instancia nos centremos en el desarrollo de las Clases de Dominio (Domain classes) pues a partir de ellas podremos generar muchas ms funcionalidades y cdigo, precisamente por su visin de Convencin sobre configuracin como parte bsica de su gestin de Desarrollo Rpido. Para crear las Domain Classes debemos digitar en consola el siguiente comando: grails create-domain-class com.capacitacion.Persona

Por convencin Grails nos ha creado ya un archivo que represente a la Domain Class Persona en la ubicacin >/curso/grailsapp/domain/com/capacitacion/Persona.groovy

NOTA: Por Convencin Grails crear tambin archivos para testing en >/curso/test/unit/com/capacitacion/PersonaTests.groovy. Este tema losanalizaremos en la seccin de pruebas.

Persona.groovy por default se crear sin contenido:

Para nuestro ejemplo, el resultado final de Persona.groovy ser:

NOTA: Como es notorio, una clase de dominio est conformada por atributos como nombre, password, bio, etc. Y dentro del bloque constraintsmostramos dichos atributos en el orden que queremos que aparezcan en pantalla, as como las validaciones necesarias. En las diapositivas pueden hallarse los Constraints disponibles que ofrece Grails.

Ya que posteriormente haremos relacionamientos entre Domain Clases, lo cual fin de cuentas se ver reflejado como relaciones entre tablas en labase de datos, necesitamos crear las siguientes clases: Curso y Facultad.

Para obtener los datos desde las Domain clases y presentar dicha informacin en la vista requerimos los controladores, los cuales se generan conel comando: grails create-controller com.capacitacion.Persona

Por convencin Grails crear ste controlador en: >/curso/grails-app/controllers/com/capacitacion/PersonaController.groovy

Al igual que lo ocurrido al momento de crear las Domain Clases, al crear los Controllers se generarn automticamente archivos de testing.Revsese la ruta: >/curso/test/unit/com/capacitacion

Con el procedimiento antes indicado creamos los controladores restantes para Curso y Facultad. El controlador de Persona lucir as:

El cdigo de la izquierda define la accin index del controlador Persona. Modificamos el cdigo para que luzca como el de la derecha y al Ejecutarla aplicacin apuntando en el browser a localhost:8080/curso/persona. renderiza la frase Capacitacin Grails al invocar la accin index del controlador Persona.

Ahora vamos a hacer uso de la caracterstica scaffolding de los controladores, aadiendo el siguiente cdigo al controlador Persona:

Esta caracterstica aade funcionalidad a la aplicacin casi como por arte de magia pues simplemente con esta nica lnea de cdigo que se haaadido al controlador, la aplicacin est teniendo ya funcionalidad CRUD. En la imagen siguiente puede verse el formulario de ingreso de una nueva Persona, as como la opcin show que permite edicin y borrado ( generado automticamente con scaffolding):

En ste punto vamos a verificar las estadsticas de cdigo de nuestra aplicacin. Para conseguirlo debemos digitar el comando: grails stats

Como es notorio, este comando nos permite ver las estadsticas a nivel de lneas de cdigo por archivos que pertenecen al proyecto. Para gestionar e internacionalizar los mensajes que presenta la aplicacin, debemos acceder al archivo en la siguiente ruta: >/curso/grailsapp/i18n/message_es.properties (asumiendo que la configuracin regional tenga al espaol como idioma nativo). En dicho archivo se podrn modificar todos los mensajes que aparecen en las vistas.

Para generar Validadores personalizados, dentro del bloque de constraints debemos aadir la instruccin validator, teniendo siempre en menteque el valor que retorne un validador ser booleano (true o false)

Para realizar Tests Unitarios, en el archivo PersonaTests.groovy (>curso/test/nit/com/capacitacion/PersonaTests.groovy) aadimos el siguientecdigo

Y en la Domain Class Persona.groovy, aadimos lo siguiente.

Generamos las pruebas con el comando grails test-app Persona y en la consola se presentar la salida de dicho test, es decir indicando si pas eltest o no. Para ste caso la aplicacin pas el test (Mrese la palabra PASSED).

Adicionalmente Grails presentar reportes en formato HTML de dichos tests; para acceder a los mismos tenemos que seguir la siguiente ruta:>\curso\target\test-reports\html:

Para crear Test de Integracin nos vamos a >/curso/test/integration y creamos el archivo PersonaIntegrationTests.groovy:

Verificamos el Test de Integracin digitando grails test-app -integration. La consola mostrar la salida, y al igual que en el caso de los TestsUnitarios tambin habr un reporta HTML.

Hasta este punto ya hemos creado nuestras Domian Classes, pero si queremos forzarlas a trabajar conjuntamente, compartiendo informacinentre ellas, tenemos que relacionarlas, y para lograrlo, estn los relacionamientos, que como se mencion anteriormente a fin de cuentas dicho relacionamientos tambin actan a nivel de Base de datos.

Para lograr el relacionamiento bidireccional OneToMany entre Curso y Persona (un curso est formado por varias personas) debemos aadir elsiguiente cdigo:

Ejecutamos la aplicacin en el servidor y vemos que ya hay un relacionamiento entre curso y persona. En la imagen se muestra la vista para crearuna persona. Como es notorio, debe tener asignado un curso.

Ntese que la manera en que se exhibe el nombre del curso en la pantala de Creacin de Persona proviene del mtodo toString de Curso:

Ahora vamos a generar un relacionamiento One To One entre Persona y Perfil (Una persona tiene uno y solo un perfil). Para lograrlo creamosinicialmente una Domain Class para Perfil con su respectivo Controller (con scaffolding).

No hace falta aadir cdigo en Persona. Al ejecutar la aplicacin vemos que Perfil ya est relacionado a Persona.

Vamos ahora a crear el reracionamiento Many To Many entre Curso y Facultad (Muchos cursos pueden estar en muchas facultades), para lo cualcreamos una Domain Class y el respectivo Controller para Facultad:

Para lograr el reracionamiento Many To Many necesitamos crear una Domain Class intermediaria: Estudio.

Ejecutamos la aplicacin y vemos que al aadir un nuevo Estudio, ya estn vinculados Curso y Facultad.

Si bien Grails al trabajar en entorno de Desarrollo tiene una memoria frgil y cada vez que se reinicia el servidor la informacin se pierde, pararemediar esto hay la caracterstica Bootstraping para que los datos no se pierdan con cada reiniciada del servidor. Para lograr esto nos abrimos el archivo >/curso/grails-app/conf/BootStrap.groovy y lo editamos de la siguiente manera:

NOTA: Desde ste momento cuando arranquemos el servidor ,la aplicacin ya tendr la informacin que suministramos en BootStrap.groovy

Ya que hemos trabajado con HSQLDB como gestor de pruebas ahora vamos a migrar a un gestor de base de datos ms robusto, para este casoMySQL. Para conseguir esta migracin debemos: Conseguir el driver JDBC para MySQL y copiarlo en: >/curso/lib

Crear en MySQL una base de datos llamada curso, as como un usuario con password para acceder a la misma. Ajustar el archivo DataSource.groovy para que trabaje ahora con MySQL: >/curso/grails-app/conf

Para sus posterior uso en el tema de seguridad y anlisis de generacin de cdigo con Grails crearemos una nueva Domain Class llamada User.

Necesitamos crear un controlador para User. En condiciones normales se habra usado el comando create-controller, pero para ver nuevasposibilidades que brinda Grails emplearemos grails generate-all que bsicamente genera el Controller as como Vistas pero implementadas. A continuacin una porcin del cdigo del controlador generado:

As mismo los archivos para la Vista de User generados automticamente con el comando generate-all.

No se debe olvidar que el Url de la aplicacin tiene una convencin:

Ahora vamos a trabajar en las vistas para modificar el archivo index que por default nos brinda grails. Para empezar vamos a quitar el logo deGrails de la pgina principal. Para hacer esto, debemos tomar en cuenta que Grails emplea templating (con SiteMesh) en la vista, as que nos dirigimos a: >/curso/grails-app/views/layouts/ y en el archivo main.gsp comentamos la siguiente lnea:

Y de la pgina principal ha desaparecido el logo:

Ahora vamos a crear un header personalizado, para lo cual emplearemos los Partial Templates. Creamos un archivo _header.gsp en>/curso/grails-app/views/layouts, con el cdigo siguiente:

En el archivo main.gsp hacemos la llamada a dicha Partial Template (sin incluir el guin bajo de _header):

Ya que el Partial Template, est llamandose. Vamos a darle estilos. Para esto, editamos el archivo >/curso/web-app/css/main.css aadiendo elsiguiente cdigo:

Adicionalmente aadiremos un Partial Template para el footer de la pgina. Creamos un archivo _footer.gsp con el siguiente cdigo.

En el archivo main.gsp hacemos la llamada a dicha Partial Template (sin incluir el guin bajo de _footer):

Editamos el archivo main.css aadiendo el siguiente cdigo.

Ejecutamos la aplicacin en el servidor y obtendremos una vista como la siguiente.

Hago notar que en el footer el ao 2012 esta quemado en el cdigo y para sanear el problema que puede aparecer al editar esta fechaemplearemos un Tag Lib que presente el ao actual en la aplicacin. Para esto, ejecutamos el comando grails create-tag-lib Footer y obtenemos el archivo vaco FooterTagLib.groovy en >/curso/grails-app/taglib/curso/FooterTagLib.groovy:

Editamos el archivo _footer.gsp, y la aplicacin ya tiene una etiqueta que muestra el ao actual en el footer.

Aparentemente es imposible customizar las vistas que se generan con la lnea def scaffold = true en los controladores, pero para lograrlodebemos editar directamente los templates que Grails usa para la generacin de cdigo. Para esto ejecutamos en la consola el comando: grails install-templates. Este comando le dice a Grails que genere el cdigo template para todas las vistas, controllers, domain classes, TagLibs, etc. Y con ellos tenerlo disponible para editarlo a nuestro favor. Los templates por default se generan en >/curso/src/templates

La carpeta artifacts contiene los templates para el cdigo formado por los comandos create-*. La carpeta sacaffolding como es notoriocontiene los templates que generan las vistas basadas en scaffolding, as como el cdigo formado por los comandos genrate-*, La carpeta war contiene el template para la generacion del deployment descriptor web.xml.

Ya que tenemos acceso a los templates de generacin de cdigo, si quisiramos por ejemplo que los controladores al generarlos con el comandocreate-controller por default usen scaffolding deberamos en >/curso/src/templates/artifacts/Controller.groovy tener el siguiente cdigo:

As mismo, si quisieramos que las Domain clases por default tengan el mtodo toString al crearlas con el comando create-domain-class,deberamos en >/curso/src/templates/artifacts/DomainClass.groovy tener el siguiente cdigo:

Si quisiramos por ejemplo que los archivos de la vista que se generan automticamente con scaffolding mostraran una lista de atributos mayor alos 6 que trae por default Grail podriamos editar >/curso/src/templates/scaffolding/list.gsp de la siguiente manera para tener 8 atributos:

Como introduccin al tema de seguridad, y de la mano con el usos de templates vamos a dejar o no visible la barra de mens dependiendo del roldel usuario, siendo visible en su totalidad para un usuario administrador y lo contrario para un usuario user. Para lograrlo nos vamos a >/curso/src/templates/scaffolding/list.gsp y aadimos la siguiente lnea de cdigo:

En cuanto al tema de seguridad, vamos a implementar autenticacin y autorizacin de usuarios a partir de: su username, password y rol. Paraconseguirlo, aadimos el siguiente cdigo en la Domain Class User:

NOTA: El password est encriptndose antes de ser persistido en la base de datos. Adicionalmente en el Controlador de User debemos aadir lo siguiente:

Para completar el proceso de encriptacin del password del usuario, necesitamos hacer uso de un Codec de encriptacin, que bsicamentegestionar cadenas de caracteres (que es lo que es a fin de cuentas un password). Para esto necesitamos crear un archivo SHACodec.groovy en:

Ejecutamos la aplicacin en el servidor y veremos que la lista de usuarios tiene los passwords encriptados perfectamente.

Vamos a crear ahora un TagLib de autorizacin en la pgina, con las opciones de Login y Logout del sistema. Para esto en la consola decomandos ejecutamos el comando grails create-tag-lib Login y dicha clase debe tener el siguiente cdigo:

Hacemos referencia al TagLib creado loginControl en el archivo _header.gsp:

Aadimos estilos al archivo main.css:

Ejecutamos la aplicacin y verificamos la funcionalidad de Login y Logout. Indico a continuacin el cdigo que contiene el archivo login.gsp, ascomo la ubicacin del mismo:

Aadiremos ahora, la restriccin de que solamente un usuario administrador sea quien pueda acceder a tareas como la creacin de usuarios. Paralograrlo, debemos hacer uso de los Interceptors e interceptar todas las acciones del controlador User para dependiendo del rol del usuario ejecutarlas o no. En UserController aadimos:

Hemos aplicado el Interceptor a un solo controlador, pero si quisiramos aplicarlo a todos los controladores, debemos hacer uso del concepto deFilters (filtros). Para lo cual ejecutamos el comando grails create-filters admin. Y un nuevo Filtro se creara en: >/curso/grails-app/conf/curso/AdminFilters.groovy

NOTA: El resultado final ser similar al obtenido con Interceptors solo que a mayor escala, ahora todos los controladores tiene la restriccin deque solamente el usuario administrador podr ejecutar la lgica descrita en el Filtro.

Hasta este punto, hemos desarrollado la funcionalidad de seguridad a mano, pero vamos un escaln ms all y hagamos uso de los plugins queofrece Grails, especficamente nos referimos al plugin Sprin Security Core que abstrae de una manera mucho ms transparente los aspectos de Seguridad que acabamos de hacer reinventando la rueda. Para tener acceso a informacin y cdigo nos vamos a la direccin http://grails.org a la seccin Plugins y escogemos a Spring Security Core en el link All.

En dicha opcin, tendremos acceso a informacin, cdigo, manuales referentes a este Plugin.

Para realizar sta prctica, creamos un proyecto nuevo llamado seguridades con el comando grails create-app seguridad en la consola.

El paso siguiente es verificar la lista de plugins disponibles en el repositorio de Grails. Para ellos digitamos el comando grails list-plugins yubicamos el plugin que buscamos:

El siguiente paso es instalar el plugin de Spring Security Core co el comando grails install-plugin spring-security-core. En la imagen siguiente sepuede observar una instalacin exitosa del plugin.

El primer paso para usar el plugin, es digitar el comando grails s2-quickstar com.sguridad User Role con el objetivo de crear las Domain Clases yVistas que gestionarn Usuarios con sus Roles:

A continuacin puede verse una porcin del cdigo de User generado en totalidad por el plugin Spring Security Core.

NOTA: Se sugiere como parte de la prctica analizar el cdigo restante de las Domain Clases Role, UserRole, as como las vistas generadas por elplugin.

Vamos a crear ahora un controlador llamado SecureController y verificamos en el browser el libre acceso que este action brinda a cualquierusuario que haga Lgin al Sistema:

Ahora vamos a agregar polticas de acceso a dicho action de la siguiente manera. Y verificamos que ya aparece una ventana de Login:

Para poder verificar de mejor manera, debemos modificar el archivo BootStrap.groovy y aadir usuarios con roles:

Ejecutamos la aplicacin en el Servidor y verificamos el Login de un usuario tipo user:

Como parte de la prctica se sugiere revisar el nivel de acceso que tienen los diversos usuarios a los actions de SecureController, adicionalmenterevsese la caracterstica Remember Me y el manejo de cookies que Spring Security Core hace en ello.

Configuraciones adicionales puede hacerse en el archivo Config.groovy como lo muestra la siguiente imagen, en donde se puede trabajarconjuntamente con roles y tipos de autenticacin.

Las diversas opciones de autenticacin que ofrece Spring security Core son:

Adicionalmente si se requiere bloqueo de las direcciones IP desde las cuales se accede a la aplicacin podra hacerse de la siguiente configuracin:

Y finalmente si se quisiera internacionalizar los mensajes gestionados por Spring Security Core, tmese en cuenta los iguiente:

Otro aspecto importante es la portabilidad de los proyectos en Grails, lo cual no supone ningn inconveniente pues simplemente debe copiarse elproyecto (con la estructura de archivos tal cual se ha generado en una maquina local) y llevarlo a la mquina destino (obviamente que tenga instalados debidamente Java y Grails), y de ser el caso configurar la base de datos (si es que se decide trabajar con otro gestor que no sea el default HSQLD).

Finalmente, como todo proyecto web en java, Grails nos permite exportar nuestro proyecto como archivo web (.war) que se pueda deployar encualquier servidor web Java como JBoss, GlassFish, Tomcat, Jernimo etc. Para lograrlo necesitamos en consola ejecutar el siguiente comando grails war:

Y en la ruta >/curso/target ya tenemos un archivo con extensin war listo para ser deplorado en cualquier servidor web Java.

Responsable:

Ing. Santiago Tapia Y.

Contacto:

Direccin: Urbanizacin Ushimana Lote 28 (Valle de los Chillos) Quito Ecuador Email: [email protected] Mobile: (593) 92 738 561 Sitio Web: http://santiagotapiay.blogspot.com