2014-04-25 4 views
14

Wir verwenden JSF 2.0 auf WebSphere v8.5 mit mehreren Komponentenbibliotheken PrimeFaces 4.0, Tomahawk 2.0, Richfaces, usw.reine Java/JSF-Implementierung für Doppel einreichen Prävention

ich für generischen Mechanismus Suche Form zu vermeiden Erneute Eingabe, wenn die Seite aktualisiert wird oder wenn die Schaltfläche "Senden" erneut angeklickt wird. Ich habe viele Anwendungen mit verschiedenen Szenarien.

Für jetzt habe ich in Betracht gezogen, die Schaltfläche mit einem Stück JavaScript in onclick Attribut zu deaktivieren, aber das ist nicht zufriedenstellend. Ich suche zu diesem Zweck eine reine Java-Implementierung, etwas wie die Struts2 <s:token>.

+0

Ist Ajax über das Problem der erneuten Formulareinreichung gekommen? wie nur Teil der Seite gerendert wird, nicht ganze Seite oder Umleitung – Sarz

+0

Deaktivierung der onClick-Event wird wahrscheinlich nicht ausreichen, eine Verzögerung Timer ist erforderlich, um den Trick zu tun –

+0

Ja @NassimMOUALEK ich erreiche die Deaktivierung der Schaltfläche, bis Ajax sein Rendering – Sarz

Antwort

17

Ich suche allgemeinen Mechanismus Um die erneute Formularübermittlung zu vermeiden, wenn die Seite aktualisiert wird

Dafür gibt es mindestens zwei Lösungen, die nicht kombiniert werden können:

  1. eine Umleitung nach synchroner Post durch. Auf diese Weise würde die Aktualisierung nur die umgeleitete GET-Anforderung anstelle der ursprünglichen Anforderung erneut ausführen. Nachteil: Sie können den Anfragebereich nicht mehr nutzen, um dem Endbenutzer Feedback zu geben. JSF 2.0 hat dies mit dem neuen flash scope gelöst. Siehe auch How to show faces message in the redirected page.

  2. Führen Sie den POST asynchron im Hintergrund aus (mit Ajax). Auf diese Weise würde die Aktualisierung nur die anfängliche GET-Anforderung erneut ausführen, die das Formular geöffnet hat. Sie müssen nur sicherstellen, dass diese Formulare anfänglich nur durch eine GET-Anfrage geöffnet werden, d. H. Sie sollten nie eine Seite-zu-Seite-Navigation durch POST durchführen (was ohnehin schon ein schlechtes Design ist). Siehe auch When should I use h:outputLink instead of h:commandLink?


oder wenn die Absenden-Button geklickt wird erneut

Dafür gibt es grundsätzlich auch mindestens zwei Lösungen, die könnten bei Bedarf kombiniert werden:

  1. Nur blockieren t er Enduser kann den Submit-Button während des Einreichens und/oder nach erfolgreichem Einreichen nicht mehr drücken. Je nach konkreten funktionalen und gestalterischen Anforderungen gibt es dafür verschiedene Möglichkeiten. Sie können JavaScript verwenden, um die Schaltfläche während des Sendens zu deaktivieren. Sie können die Attribute disabled oder rendered von JSF verwenden, um die Schaltfläche nach dem Senden zu deaktivieren oder auszublenden. Siehe auch How to do double-click prevention in JSF 2. Sie können auch ein Überlagerungsfenster während der Verarbeitung von AJAX-Anfragen verwenden, um jegliche Endbenutzerinteraktion zu blockieren.PrimeFaces hat <p:blockUI> für den Zweck.

  2. Überprüfen Sie die Eindeutigkeit der neu hinzugefügten Entität auf der Serverseite. Dies ist viel robuster, wenn Sie unbedingt Doppelarbeit aus technischen Gründen und nicht aus funktionalen Gründen vermeiden wollen. Es ist ziemlich einfach: Setzen Sie eine UNIQUE Einschränkung auf die betreffende DB-Spalte. Wenn diese Einschränkung verletzt wird, wird die DB (und das DB-Interaktionsframework wie JPA) eine Ausnahme für Beschränkungsverletzung auslösen. Dies ist am besten in Kombination mit einem benutzerdefinierten JSF-Validator durchzuführen, der die Eingabe zuvor validiert, indem er SELECT für genau diese Spalte ausführt und überprüft, ob kein Datensatz zurückgegeben wird. Mit einem JSF-Validator können Sie das Problem in einer freundlichen Gesichternachricht anzeigen. Siehe auch unter anderem Validate email format and uniqueness against DB.

+0

Bravo @BalusC sehr gültige Punkte – Sarz

+0

Ich benutze '' in allen Formen meiner Anwendungen, dieses 'FlashScope 'Ding sagt' Redirect/Reload' Seite. Wie kann ich das angehen? – Sarz

+0

Es gibt ein Beispiel im Link "Siehe auch". – BalusC

3

Anstatt manuell ein Token zu erstellen, können Sie die BalusC-Lösung verwenden. Er schlug vor, ein Post-Redirect-GET-Muster in his blog

Alternativen Lösungen können in diesen Antworten zu finden:

+0

behoben werden, wenn ich in h: commandButton jetzt ist es nicht erneut Vorlage das Formular. Wird die Anforderung vollständig erfüllt? – Sarz

+0

Dies wurde bereits von höheren Management von IT abgelehnt – Sarz

+0

Das Problem ist, dass wir doppelte Einreichung aktivieren und deaktivieren müssen gemäß unserem Szenario. – Sarz