SlideShare uma empresa Scribd logo
1 de 9
Grails: Framework
para el desarrollo de
aplicaciones Web (3ra Parte)
Grails es un framework orientado al desarrollo de aplicaciones web de forma sencilla,
rápida y divertida.


                                              Personalizar apariencia
                                              La personalización de la apariencia en las
                                              aplicaciones web, generalmente se las
                                              realiza haciendo uso de hojas de estilo y
                                              javascript para algunos efectos.




En las anteriores entregas vimos desde la     Malla de diseño
creación de un proyecto, la creación de
                                              Dentro el mundo del diseño de aplicaciones
scafolding, hasta la la validación de
                                              web, se posee una estructura base sobre la
formularios mediante el uso de constraints,
                                              cual se pueden realizar personalizaciones
en esta entrega veremos la personalización
                                              para mejorar la apariencia y funcionalidad de
de la interfaz de la aplicación.
                                              la aplicación.
La gráfica siguiente muestra una estructura base, para nuestro ejemplo representa como
quedará nuestra aplicación.
donde:
   ✔     gutter: Proporciona un espacio en blanco sobre los bordes del navegador, de modo que
         el contenido del área principal se centra en el navegador.
   ✔     topbar: Proporciona la información referente al inicio de sesión (login, usuario
         conectado, etc)
   ✔     header: Muestra la información de la aplicación (título, logo, etc)
   ✔     content: Muestra el contenido principal de la aplicación
   ✔     right sidebar: Generalmente utilizado para mostrar opciones o detalles de la aplicación
         (menús, lista de opciones, etc)
   ✔     footer: Muestra la información de derechos de autor, desarrollo, etc


Creando un footer
Para esto debemos crear un fragmento de código GSP, llamado _footer.gsp dentro el
directorio grails­app/views/common. A continuación, agregue el _footer.gsp a la plantilla
mediante el tag <g:render   template="/common/footer"/>, para esto también debemos
considerar realizar una hoja de estilos para darle los efectos deseados.


grails­app/views/common/_footer.gsp 
<span class="copyright">&copy; 2009 Tutorial de Grails: Revista Atix<br/>Esteban
Saavedra López</span>


Para que este footer esté incluido en la presentación de la aplicación debemos incluir
<g:render template="/common/footer"/> al final del archivo main.gsp, como se muestra a
continuación:


<html>
    <head>
        <title><g:layoutTitle default="Grails" /></title>
        <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}" />
        <link rel="shortcut icon" href="$
{createLinkTo(dir:'images',file:'favicon.ico')}" type="image/x-icon" />
        <g:layoutHead />
        <g:javascript library="application" />
    </head>
    <body>
        <div id="spinner" class="spinner" style="display:none;">
            <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" />
        </div>
        <div class="logo"><img src="$
{createLinkTo(dir:'images',file:'grails_logo.jpg')}" alt="Grails" /></div>
        <g:layoutBody />

          <g:render template="/common/footer" />

   </body>
</html>
Con esto obtendremos un resultado no como el que deseamos, así como se muestra en la
figura siguiente:




Pero si deseamos mejorar el resultado debemos hacer uso de una hoja de estilos, así:


<html>
    <head>
        <title><g:layoutTitle default="Grails" /></title>
        <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}" />
        <link rel="shortcut icon" href="$
{createLinkTo(dir:'images',file:'favicon.ico')}" type="image/x-icon" />
        <g:layoutHead />
        <g:javascript library="application" />
    </head>
    <body>
        <div id="spinner" class="spinner" style="display:none;">
            <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" />
        </div>
        <div class="logo"><img src="$
{createLinkTo(dir:'images',file:'grails_logo.jpg')}" alt="Grails" /></div>
        <g:layoutBody />

         <div id="footer">
         <g:render template="/common/footer" />
         </div>

    </body>
</html>


la hoja de estilos utilizada es la siguiente:
#footer {
   clear:both;
   text-align: center;
   padding: 3px;
   border-top: 1px solid #333;
}
Cuyo efecto resultante será:




