2014-04-25 18 views
14

Stiamo utilizzando JSF 2.0 su WebSphere v8.5 con diverse librerie di componenti primefaces 4.0, 2.0 Tomahawk, RichFaces, eccpuro Java/implementazione JSF per la doppia presentare la prevenzione

Cerco meccanismo generico per evitare modulo ri-invio quando la pagina viene aggiornata, o quando si fa nuovamente clic sul pulsante di invio. Ho molte applicazioni con diversi scenari.

Per ora ho considerato di disabilitare il pulsante con un pezzo di JavaScript nell'attributo onclick, ma questo non è soddisfacente. Sto cercando una pura implementazione Java per questo scopo, qualcosa come lo Struts2 <s:token>.

+0

Ajax viene il problema di re-invio del modulo? come viene visualizzata solo una parte della pagina, non tutta la pagina o il reindirizzamento – Sarz

+0

La disattivazione dell'evento onClick probabilmente non è sufissiante per eseguire il trucco è necessario un timer di ritardo –

+0

Sì @NassimMOUALEK ottengo la disabilitazione del pulsante finché ajax non completa il suo rendering – Sarz

risposta

17

Cerco meccanismo generico per evitare la ripetizione del modulo quando la pagina viene aggiornata

Per che esistono almeno 2 soluzioni che non possono essere combinate:

  1. eseguire un reindirizzamento dopo post sincrona. In questo modo, l'aggiornamento eseguirà nuovamente la richiesta GET reindirizzata anziché la richiesta iniziale. Svantaggio: non è più possibile utilizzare l'ambito della richiesta per fornire alcun feedback all'utente finale. JSF 2.0 ha risolto questo problema offrendo il nuovo flash scope. Vedi anche How to show faces message in the redirected page.

  2. Eseguire il POST in modo asincrono sullo sfondo (utilizzando ajax). In questo modo l'aggiornamento eseguirà di nuovo solo la richiesta GET iniziale che ha aperto il modulo. Devi solo assicurarti che quei moduli siano inizialmente aperti solo da una richiesta GET, cioè non dovresti mai eseguire la navigazione da pagina a pagina da parte del POST (che è comunque già un cattivo design). Vedi anche When should I use h:outputLink instead of h:commandLink?


o quando il pulsante di invio viene cliccato nuovamente

Per questo ci sono fondamentalmente anche almeno 2 soluzioni, che potrebbero eventualmente essere combinati:

  1. Solo blocco t L'utente finale è in grado di premere il pulsante di invio durante l'invio e/o dopo l'invio riuscito. Ci sono vari modi per questo, il tutto in base ai requisiti funzionali e di progettazione concreti. È possibile utilizzare JavaScript per disabilitare il pulsante durante l'invio. È possibile utilizzare gli attributi disabled o di JSF per disabilitare o nascondere il pulsante dopo l'invio. Vedi anche How to do double-click prevention in JSF 2. È inoltre possibile utilizzare una finestra di sovrapposizione durante l'elaborazione di richieste Ajax per bloccare qualsiasi interazione dell'utente finale.PrimeFaces ha <p:blockUI> per lo scopo.

  2. Convalida univocità dell'entità appena aggiunta sul lato server. Questo è molto più robusto se si vuole assolutamente evitare la duplicazione per ragioni tecniche piuttosto che per ragioni funzionali. È abbastanza semplice: inserire un vincolo UNIQUE nella colonna DB in questione. Se questo vincolo viene violato, il DB (e il framework di interazione DB come JPA) genereranno un'eccezione di violazione del vincolo. È meglio farlo in combinazione con un validatore JSF personalizzato che convalida l'input in anticipo eseguendo uno SELECT esattamente su quella colonna e controllando se non viene restituito alcun record. Un validatore JSF ti consente di mostrare il problema nel sapore di un messaggio di facce amichevoli. Vedi anche tra gli altri Validate email format and uniqueness against DB.

+0

Bravo @BalusC punti molto validi – Sarz

+0

sto usando '' in tutte le forme delle mie applicazioni, questa cosa 'FlashScope' dice alla pagina' redirect/reload'. Come posso affrontare questo? – Sarz

+0

C'è un esempio nel link "Vedi anche". – BalusC

3

Invece di creare un token manualmente, è possibile utilizzare la soluzione di BalusC. Ha proposto un modello post-Redirect-GET in his blog

Soluzioni alternative possono essere trovati in queste risposte:

+0

quando inserisco in h: commandButton ora non viene ri-inviato il modulo. Riempie completamente il requisito? – Sarz

+0

Questo è stato già rifiutato dalla più alta gestione dell'IT – Sarz

+0

Il problema è che abbiamo bisogno di abilitazione e disabilitazione della doppia presentazione in base al nostro scenario. – Sarz