iberck
9/9/2015 - 1:31 PM

Tapestry redirect after post

Tapestry redirect after post

Redirect-after-post en tapestry

Tapestry utiliza el patrón de diseño cuando se envían formularios (form submits) y realiza peticiones de eventos (eventlink, actionlink).

Cuando se lanza un submit, tapestry envía el formulario por POST (redirect-after-post)
Cuando se lanza un evento, tapestry lo envía por GET (redirect-after-get)

Los pasos que se ejecutan son los siguientes:

  1. El cliente lanza una petición al servidor para ejecutar la acción, el servidor contesta un código http 302.
  2. El cliente lanza una segunda petición al servidor para renderizar la página, el servidor contesta un código http 200.

Cuando se invalida redirect-after-post (retornando StreamPageContent):

  1. El cliente lanza una única petición al servidor para ejecutar la acción y renderizar la página.

Invalidar redirect-after-post

Para que tapestry no haga redirect-after-post, hay que retornar una instancia de la clase StreamResponseContent:

Object onActionFromStreamPageContent() {
    return new StreamPageContent(Test2.class);
}

onActivate/onPassivate

Este par de métodos se utilizan para conservar valores entre múltiples llamadas a la misma página debido al patrón redirect-after-post. Este par de métodos se utiliza comunmente para conservar los parámetros iniciales enviados a una página, sin embargo puede ser utilizado para conservar cualquier parámetro, ejemplo:

public class Forms2 {

    private String firstName;

    private String lastName;

    // set() is public so that other pages can use it to set up this page.

    public void set(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // onPassivate() is called by Tapestry to get the activation context to put in the URL.

    Object[] onPassivate() {
        return new String[] { firstName, lastName };
    }

    // onActivate() is called by Tapestry to pass in the activation context from the URL.

    void onActivate(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getName() {
        return firstName + " " + lastName;
    }
}

onActivate: Recibe los parámetros de activación de la página.
onPassivate: Su propósito es retornar nuevamente los parámetros de activación de la página.

Flash strategy

The flash strategy stores information in the session as well, just for not very long. Values are stored into the session, but then deleted from the session as they are first used to restore a page's state.

Peticiones Ajax

En las peticiones ajax no existe el patrón redirect-after-post debido a que no existe el problema de double submit, por lo tanto solo se lanza 1 única consulta hacia el servidor.

Para las peticiones ajax, sea porque se lanza un evento o se hace submit, siempre se envían los datos por POST.

Cuando se realiza una petición ajax tampoco invoca el método beginRender() debido a que no se renderiza la página, únicamente se refresca una zona.