Creando un topbar
De forma análoga al footer, procedemos a crear el topbar.


grails­app/views/common/_topbar.gsp 
<div id="menu">
    <nobr>
       <g:if test="${session.user}">
         <b>${session.user?.firstName}&nbsp;${session.user?.lastName}</b> |
          <g:link controller="user" action="logout">Logout</g:link>
       </g:if>
     <g:else>
        <g:link controller="user" action="login">Login</g:link>
     </g:else>
  </nobr>
</div>


Este código también debe ser enlazado desde el archivo main.gsp, para que tenga el efecto
deseado, así:
<html>
    <head>
        <title><g:layoutTitle default="Grails" /></title>
        <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}" />
        <link rel="shortcut icon" href="$
{createLinkTo(dir:'images',file:'favicon.ico')}" type="image/x-icon" />
        <g:layoutHead />
        <g:javascript library="application" />
    </head>
    <body>
        <div id="spinner" class="spinner" style="display:none;">
            <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" />
        </div>
<div id="topbar">
        <g:render template="/common/topbar" />
        </div>

        <div class="logo"><img src="$
{createLinkTo(dir:'images',file:'grails_logo.jpg')}" alt="Grails" /></div>
        <g:layoutBody />

        <div id="footer">
        <g:render template="/common/footer" />
        </div>

    </body>
</html>


Obviamente que para esta nueva sección, deberemos incluir la hoja de estilos respectiva, para
obtener el resultado deseado:


#topbar {
   text-align:left;
   width: 778px;
   margin: 0px auto;
   padding: 5px 0;
}
#topbar #menu {
   float: right;
   width: 240px;
   text-align: right;
   font-size: 10px;
}


La personalización obtenida hasta el momento será la mostrada a continuación
Completando la personalización
Es momento de dar una apariencia definitiva a nuestra aplicación, para ésto debemos crear una
hoja de estilo que personalizará la apariencia de nuestra aplicación, un ejemplo de hoja de
estilo es la siguiente:


#header {
   width: 778px;
   background: #FFFFFF url(../images/fondo_header.gif) repeat-x;
   height: 70px;
   margin: 0px auto;
}
#header h1 {
   font-family:Arial,sans-serif;
   color: white;
   padding: 20px 0 0 6px;
   font-size:1.6em;
}
body {
   margin: 0px;
   padding: 0px;
   text-align:center;
   font-family: "Trebuchet MS",Arial,Helvetica,sans-serif;
   font-style: normal;
   font-variant: normal;
   font-weight: normal;
   font-size: 13px;
   line-height: normal;
   font-size-adjust: none;
   font-stretch: normal;
   color: #333333;
}
#page {
   width: 778px;
   margin: 0px auto;
   padding: 4px 0;
   text-align:left;
}
#content {
   float: left;
   width: 560px;
   color: #000;
}
#sidebar {
   float: right;
   width: 200px;
   color: #000;
   padding: 3px;
}


Ahora que disponemos de la hoja de estilos, debemos hacer uso de las mismas en el archivo
main.gsp 
<html>
   <head>
        <title><g:layoutTitle default="Gestión de Eventos" />
        </title>
        <link rel="stylesheet"
           href="${createLinkTo(dir:'css',file:'main.css')}" />
        <link rel="shortcut icon"
           href="${createLinkTo(dir:'images',file:'favicon.ico')}"
           type="image/x-icon" />
     <g:layoutHead />
     <g:javascript library="application" />
  </head>
  <body>
     <div id="page">
          <div id="spinner" class="spinner" style="display: none;">
              <img src="${createLinkTo(dir:'images',   file:'spinner.gif')}"
                  alt="Spinner" />
          </div>
         <div id="topbar">
              <g:render template="/common/topbar" />
         </div>
          <div id="header">
               <h1>Gestión de Eventos</h1>
          </div>
          <div id="content">
               <g:layoutBody />
          </div>
          <div id="sidebar">
               <g:render template="/common/buddies" />
          </div>
          <div id="footer">
               <g:render template="/common/footer" />
          </div>
       </div>
   </body>
