2012-02-06 40 views
5

Trong JSF2, có cách nào để xử lý gửi nhiều biểu mẫu (người dùng nhấp vào nút gửi nhiều lần) không? Bây giờ chúng tôi đang nhận được ngoại lệ dưới đây trong máy chủTránh gửi nhiều biểu mẫu

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: socket write error: Kết nối bị hủy bỏ bởi peer – user684434

Trả lời

3

Điều đó tùy thuộc vào cách bạn gửi biểu mẫu. Nếu bạn đang sử dụng <f:ajax> hoặc bất kỳ thẻ dựa trên Ajax nào khác để thực hiện gửi bởi Ajax, thì tốt nhất bạn nên sử dụng jsf.ajax.addOnEvent() để thêm chức năng vô hiệu hóa nút khi yêu cầu Ajax sắp được gửi và bật lại sau phản hồi Ajax được lấy ra.

Ví dụ: như sau, mà bạn bao gồm sau khi các tập lệnh Ajax JSF được bao gồm, ví dụ: bên trong một <script> hoặc <h:outputScript> tham chiếu tệp .js trong <h:head>.

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

Nếu bạn không sử dụng Ajax để thực hiện gửi, sau đó một trong những cách là để ném vào một chức năng setTimeout() trong onclick mà vô hiệu hóa nút một vài mili giây sau khi nhấp chuột.

Về cơ bản,

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

Các setTimeout() là bắt buộc, bởi vì khi bạn vô hiệu hóa nó ngay lập tức, sau đó các name=value cặp nút sẽ không được gửi cùng với yêu cầu đó sẽ gây ra JSF để không thể xác định action sẽ được thực hiện. Tất nhiên bạn có thể cấu trúc lại nó cho một số hàm sẵn sàng hoặc cửa sổ tải sẵn DOM áp dụng cho tất cả các nút gửi (jQuery sẽ rất hữu ích trong việc này).

+0

Bạn có một số gợi ý hoặc liên kết để làm cho nó là DOM Sẵn sàng hoặc chức năng tải cửa sổ. – user684434

+0

Xin lỗi, nó không cần phải được thực thi trong khi DOM sẵn sàng hoặc tải trên cửa sổ. Chỉ cần đặt nó chưa sửa đổi trong một '

0

Bạn có thể thêm nút bị vô hiệu hóa trên trang không hiển thị gì và hiển thị khi nút gửi được nhấp.

<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(); 
}); 
Các vấn đề liên quan