14

私たちは WebSphere v8.5 で JSF 2.0 を使用し、いくつかのコンポーネント ライブラリ PrimeFaces 4.0、Tomahawk 2.0、RichFaces などを使用しています。

ページが更新されたとき、または送信ボタンがもう一度クリックされたときに、フォームの再送信を回避するための一般的なメカニズムを探しています。さまざまなシナリオを持つ多くのアプリケーションがあります。

今のところ、JavaScript の inonclick属性を使用してボタンを無効にすることを検討しましたが、満足のいくものではありません。この目的のために、 Struts2 のような純粋な Java 実装を探しています<s:token>

4

3 に答える 3

18

ページが更新されたときにフォームの再送信を回避するための一般的なメカニズムを探しています

そのために、組み合わせることのできないソリューションが少なくとも 2 つあります。

  1. 同期投稿後にリダイレクトを実行します。このように、リフレッシュは、最初のリクエストではなく、リダイレクトされた GET リクエストのみを再実行します。欠点: エンドユーザーにフィードバックを提供するために request スコープを使用することはできなくなります。JSF 2.0 は、新しいフラッシュ スコープを提供することでこれを解決しました。リダイレクトされたページに顔のメッセージを表示する方法も参照してください。

  2. POST をバックグラウンドで非同期に実行します (ajax を使用)。このように、リフレッシュは、フォームを開いた最初の GET リクエストのみを再実行します。これらのフォームが最初に GET 要求によってのみ開かれることを確認する必要があるだけです。つまり、ページからページへのナビゲーションを POST で実行するべきではありません (これ自体がすでに悪い設計です)。h:commandLink の代わりに h:outputLink を使用する必要がある場合も参照してください。


または送信ボタンがもう一度クリックされたとき

そのために、基本的に少なくとも 2 つのソリューションがあり、必要に応じて組み合わせることができます。

  1. 送信中および/または送信が成功した後、エンドユーザーが送信ボタンを押せないようにするだけです。これにはさまざまな方法がありますが、すべて具体的な機能要件と設計要件によって異なります。JavaScript を使用して、送信中にボタンを無効にすることができます。JSF のdisabledまたはrendered属性を使用して、送信後にボタンを無効または非表示にすることができます。JSF 2 でダブルクリック防止を行う方法も参照してください。また、ajax リクエストの処理中にオーバーレイ ウィンドウを使用して、エンドユーザーの操作をブロックすることもできます。PrimeFaces は<p:blockUI>目的のために持っています。

  2. サーバー側で新しく追加されたエンティティの一意性を検証します。機能上の理由よりも技術的な理由で重複を絶対に避けたい場合、これははるかに堅牢です。問題の DB 列にUNIQUE制約を設定するだけです。この制約に違反すると、DB (および JPA などの DB 対話フレームワーク) は制約違反の例外をスローします。SELECTこれは、正確にその列に対して を実行し、レコードが返されないかどうかをチェックすることにより、事前に入力を検証するカスタム JSF バリデーターと組み合わせて実行することをお勧めします。JSF バリデーターを使用すると、フレンドリーな顔のメッセージのフレーバーで問題を表示できます。とりわけ、電子メール形式とデータベースに対する一意性を検証するも参照してください。

于 2014-05-11T09:24:21.490 に答える