2011-10-21 15 views
8

Sto lavorando a un progetto sviluppato in JSF. Ogni volta che si aggiorna la pagina JSF, l'ultimo evento azione viene rieseguito. Ad esempio, quando invio il modulo per eliminare una voce di un elenco e aggiorna la pagina dei risultati, viene cancellata anche un'altra voce dall'elenco nella stessa posizione. Come è causato e come posso risolverlo?Come evitare la riesecuzione dell'ultimo modulo inviare un'azione quando la pagina viene aggiornata?

ho provato in faces-config.xml, ma che non risolve il mio problema,

per ottenere più chiara sul problema che sto affrontando è che io sono commandLink per rimuovere una risorsa da DataTable, io sto usando ActionListener attributo che chiama un metodo nel mio backingbean, quindi il problema è quando sto aggiornando l'evento di azione della pagina che si verifica e il metodo viene eseguito che rimuove un'altra risorsa dalla tabella. Grazie in anticipo

risposta

18

I sintomi indicano che la pagina è stata richiesta da una richiesta POST e che si sta ignorando l'avvertenza del browser che i dati verranno reinviati quando si aggiorna la richiesta. Rinfrescare una richiesta POST farà ovviamente rielabire. Questo non è un problema specifico JSF.

La soluzione comune è quella di inviare un reindirizzamento a una richiesta GET dopo l'esecuzione della richiesta POST. In questo modo il client finirà per avere la richiesta GET nella visualizzazione del browser. L'aggiornamento di ciò eseguirà quindi solo la richiesta GET che non modifica (non dovrebbe) modificare nulla (a meno che non lo stiate facendo nel costruttore di un bean con scope della richiesta associato alla vista). Questo è anche noto come il modello POST-Redirect-GET.

Con JSF 2.0, è possibile ottenere ciò aggiungendo semplicemente il parametro faces-redirect=true al risultato dell'azione bean.

public String submit() { 
    // ... 

    return "viewid?faces-redirect=true"; 
} 

Se si sta ancora utilizzando vecchio stile <navigation-case> s in faces-config.xml, quindi lo stesso effetto può essere ottenuto con l'aggiunta di <redirect/> al caso.

L'unico svantaggio è che i bean con scope di richiesta vengono garbaged in questo modo (un reindirizzamento istruisce fondamentalmente il browser per creare una nuova richiesta) e quindi non è possibile passare i dati nello scope della richiesta per visualizzarlo nuovamente nella pagina reindirizzata. Ad esempio, visualizzazione di un messaggio di successo. In JSF 2.0 si potrebbe invece usare l'ambito del flash per questo o semplicemente lasciare che il POST abbia luogo entro il <f:ajax> invio invece di un normale invio.

+0

Ogni volta che vedo una risposta come questa, mi sembra che ci sia una parte importante del "manuale" che avrei dovuto leggere ma che non ha. @BalusC ti capita di avere un link a tutte le regole che si applicano al valore di ritorno del metodo ** action **? Questo è il primo che ho sentito del parametro ** faces-redirect **. Quali altri parametri sono possibili lì? Sospetto che ci sia qualcosa che sarebbe stato utile di cui non so nulla. – AlanObject

+4

@Alan: Questo particolare (schema PRG) è una conoscenza generale dello sviluppo del web e della comprensione di come funzionano HTTP e browser. Per quanto riguarda i parametri di azione speciale supportati, l'altro è 'includeViewParams = true'. Ciò include tutti i '' dichiarati della vista corrente come parametri di richiesta del target di risultato. L'ho imparato leggendo blog/documentazione/risorse. Viene anche menzionato nel tutorial Java EE 6. Va anche menzionato in un libro JSF 2.0 un po 'decente, come [JSF 2.0: The Complete Reference] (http://jsfcompref.com/) e [Core JSF] (http://horstmann.com/corejsf/). – BalusC

+0

@BalusC Ho lo stesso problema, solo che ho un datatable in cui posso fare CRUD sulle righe. Quando aggiorno la pagina, l'ultima azione viene nuovamente inviata di nuovo. Come posso risolverlo? Non ho un pulsante di invio? – giorgimode

Problemi correlati