</html>


El efecto resultante lo vemos en la siguiente figura:
El paso final de la personalización de la apariencia es cambiar la página index.gsp, para que
no muestre el contenido que por defecto se crear al momento de iniciar un proyecto; el
contenido para nuestro caso será el siguiente:


<html>
    <head>
          <title>Bienvenido a Gestion de Eventos</title>
        <meta name="layout" content="main" />
    </head>
    <body>
          <h1 style="margin-left:20px;">Sistema de Gestion de Eventos</h1>
          <p style="margin-left:20px;width:80%">
           Bienvenido a la aplicación de Gestion de Eventos. Esta es una aplicación
consiste en mantener
           le registros de los detalles de conferencias y expositores de un conjunto de
eventos.
           Al ser una aplicación de ejemplo, trata de mostrar algunas de las muchas
caracteristicas que
           dispone el Framework Grails
          </p>
            <div class="dialog" style="margin-left:20px;width:60%;">
             <ul>
                <g:each var="c" in="${grailsApplication.controllerClasses}">
                      <li class="controller"><a href="${c.logicalPropertyName}">
                       ${c.fullName}</a></li>
                </g:each>
             </ul>
         </div>
    </body>
</html>


Cuyo resultado se muestra en la figura siguiente:
Referencias
[1]    http://www.grails.org
[2]    Getting Started with Grails
[3]    The Definitive Guide to Grails


Autor




Esteban Saavedra López
Líder de la Comunidad ATIX (Oruro – Bolivia)
Activista de Software Libre en Bolivia
jesaavedra@opentelematics.org
http://jesaavedra.opentelematics.org

Mais conteúdo relacionado

Mais procurados

Web 2.0 ajax con SharePoint
Web 2.0 ajax con SharePointWeb 2.0 ajax con SharePoint
Web 2.0 ajax con SharePointgoreorti
 
Taller integracion jsf spring
Taller integracion jsf springTaller integracion jsf spring
Taller integracion jsf springIBM
 
JBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server FacesJBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server FacesAitor Acedo
 
Responsive Web Design (Diseño Web Adaptable)
Responsive Web Design (Diseño Web Adaptable)Responsive Web Design (Diseño Web Adaptable)
Responsive Web Design (Diseño Web Adaptable)Adolfo Sanz De Diego
 
Presentación extensiones interesantes joomla
Presentación extensiones interesantes joomlaPresentación extensiones interesantes joomla
Presentación extensiones interesantes joomlaMadBlake
 
Ejercicio basico jsf’s
Ejercicio basico jsf’sEjercicio basico jsf’s
Ejercicio basico jsf’sayreonmx
 
Joomla! en 10 minutos - JoomlaDay Sevilla 2015
Joomla! en 10 minutos  - JoomlaDay Sevilla 2015Joomla! en 10 minutos  - JoomlaDay Sevilla 2015
Joomla! en 10 minutos - JoomlaDay Sevilla 2015Carlos M. Cámara
 
Manual Admon Contenidos Joomla 1.5 V2 Gen
Manual Admon Contenidos Joomla 1.5 V2 GenManual Admon Contenidos Joomla 1.5 V2 Gen
Manual Admon Contenidos Joomla 1.5 V2 GenKnowldedge Factory
 
proyecto conexion netbeans con Mysql
proyecto conexion netbeans con Mysqlproyecto conexion netbeans con Mysql
proyecto conexion netbeans con MysqlBrenditaLr
 

Mais procurados (20)

Semana 4 Estructura y componentes SPA
Semana 4  Estructura y componentes SPASemana 4  Estructura y componentes SPA
Semana 4 Estructura y componentes SPA
 
Web 2.0 ajax con SharePoint
Web 2.0 ajax con SharePointWeb 2.0 ajax con SharePoint
Web 2.0 ajax con SharePoint
 
06. jsf (java server faces) (1)
06. jsf (java server faces) (1)06. jsf (java server faces) (1)
06. jsf (java server faces) (1)
 
