Post-Redirect-Get Pattern

Inleiding

Post-Redirect-Get, kortweg PRG is een web design pattern dat een aantal veel voorkomende fouten op het web helpt voorkomen.

  • Voorkomt dubbele form submits, veroorzaakt door herladen van de pagina
  • Zorgt er voor dat de zichtbare URL hoort bij de pagina die getoond wordt
  • Maakt webpagina’s “bookmarkable”

Hoe werkt het

Het PRG pattern werkt als volgt. De browser verstuurt een formulier naar de server. Nadat de server het HTTP POST formulier ontvangen heeft, stuurt het een redirect opdracht terug naar de browser. De browser zal deze opdracht uitvoeren en als laatste stap de resultaatpagina als HTTP GET inladen. Hieronder zijn de stappen schematisch weergegeven.

Schematisch

In Code

Een eenvoudig voorbeeld uitgewerkt in Java JSF 2.

De code bestaat uit een formulier toevoegen-categorie.xhtml voor de invoer van de data. Uit een backing bean ToevoegenCategorieBacking.java voor het verwerken van het verzonden formulier en een resultaatpagina toevoegen-categorie-succes.xhtml.

toevoegen-categorie.xhtml:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Nieuwe Categorie Toevoegen</title>
</h:head>
<h:body>
    <h:messages globalOnly="true"/>


<h2>Nieuwe Categorie Toevoegen</h2>


    <h:form id="categorieform" prependId="false">

<div>
                <h:outputLabel for="categorie" value="Categorie"/>
                <h:inputText value="#{toevoegenCategorieBacking.categorie}" id="categorie" required="true" maxlength="35">
                    <f:validateLength minimum="3" maximum="35"/>
                </h:inputText>
                <h:message for="categorie"/>

            <h:commandButton action="#{toevoegenCategorieBacking.toevoegen}" value="Nieuwe Categorie Toevoegen"/>
    </h:form>
</h:body>
</html>

ToevoegenCategorieBacking.java:

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

@ManagedBean
public class ToevoegenCategorieBacking {

    private String categorie;

    public String toevoegen() {

        // service.toevoegen(categorie)

        // Succes bericht tonen na de redirect.
        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.getExternalContext().getFlash().setKeepMessages(true);
        facesContext.addMessage(null, new FacesMessage("Categorie succesvol toegevoegd."));

        // Stuur na de post een redirect naar de succes pagina (POST-REDIRECT-GET).
        return "/pages/toevoegen-categorie-succes?faces-redirect=true";
    }

    public String getCategorie() {
        return categorie;
    }

    public void setCategorie(String categorie) {
        this.categorie = categorie;
    }
}

toevoegen-categorie-succes.xhtml:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html">

<h:head>
    <title>Nieuwe Categorie Toegevoegd</title>
</h:head>

<h:body>

    <h:messages globalOnly="true"/>


<h2>Nieuwe Categorie Toevevoegd</h2>



Nieuwe categorie succesvol toevevoegd.


</h:body>
</html>

Demo

PRG Demo

Resources

Update 2013-04-07: SUN’s blog is niet meer online

Leave a Reply

Your email address will not be published. Required fields are marked *