2012-02-06 11 views
5

JSF2では、複数のフォーム提出(ユーザーがボタンを複数回送信する)を処理する方法はありますか?今、私たちは、あなたがフォームを送信しているかに依存して、サーバー複数フォームの提出を避ける

java.lang.IllegalStateException: Response already committed 
java.lang.IllegalStateException: Response already committed 
javax.faces.FacesException: socket write error: Connection aborted by peer 
+0

java.net.SocketExceptionが:ソケット書き込みエラー:ピア – user684434

答えて

3

に以下の例外を取得しています。 <f:ajax>または他のAjaxベースのタグを使用してAjaxによる送信を実行している場合は、jsf.ajax.addOnEvent()を使用して、Ajaxリクエストが送信される直前にボタンを無効にしてから再度有効にする機能を追加することをお勧めしますAjaxレスポンスが取得されます。

など。次のように、JSF Ajaxスクリプトが含まれた後にインクルードします。 <script>または<h:outputScript>の中には、<h:head>のファイル.jsを参照してください。

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を使用してないしている場合は、次のいずれかの方法は、数msクリックした後にボタンを無効にしますonclicksetTimeout()機能で投げることです。あなたはすぐにそれを無効にすると、その後、ボタンのname=valueペアはJSFを識別することができなくさせるような要求とともに送信されませんので、基本的に

<h:commandButton 
    id="foo" 
    value="submit" 
    action="#{bean.submit}" 
    onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);" 
/> 

setTimeout()は、必須ですactionが実行されます。もちろん、それをいくつかのDOM準備またはウィンドウのロード機能にリファクタリングすることができます。これは、すべての送信ボタンにこれを適用します(jQueryはこれに非常に役立ちます)。

+0

によって中止接続はあなたのDOMの準備やウィンドウのonload関数としてそれを作るためのいくつかのポインタまたはリンクを行います。 – user684434

+0

申し訳ありませんが、DOMの準備やウィンドウのロード中に実行する必要はありません。 ''の '

0

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

<div id="disabled" style="display:none;"> 
    <span class="disabled-button"/> 
</div> 
<div id="enabled" style="display:block;"> 
    <span class="enabled-button"> 
      <h:commandLink id="submit"/> 
    </span> 
</div> 


$('#submit').live("click", function() { 
$('#enabled').hide(); 
$('#disabled').show(); 
}); 
関連する問題