Java server faces
Java server facesJava server faces
Java server faces
 
Magento Best Practices
Magento Best PracticesMagento Best Practices
Magento Best Practices
 
Taller integracion jsf spring
Taller integracion jsf springTaller integracion jsf spring
Taller integracion jsf spring
 
JqueryMobile
JqueryMobile JqueryMobile
JqueryMobile
 
JBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server FacesJBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server Faces
 
Tutorial ASP .NET
Tutorial ASP .NETTutorial ASP .NET
Tutorial ASP .NET
 
Responsive Web Design (Diseño Web Adaptable)
Responsive Web Design (Diseño Web Adaptable)Responsive Web Design (Diseño Web Adaptable)
Responsive Web Design (Diseño Web Adaptable)
 
Angularjs
AngularjsAngularjs
Angularjs
 
Google analytics tuning
Google analytics tuningGoogle analytics tuning
Google analytics tuning
 
patron de diseño MVVMo.pptx
patron de diseño MVVMo.pptxpatron de diseño MVVMo.pptx
patron de diseño MVVMo.pptx
 
Presentacion wpf
Presentacion wpfPresentacion wpf
Presentacion wpf
 
Presentación extensiones interesantes joomla
Presentación extensiones interesantes joomlaPresentación extensiones interesantes joomla
Presentación extensiones interesantes joomla
 
Ejercicio basico jsf’s
Ejercicio basico jsf’sEjercicio basico jsf’s
Ejercicio basico jsf’s
 
Joomla! en 10 minutos - JoomlaDay Sevilla 2015
Joomla! en 10 minutos  - JoomlaDay Sevilla 2015Joomla! en 10 minutos  - JoomlaDay Sevilla 2015
Joomla! en 10 minutos - JoomlaDay Sevilla 2015
 
Curso Ejb3
Curso Ejb3Curso Ejb3
Curso Ejb3
 
Manual Admon Contenidos Joomla 1.5 V2 Gen
Manual Admon Contenidos Joomla 1.5 V2 GenManual Admon Contenidos Joomla 1.5 V2 Gen
Manual Admon Contenidos Joomla 1.5 V2 Gen
 
proyecto conexion netbeans con Mysql
proyecto conexion netbeans con Mysqlproyecto conexion netbeans con Mysql
proyecto conexion netbeans con Mysql
 

Semelhante a Grails: Framework para el desarrollo de aplicaciones Web No 3

Semelhante a Grails: Framework para el desarrollo de aplicaciones Web No 3 (20)

Phonegap
PhonegapPhonegap
Phonegap
 
Fundamentos del diseño web front end
Fundamentos del diseño web front endFundamentos del diseño web front end
Fundamentos del diseño web front end
 
6.angular js
6.angular js6.angular js
6.angular js
 
Taller de Azure Cognitive Services
Taller de Azure Cognitive ServicesTaller de Azure Cognitive Services
Taller de Azure Cognitive Services
 
Estándares Web con Chico UI
Estándares Web con Chico UIEstándares Web con Chico UI
Estándares Web con Chico UI
 
Imagenes
ImagenesImagenes
Imagenes
 
Introducción a Foundation 5
Introducción a Foundation 5Introducción a Foundation 5
Introducción a Foundation 5
 
Introducción a Foundation 5
Introducción a Foundation 5Introducción a Foundation 5
Introducción a Foundation 5
 
Maquetar pagina html con css
Maquetar pagina html con cssMaquetar pagina html con css
Maquetar pagina html con css
 
De HTML a Express
De HTML a ExpressDe HTML a Express
De HTML a Express
 
Laboratorio 03
Laboratorio 03Laboratorio 03
Laboratorio 03
 
jQuery Mobile :: Cuadros de diálogo
jQuery Mobile :: Cuadros de diálogojQuery Mobile :: Cuadros de diálogo
jQuery Mobile :: Cuadros de diálogo
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Faces
 
Introduccion a j query
Introduccion a j queryIntroduccion a j query
Introduccion a j query
 
