iberck
1/15/2016 - 3:04 AM

request scope

request scope

Datos en una página (gsp)

Obtener propiedades:

${nombre}: Busca la variable nombre en el modelo enviado a la página.

No confundir la manera en la que trabajan los frameworks: en grails busca la propiedad nombre en el modelo enviado a la página, en tapestry busca la propiedad nombre en el componente (.java).

Invocar un método del controlador desde la vista:

Por defecto no se puede hacer, a menos que desde una expresión se creara una instancia del controlador y se invocara el método como si se tratase de una clase común y corriente. Sin embargo invocar un método del controlador desde una vista es considerado una mala práctica. Se recomienda poner la lógica de negocio en un taglib e invocarlo desde la vista o pasar un servicio a la gsp.

Request

El request es un objeto que se envía desde el cliente (browser) hacia el servidor.

Toda petición pasa primero por un controlador el cual comunmente renderiza una página gsp (vista) que se mezcla con un modelo y da un resultado el cuál se retorna al cliente (response).

Por lo tanto el objeto request para nosotros como usuarios del framework comienza al iniciar la acción y termina cuando termina dicha acción (el proceso intermedio es la interpretación de la gsp).

Request y atributos

La manera de introducir objetos al request es por medio de request.setAttribute y para obtenerlos es a través de request.getAttribute.

Por convensión request.variable = "hola" es un alias de request.setAttribute("variable", "hola") y ${request.variable} es un alias de request.getAttribute("variable").

La única manera de obtener un parámetro a través del request es a través de request.getParameter("variable"). Para hacer más simple el acceos a los parámetros del request se creó el mapa params, para obtener un parámetro del request a través de él es a través de params.variable

Fordward and request

Sirve para invocar una acción desde una acción, sucede enteramente en el servidor (no lanza otro request). Se puede ir agregando atributos al request de tal forma que al hacer forward los datos del primer request estarán disponibles en el segundo y así sucesivamente.

class TestController {
    def index() {
        forward action: "index2", params: [animal:"perrito"]
    }

    def index2() {
        forward action: "index3", params: [objeto: "mesa"]
    }

    def index3() {
        render "index3, animal=${params.animal}, objeto=${params.objeto}"
    }
}

URL a invocar: test/index

Resultado: El browser muestra el texto index3, animal=perrito, objeto=mesa y la consola de chrome indica que solo fue lanzada una petición (1 request).

Por lo tanto, es posible enviar en el parámetro params los parámetros que se enviarán a la siguiente petición (o través de un atributo del request).

Redirect and request

Invoca una acción (p.e. acción2) desde una acción (p.e. acción1) utilizando un http redirect. A consecuencia de hacer una redirección, se lanza un nuevo request y se pierden los datos del request de acción1 en acción2 por lo que se debe utilizar el objeto flash.

En una redirección la primer acción modifica la base de datos y la segunda renderiza la respuesta de la acción.

En la práctica si un usuario invoca una acción que modifica la base de datos y la misma no le contesta al browser con una redirección, se quedará en el browser la url de dicha acción dando como resultado que se vuelva a lanzar la acción si el usuario refresca la página.

Cuando la acción contesta al browser con una redirección, cambia la url del browser por la de la segunda petición solicitada. Si el usuario refresca la página, dará como resultado que se ejecute la segunda petición y NO se modifique nuevamente el estado de la base de datos.

Controlador:

class TestController {
    
    // Acción invocada con el primer request del browser: /test/index
    def index() {
        // La variable "flash.mensaje" vivirá al finalizar index2
        flash.mensaje = "success"
        
        // redirect: ejecuta la redirección, envía un código 302 al browser 
        // indicando que lance automáticamente otra petición hacia la acción "index2"
        // con los parámetros "animal=perro".
        redirect action: "index2", params: [animal: "perro"]
    }

    // Segundo request.
    def index2() {
        // renderiza la respuesta al browser.
        render view: "index"
    }

GSP:

<body>
animal=${params.animal}, mensaje=${flash.mensaje}
</body>

URL a invocar test/index

El browser renderiza: animal=perro, mensaje=success y se queda con la url: test/index2?animal=perro.

La consola del browser registra lo siguiente:

  • Se lanza la petición1 hacia test/index, el servidor responde 302 (see test/index2?animal=perro).
  • Se lanza la petición2 hacia test/index2?animal=perro , el servidor responde 200 y la página index.

Por lo tanto, es posible enviar en el parámetro params (o através de un atributo del request) los parámetros del request que estarán disponibles en el segundo request (dentro de index2).

Pasar parámetros de un request hacia otro

Para lograrlo sin hacer uso de la session se utiliza el parámetro params

class TestController {

    def index() {

    }

    def formSubmit(Long id) {
        redirect(action: "index", params: [id: id])
    }
}