2011-10-21 38 views
8

Tôi đang làm việc về dự án được phát triển trong JSF. Bất cứ khi nào chúng tôi làm mới trang JSF, thì sự kiện hành động cuối cùng được thực hiện lại. Ví dụ: khi tôi gửi biểu mẫu để xóa mục nhập của danh sách và làm mới trang kết quả, thì một mục nhập khác từ danh sách ở cùng một vị trí cũng sẽ bị xóa. Làm thế nào là điều này gây ra và làm thế nào tôi có thể giải quyết nó?Làm cách nào để tránh thực hiện lại hành động gửi biểu mẫu cuối cùng khi trang được làm mới?

tôi đã cố gắng trong faces-config.xml nhưng điều đó không giải quyết vấn đề của tôi,

Để có được rõ ràng hơn về vấn đề tôi đang phải đối mặt là tôi commandLink để loại bỏ một tài nguyên từ DataTable, tôi đang sử dụng ActionListener thuộc tính mà gọi một phương thức trong backbean của tôi, vì vậy vấn đề là khi bao giờ tôi làm mới sự kiện hành động trang nhận được xảy ra và phương pháp được thực hiện mà loại bỏ một nguồn tài nguyên từ bảng. Cảm ơn trước

Trả lời

18

Các triệu chứng cho biết trang đã được yêu cầu POST và yêu cầu bạn bỏ qua cảnh báo của webbrowser rằng dữ liệu sẽ được gửi lại khi làm mới yêu cầu. Làm mới một yêu cầu POST sẽ tất nhiên dẫn đến việc nó được thực hiện lại. Đây không phải là một vấn đề cụ thể của JSF.

Giải pháp chung là gửi chuyển hướng đến yêu cầu GET sau khi thực hiện yêu cầu POST. Bằng cách này, khách hàng sẽ nhận được yêu cầu GET trong giao diện trình duyệt. Làm mới này sau đó sẽ chỉ thực hiện lại yêu cầu GET mà không (không nên) sửa đổi bất cứ điều gì (trừ khi bạn đang làm điều này trong constructor của một yêu cầu scoped bean liên kết với view). Điều này còn được gọi là mẫu POST-Redirect-GET.

Với JSF 2.0, bạn có thể thực hiện điều này bằng cách thêm tham số faces-redirect=true vào kết quả của hành động bean.

public String submit() { 
    // ... 

    return "viewid?faces-redirect=true"; 
} 

Nếu bạn vẫn đang sử dụng theo phong cách cũ <navigation-case> s trong faces-config.xml, sau đó tác dụng tương tự có thể đạt được bằng cách thêm <redirect/> đến vụ án.

Điều bất lợi duy nhất là yêu cầu hạt cà phê bị xáo trộn theo cách này (chuyển hướng cơ bản chỉ thị trình duyệt web tạo yêu cầu mới) và do đó bạn không thể chuyển dữ liệu trong phạm vi yêu cầu để hiển thị lại trang đó trong trang được chuyển hướng. Ví dụ: hiển thị thông báo thành công. Trong JSF 2.0, bạn có thể thay vì sử dụng phạm vi flash cho điều này hoặc chỉ để cho POST diễn ra bằng cách <f:ajax> gửi thay vì gửi bình thường.

+0

Mỗi lần tôi thấy câu trả lời như thế này, tôi cảm thấy có một số phần lớn trong "hướng dẫn" mà tôi nên đọc nhưng không. @BalusC bạn có xảy ra liên kết đến tất cả các quy tắc áp dụng cho giá trị trả về của phương thức ** hành động ** không? Đây là lần đầu tiên tôi nghe nói về thông số ** chuyển hướng khuôn mặt **. Những thông số nào khác có thể có? Tôi nghi ngờ có điều gì đó hữu ích mà tôi không biết. – AlanObject

+4

@Alan: Mô hình đặc biệt này (mẫu PRG) là kiến ​​thức phát triển web chung và hiểu về cách HTTP và trình duyệt web hoạt động. Đối với các tham số hành động đặc biệt được hỗ trợ, thông số còn lại là 'includeViewParams = true'. Điều này bao gồm tất cả các tuyên bố '' của chế độ xem hiện tại làm thông số yêu cầu của mục tiêu kết quả. Tôi đã học được nó từ đọc blog/tài liệu/tài nguyên. Nó cũng được đề cập trong hướng dẫn Java EE 6. Nó cũng nên được đề cập trong một cuốn sách JSF 2.0 khá phong nha, như [JSF 2.0: Tham chiếu hoàn chỉnh] (http://jsfcompref.com/) và [Core JSF] (http://horstmann.com/corejsf/). – BalusC

+0

@BalusC Tôi có cùng một vấn đề, chỉ có tôi có một datatable nơi tôi có thể làm CRUD trên hàng. Khi tôi làm mới trang, hành động cuối cùng được gửi lại. Làm thế nào tôi có thể giải quyết nó? Tôi không có một nút gửi? – giorgimode

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