Diseño web
Diseño webDiseño web
Diseño web
 
Diseño web
Diseño webDiseño web
Diseño web
 
Sencha touch - Proceso básico de desarrollo
Sencha touch - Proceso básico de desarrolloSencha touch - Proceso básico de desarrollo
Sencha touch - Proceso básico de desarrollo
 
Salesforce Bilbao Elevate '15 - 4th developer workshop
Salesforce Bilbao Elevate '15 - 4th developer workshopSalesforce Bilbao Elevate '15 - 4th developer workshop
Salesforce Bilbao Elevate '15 - 4th developer workshop
 
Trabajo jose 2
Trabajo jose 2Trabajo jose 2
Trabajo jose 2
 
Accesibilidad práctica con HTML5, CSS3 y WAI-ARIA
Accesibilidad práctica con HTML5, CSS3 y WAI-ARIAAccesibilidad práctica con HTML5, CSS3 y WAI-ARIA
Accesibilidad práctica con HTML5, CSS3 y WAI-ARIA
 

Mais de Esteban Saavedra (20)

Atix30
Atix30Atix30
Atix30
 
Atix29
Atix29Atix29
Atix29
 
Atix28
Atix28Atix28
Atix28
 
Atix27
Atix27Atix27
Atix27
 
Atix26
Atix26Atix26
Atix26
 
Atix25
Atix25Atix25
Atix25
 
Rabbitmq
RabbitmqRabbitmq
Rabbitmq
 
Ansible
AnsibleAnsible
Ansible
 
Perl
PerlPerl
Perl
 
Atix24
Atix24Atix24
Atix24
 
Atix23
Atix23Atix23
Atix23
 
Lineas Base Migracion a Software Libre
Lineas Base Migracion a Software LibreLineas Base Migracion a Software Libre
Lineas Base Migracion a Software Libre
 
Seguridad Sistemas de Gobierno
Seguridad Sistemas de GobiernoSeguridad Sistemas de Gobierno
Seguridad Sistemas de Gobierno
 
Tunneling: Esquivando Restricciones de Proxies y Firewalls
Tunneling: Esquivando Restricciones de Proxies y FirewallsTunneling: Esquivando Restricciones de Proxies y Firewalls
Tunneling: Esquivando Restricciones de Proxies y Firewalls
 
Bi Un Modelo Eficiente para Gerenciar Empresas
Bi Un Modelo Eficiente para Gerenciar EmpresasBi Un Modelo Eficiente para Gerenciar Empresas
Bi Un Modelo Eficiente para Gerenciar Empresas
 
Clouds privadas
Clouds privadasClouds privadas
Clouds privadas
 
Introduccion Computacion Ubicua
Introduccion Computacion UbicuaIntroduccion Computacion Ubicua
Introduccion Computacion Ubicua
 
Frameworks de Desarrollo Web Grails
Frameworks de Desarrollo Web GrailsFrameworks de Desarrollo Web Grails
Frameworks de Desarrollo Web Grails
 
Avances Tecnologicos
Avances TecnologicosAvances Tecnologicos
Avances Tecnologicos
 
Dni Electronico Bolivia
Dni Electronico BoliviaDni Electronico Bolivia
Dni Electronico Bolivia
 

Último

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativanicho110
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIhmpuellon
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosJhonJairoRodriguezCe
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxFederico Castellari
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 

Último (10)

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 

