iberck
12/14/2016 - 7:57 PM

Similitudes entre Grails y Tapestry

Similitudes entre Grails y Tapestry

Taglibs vs componentes

Grails template -> Un componente (tml) sin lógica de negocio (Tapestry)

Grails Taglib sin template -> Un componente con lógica de negocio que escribe la vista (Tapestry)

Grails Taglib que dentro invoca un template -> Un componente con vista y negocio mezclados (Tapestry)

Obteniendo propiedades

Variable ${nombre} en una gsp: En grails busca la propiedad en el modelo enviado a la página, en tapestry busca la propiedad nombre en el componente (.java).

Grails ajax vs Tapestry ajax

En tapestry las expresiones ${} buscan una propiedad dentro del componente de la página. Tapestry proporciona soporte para ajax a través de las zonas, una zona es un div que se refresca, la manera como funciona es la siguiente:

  1. Se define una zona que al dar click lanza un evento dentro del componente de la página
  2. El evento retorna el cuerpo de la zona, lo cual provoca que se refresca el contenido de la zona y por lo tanto se obtienen los valores de las expresiones ${} dentro del div (se vuelven a invocar los métodos dentro del componente).

Esta filosofía lleva a pensar que grails funciona igual, sin embargo funciona diferente:

  1. En grails, al dar click en un remoteLink hace que se lance una petición ajax al servidor.
  2. La petición ajax es recibida en una acción de un controlador, la cual retorna un contenido con el que de manera personalizada se puede sustituir el contenido del div con los datos retornados por el servidor.

En grails, definir la expresión ${nombre} dentro de un div que se actualiza con ajax hace que al cargar la página busque la variable nombre en el modelo de la página, sin embargo al lanzar la petición ajax el contenido del div updateMe será sustituido por lo que retorne la acción formSubmit.

<body>

<g:remoteLink action="formSubmit" update="updateMe">Ajax link</g:remoteLink>

<div id="updateMe">
    aquí se va a actualizar el nombre: ${nombre}
</div>

</body>

El mismo comportamiento que tiene Tapestry puede ser simulado en Grails:

<body>

<g:remoteLink action="formSubmit" update="updateMe">Ajax link</g:remoteLink>
<div id="updateMe">
    <g:render template="divcontent" model="[nombre: nombre]"/>
</div>

</body>
class TestController {

    def index() {
        render view: "index", model: [nombre:"carlos"]
    }

    def formSubmit() {
        render template: "divcontent", model: [nombre: "otro ${Math.random()}"]
    }
}

_divcontent:

aquí se va a actualizar el nombre: ${nombre}

El render del template divcontent dentro del div updateMe sirve para mostrar el contenido del template al cargar la página.

El render del template que retorna el método formSubmit() sirve para refrescar el contenido del div cuando se lance la petición ajax.