2014-04-25 15 views
14

Chúng tôi đang sử dụng JSF 2.0 trên WebSphere v8.5 với một số thư viện thành phần PrimeFaces 4.0, Tomahawk 2.0, RichFaces vvtinh khiết Java/thực hiện JSF cho đôi nộp phòng

Tôi đang tìm kiếm cơ chế chung để tránh hình thức gửi lại khi trang được làm mới hoặc khi nút gửi được nhấp lại một lần nữa. Tôi có nhiều ứng dụng với các kịch bản khác nhau.

Hiện tại, tôi đã xem xét tắt nút bằng một đoạn mã JavaScript trong thuộc tính onclick, nhưng điều này không thỏa mãn. Tôi đang tìm kiếm một Java thực hiện thuần túy cho mục đích này, giống như Struts2 <s:token>.

+0

Ajax có gửi lại vấn đề gửi biểu mẫu không? như chỉ là một phần của trang được trả lại, không phải toàn bộ trang hoặc chuyển hướng – Sarz

+0

Vô hiệu hóa các sự kiện onClick có thể sẽ không được sufissiant một bộ đếm thời gian chậm trễ là cần thiết để làm các trick –

+0

Có @NassimMOUALEK tôi đạt được vô hiệu hóa nút cho đến khi ajax hoàn render của nó – Sarz

Trả lời

17

Tôi đang tìm kiếm cơ chế chung để tránh gửi lại biểu mẫu khi trang được làm mới

Cho rằng có ít nhất 2 giải pháp mà không thể được kết hợp:

  1. Thực hiện một chuyển hướng sau khi bài đồng bộ. Bằng cách này, việc làm mới sẽ chỉ thực hiện lại yêu cầu GET được chuyển hướng thay vì yêu cầu ban đầu. Nhược điểm: bạn không thể sử dụng phạm vi yêu cầu nữa để cung cấp bất kỳ phản hồi nào cho người dùng cuối. JSF 2.0 đã giải quyết vấn đề này bằng cách cung cấp flash scope mới. Xem thêm How to show faces message in the redirected page.

  2. Thực hiện POST không đồng bộ trong nền (sử dụng ajax). Bằng cách này, việc làm mới sẽ chỉ thực hiện lại yêu cầu GET ban đầu đã mở biểu mẫu. Bạn chỉ cần đảm bảo rằng các biểu mẫu đó ban đầu được mở bằng một yêu cầu GET, nghĩa là bạn không bao giờ nên thực hiện điều hướng từng trang bằng POST (vốn đã là thiết kế kém của riêng nó). Xem thêm When should I use h:outputLink instead of h:commandLink?


hoặc khi nút gửi được nhấp một lần nữa

Cho rằng có về cơ bản là cũng ít nhất 2 giải pháp, mà có thể nếu cần được kết hợp:

  1. Chỉ cần chặn t anh ấy không thể nhấn nút gửi trong quá trình gửi và/hoặc sau khi gửi thành công. Có nhiều cách khác nhau cho điều này, tất cả phụ thuộc vào yêu cầu thiết kế và chức năng cụ thể. Bạn có thể sử dụng JavaScript để tắt nút trong khi gửi. Bạn có thể sử dụng các thuộc tính disabled hoặc rendered của JSF để tắt hoặc ẩn nút sau khi gửi. Xem thêm How to do double-click prevention in JSF 2. Bạn cũng có thể sử dụng cửa sổ lớp phủ trong khi xử lý yêu cầu ajax để chặn bất kỳ tương tác người dùng cuối nào.PrimeFaces có <p:blockUI> cho mục đích này.

  2. Xác thực tính duy nhất của thực thể mới được thêm ở phía máy chủ. Đây là cách mạnh mẽ hơn nhiều nếu bạn hoàn toàn muốn tránh trùng lặp vì lý do kỹ thuật hơn là vì lý do chức năng. Nó khá đơn giản: đặt một ràng buộc UNIQUE trên cột DB được đề cập. Nếu ràng buộc này bị vi phạm, thì DB (và khung tương tác DB như JPA) sẽ ném một ngoại lệ vi phạm ràng buộc. Tốt nhất là nên thực hiện kết hợp với trình xác thực JSF tùy chỉnh để xác thực thông tin nhập trước bằng cách thực hiện một cột SELECT chính xác trên cột đó và kiểm tra xem không có bản ghi nào được trả lại hay không. Trình xác thực JSF cho phép bạn hiển thị vấn đề theo hương vị của thông báo khuôn mặt thân thiện. Xem thêm trong số những người khác Validate email format and uniqueness against DB.

+0

Bravo @BalusC các điểm rất hợp lệ – Sarz

+0

tôi đang sử dụng '' trong tất cả các dạng ứng dụng của tôi, điều này 'FlashScope' nói đến trang 'chuyển hướng/tải lại'. Làm thế nào tôi có thể giải quyết điều này? – Sarz

+0

Có ví dụ trong liên kết "Xem thêm". – BalusC

3

Thay vì tạo mã thông báo theo cách thủ công, bạn có thể sử dụng giải pháp của BalusC. Ông đề xuất một mô hình Post-Redirect-GET trong his blog

giải pháp thay thế có thể được tìm thấy trong những câu trả lời:

+0

khi tôi đặt trong h: commandButton bây giờ nó không được gửi lại biểu mẫu. Nó có đầy đủ yêu cầu không? – Sarz

+0

Điều này đã bị từ chối bởi việc quản lý CNTT cao hơn – Sarz

+0

Vấn đề là chúng tôi cần kích hoạt và vô hiệu hóa hai lần theo kịch bản của chúng tôi. – Sarz

Các vấn đề liên quan