Grails: Framework para el desarrollo de aplicaciones Web No 3

  • 1. Grails: Framework para el desarrollo de aplicaciones Web (3ra Parte) Grails es un framework orientado al desarrollo de aplicaciones web de forma sencilla, rápida y divertida. Personalizar apariencia La personalización de la apariencia en las aplicaciones web, generalmente se las realiza haciendo uso de hojas de estilo y javascript para algunos efectos. En las anteriores entregas vimos desde la Malla de diseño creación de un proyecto, la creación de Dentro el mundo del diseño de aplicaciones scafolding, hasta la la validación de web, se posee una estructura base sobre la formularios mediante el uso de constraints, cual se pueden realizar personalizaciones en esta entrega veremos la personalización para mejorar la apariencia y funcionalidad de de la interfaz de la aplicación. la aplicación. La gráfica siguiente muestra una estructura base, para nuestro ejemplo representa como quedará nuestra aplicación.
  • 2. donde: ✔ gutter: Proporciona un espacio en blanco sobre los bordes del navegador, de modo que el contenido del área principal se centra en el navegador. ✔ topbar: Proporciona la información referente al inicio de sesión (login, usuario conectado, etc) ✔ header: Muestra la información de la aplicación (título, logo, etc) ✔ content: Muestra el contenido principal de la aplicación ✔ right sidebar: Generalmente utilizado para mostrar opciones o detalles de la aplicación (menús, lista de opciones, etc) ✔ footer: Muestra la información de derechos de autor, desarrollo, etc Creando un footer Para esto debemos crear un fragmento de código GSP, llamado _footer.gsp dentro el directorio grails­app/views/common. A continuación, agregue el _footer.gsp a la plantilla mediante el tag <g:render   template="/common/footer"/>, para esto también debemos considerar realizar una hoja de estilos para darle los efectos deseados. grails­app/views/common/_footer.gsp  <span class="copyright">&copy; 2009 Tutorial de Grails: Revista Atix<br/>Esteban Saavedra López</span> Para que este footer esté incluido en la presentación de la aplicación debemos incluir <g:render template="/common/footer"/> al final del archivo main.gsp, como se muestra a continuación: <html> <head> <title><g:layoutTitle default="Grails" /></title> <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}" /> <link rel="shortcut icon" href="$ {createLinkTo(dir:'images',file:'favicon.ico')}" type="image/x-icon" /> <g:layoutHead /> <g:javascript library="application" /> </head> <body> <div id="spinner" class="spinner" style="display:none;"> <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" /> </div> <div class="logo"><img src="$ {createLinkTo(dir:'images',file:'grails_logo.jpg')}" alt="Grails" /></div> <g:layoutBody /> <g:render template="/common/footer" /> </body> </html>
  • 3. Con esto obtendremos un resultado no como el que deseamos, así como se muestra en la figura siguiente: Pero si deseamos mejorar el resultado debemos hacer uso de una hoja de estilos, así: <html> <head> <title><g:layoutTitle default="Grails" /></title> <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}" /> <link rel="shortcut icon" href="$ {createLinkTo(dir:'images',file:'favicon.ico')}" type="image/x-icon" /> <g:layoutHead /> <g:javascript library="application" /> </head> <body> <div id="spinner" class="spinner" style="display:none;"> <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" /> </div> <div class="logo"><img src="$ {createLinkTo(dir:'images',file:'grails_logo.jpg')}" alt="Grails" /></div> <g:layoutBody /> <div id="footer"> <g:render template="/common/footer" /> </div> </body> </html> la hoja de estilos utilizada es la siguiente: #footer { clear:both; text-align: center; padding: 3px; border-top: 1px solid #333; }
  • 4. Cuyo efecto resultante será: Creando un topbar De forma análoga al footer, procedemos a crear el topbar. grails­app/views/common/_topbar.gsp  <div id="menu"> <nobr> <g:if test="${session.user}"> <b>${session.user?.firstName}&nbsp;${session.user?.lastName}</b> | <g:link controller="user" action="logout">Logout</g:link> </g:if> <g:else> <g:link controller="user" action="login">Login</g:link> </g:else> </nobr> </div> Este código también debe ser enlazado desde el archivo main.gsp, para que tenga el efecto deseado, así: <html> <head> <title><g:layoutTitle default="Grails" /></title> <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}" /> <link rel="shortcut icon" href="$ {createLinkTo(dir:'images',file:'favicon.ico')}" type="image/x-icon" /> <g:layoutHead /> <g:javascript library="application" /> </head> <body> <div id="spinner" class="spinner" style="display:none;"> <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" /> </div>
  • 5. <div id="topbar"> <g:render template="/common/topbar" /> </div> <div class="logo"><img src="$ {createLinkTo(dir:'images',file:'grails_logo.jpg')}" alt="Grails" /></div> <g:layoutBody /> <div id="footer"> <g:render template="/common/footer" /> </div> </body> </html> Obviamente que para esta nueva sección, deberemos incluir la hoja de estilos respectiva, para obtener el resultado deseado: #topbar { text-align:left; width: 778px; margin: 0px auto; padding: 5px 0; } #topbar #menu { float: right; width: 240px; text-align: right; font-size: 10px; } La personalización obtenida hasta el momento será la mostrada a continuación
  • 6. Completando la personalización Es momento de dar una apariencia definitiva a nuestra aplicación, para ésto debemos crear una hoja de estilo que personalizará la apariencia de nuestra aplicación, un ejemplo de hoja de estilo es la siguiente: #header { width: 778px; background: #FFFFFF url(../images/fondo_header.gif) repeat-x; height: 70px; margin: 0px auto; } #header h1 { font-family:Arial,sans-serif; color: white; padding: 20px 0 0 6px; font-size:1.6em; } body { margin: 0px; padding: 0px; text-align:center; font-family: "Trebuchet MS",Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 13px; line-height: normal; font-size-adjust: none; font-stretch: normal; color: #333333; } #page { width: 778px; margin: 0px auto; padding: 4px 0; text-align:left; } #content { float: left; width: 560px; color: #000; } #sidebar { float: right; width: 200px; color: #000; padding: 3px; } Ahora que disponemos de la hoja de estilos, debemos hacer uso de las mismas en el archivo main.gsp 
  • 7. <html> <head> <title><g:layoutTitle default="Gestión de Eventos" /> </title> <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}" /> <link rel="shortcut icon" href="${createLinkTo(dir:'images',file:'favicon.ico')}" type="image/x-icon" /> <g:layoutHead /> <g:javascript library="application" /> </head> <body> <div id="page"> <div id="spinner" class="spinner" style="display: none;"> <img src="${createLinkTo(dir:'images', file:'spinner.gif')}" alt="Spinner" /> </div> <div id="topbar"> <g:render template="/common/topbar" /> </div> <div id="header"> <h1>Gestión de Eventos</h1> </div> <div id="content"> <g:layoutBody /> </div> <div id="sidebar"> <g:render template="/common/buddies" /> </div> <div id="footer"> <g:render template="/common/footer" /> </div> </div> </body> </html> El efecto resultante lo vemos en la siguiente figura:
  • 8. El paso final de la personalización de la apariencia es cambiar la página index.gsp, para que no muestre el contenido que por defecto se crear al momento de iniciar un proyecto; el contenido para nuestro caso será el siguiente: <html> <head> <title>Bienvenido a Gestion de Eventos</title> <meta name="layout" content="main" /> </head> <body> <h1 style="margin-left:20px;">Sistema de Gestion de Eventos</h1> <p style="margin-left:20px;width:80%"> Bienvenido a la aplicación de Gestion de Eventos. Esta es una aplicación consiste en mantener le registros de los detalles de conferencias y expositores de un conjunto de eventos. Al ser una aplicación de ejemplo, trata de mostrar algunas de las muchas caracteristicas que dispone el Framework Grails </p> <div class="dialog" style="margin-left:20px;width:60%;"> <ul> <g:each var="c" in="${grailsApplication.controllerClasses}"> <li class="controller"><a href="${c.logicalPropertyName}"> ${c.fullName}</a></li> </g:each> </ul> </div> </body> </html> Cuyo resultado se muestra en la figura siguiente:
  • 9. Referencias [1] http://www.grails.org [2] Getting Started with Grails [3] The Definitive Guide to Grails Autor Esteban Saavedra López Líder de la Comunidad ATIX (Oruro – Bolivia) Activista de Software Libre en Bolivia jesaavedra@opentelematics.org http://jesaavedra.opentelematics.org