0

基本的に、私の問題は、ユーザーが1つのボタンをクリックし、ページが応答するのを待ってから別のボタンをクリックすると、競合状態が発生しているように見えることです。

2番目のボタンのコードと同じ変数を使用して最初のボタンのコードを回避するにはどうすればよいですか?

ボタンをクリックするたびにJSFモデルの異なるフェーズになるため、両方のリクエストが同じゲッターとセッターをランダムな順序で呼び出すと思われます。

これが例です。ユーザーがボタンをクリックすると、アクション関数がいくつかの変数を変更するとします。その変数は、ゲッターおよびセッターで実際のjsfタグにリンクされています。ここで、アクション関数が50%完了したとします。これで、ユーザーは同じボタンを押します。JSfは、同じ変数にリンクされているゲッターとセッターを呼び出し、状態などを復元します。基本的に、その変数は、アクションによって変更される前の状態にリセットされます。これで、最初のクリックのアクション関数が実行を継続し、変数が再び変更されます。2回目のアクションコールがなくても、競合状態です。

4

1 に答える 1

1

クライアント側では、JavaScriptを調べて、複数の送信を無効にすることができます。たとえば、クリックした後に送信入力タイプを無効にします。ただし、これは絶対確実なメカニズムではありません。

JSF自体では、Beanのスコープに依存します。セッションスコープの場合は、アクションメソッドへのアクセスを同期して(つまり、アプリケーションメソッドを呼び出す)、一度に1つのスレッドだけがロジックを実行できるようにすることができます。同様に、共有データへのアクセスを同期することができます。ただし、これはセッションアフィニティがある場合にのみ機能します。そうしないと、苦労することになります!

ただし、コンポーネントツリー自体(値の更新、プロセス検証など)はすべて、2番目の要求に対して引き続き呼び出されます。たぶん、これを防ぐためにPhaseListenerか何かを見ることができますが、これはトリッキーで、多分やり過ぎのようです。

一般に、アプリケーションのコーディングと構築の方法は、同じユーザーによる複数のリクエストを処理できる必要があることを意味します。個人的には、複数のフォームの送信を防ぐためにJavaScriptのアプローチを採用しています。おそらくコードスニペットを使用して、どのような問題を認識しているのか、もう少し詳しく説明しますか?

于 2011-05-04T22:25:10.757 に答える