複数のフォームの提出を避ける

JSF2では、複数のフォーム送信(ユーザーがボタンを複数回送信する)を処理する方法はありますか?今私たちはサーバーで以下の例外を取得しています

java.lang.IllegalStateException: Response already committed
java.lang.IllegalStateException: Response already committed
javax.faces.FacesException: socket write error: Connection aborted by peer
5
java.net.SocketException:ソケット書き込みエラー:ピアによって接続が中断されました
追加された 著者 user684434,

2 答え

That depends on how you're submitting the form. If you're using or any other Ajax based tag to perform the submit by Ajax, then your best bet is to use jsf.ajax.addOnEvent() to add a function which disables the button when the Ajax request is about to be sent and re-enables it after the Ajax response is retrieved.

E.g. as follows, which you include after the JSF Ajax scripts are included, e.g. inside a <script> or referring a .js file in .

jsf.ajax.addOnEvent(function(data) {
    if (data.source.type != "submit") {
        return;//Ignore anything else than input type="submit".
    }

    switch (data.status) {
        case "begin":
            data.source.disabled = true;//Disable input type="submit".
            break;
        case "complete":
            data.source.disabled = false;//Re-enable input type="submit".
            break;
    }    
});

送信を実行するためにAjaxを使用していない場合は、 onclick setTimeout()関数をスローする方法があります。クリックしてから数ms後にボタンを無効にします。

基本的に、


すぐに無効にすると、ボタンの name = value のペアがJSFの原因となるリクエストとともに送信されないため、 setTimeout()は必須です実行されるアクションを特定できません。もちろん、それをいくつかのDOM準備またはウィンドウのロード機能にリファクタリングすることができます。これは、すべての送信ボタンにこれを適用します(jQueryはこれに非常に役立ちます)。

3
追加された
DOM ReadyまたはWindow onload機能として使用するためのポインタやリンクを用意してください。
追加された 著者 user684434,
ありがとうBaluCs ...我々はスタイルを使用して送信ボタンを見つけることができます。
追加された 著者 user684434,
これはh:commandlinkで動作しますか?
追加された 著者 user684434,
申し訳ありませんが、DOMの準備やウィンドウのロード中に実行する必要はありません。 <script> または に変更しないでください。
追加された 著者 BalusC,
はい、コマンドリンクでも機能します。
追加された 著者 BalusC,
これを行うための標準的な方法はありませんか?サーバー側でp:commandButtonを使ってこれを行うかもしれませんか?
追加された 著者 jacktrades,

無効なボタンをページに追加して、何もしないで、送信ボタンをクリックしたときに表示することができます。

<div id="disabled" style="display:none;">
     
</div>
<div id="enabled" style="display:block;">
     
          
     
</div>


$('#submit').live("click", function() {
$('#enabled').hide();
$('#disabled').show();
});
0
追加された