2012-02-06 120 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 2012-02-06 17:01:07

回答

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來執行提交,然後的方式之一是在onclick一個setTimeout()功能,禁用該按鈕後點擊幾毫秒扔是

基本上,

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

setTimeout()是強制性的,因爲當你立即禁用它,那麼name=value對按鈕將不會被這將導致JSF是無法識別的請求一起發送要執行action。你當然可以重構它到一些DOM準備或窗口onload函數,它適用於所有提交按鈕(jQuery將在這方面非常有用)。

+0

中止連接你一些指點或使得它作爲DOM就緒或窗口的onload功能鏈接。 – user684434 2012-02-06 17:17:23

+0

對不起,在DOM ready或window onload期間不需要執行它。只要將它修改爲'

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(); 
});