Khi nào người ta nên sử dụng sự kiện f: viewAction hoặc preRenderView để khởi tạo dữ liệu cho một đoạn trang bằng cách sử dụng chú thích @PostConstruct?
Sử dụng <f:viewAction>
khi bạn muốn thực thi một phương thức trước khi HTML được hiển thị. Điều này đặc biệt hữu ích nếu bạn muốn thực hiện các hành động dựa trên các giá trị mô hình được đặt bởi <f:viewParam>
trong giai đoạn cập nhật giá trị mô hình. Cụ thể là, chúng không có sẵn tại thời điểm @PostConstruct
chạy. Trong JSF 2.0 / 2.1, thẻ này không tồn tại và bạn phải sử dụng preRenderView
giải pháp thay thế.
Nếu đậu hỗ trợ là @RequestScoped, liệu chúng có làm điều tương tự một cách hiệu quả không? (và do đó, tùy thuộc vào sự lựa chọn của nhà phát triển? (@PostConstruct có vẻ "sạch hơn").
Không, họ chắc chắn không làm điều tương tự một cách hiệu quả. Các @PostConstruct
là intented để thực hiện các hành động trực tiếp sau khi xây dựng và thiết lập của tất cả phụ thuộc tiêm đậu và các thuộc tính được quản lý như @EJB
, @Inject
, @ManagedProperty
vv Cụ thể, phụ thuộc tiêm không có sẵn bên trong constructor của đậu. Do đó, điều này sẽ chỉ chạy một lần cho mỗi chế độ xem, phiên hoặc ứng dụng khi bean được xem, phiên hoặc phạm vi ứng dụng. Theo <f:viewAction>
mặc định, chỉ được gọi trong yêu cầu GET ban đầu, nhưng thông qua onPostback="true"
thuộc tính có thể được cấu hình để được gọi trên các yêu cầu đăng lại. Sự preRenderView
kiện được gọi trên mọi yêu cầu HTTP (vâng, điều này cũng bao gồm các yêu cầu ajax!).
Tóm tắt, sử dụng @PostConstruct
nếu bạn muốn thực hiện hành động trên phụ thuộc tiêm và tài sản được quản lý mà được thiết lập bởi @EJB
, @Inject
, @ManagedProperty
, vv trong quá trình thi đậu của. Sử dụng <f:viewAction>
nếu bạn cũng muốn thực hiện các hành động trên các thuộc tính được thiết lập bởi <f:viewParam>
. Nếu bạn vẫn đang sử dụng JSF 2.0 / 2.1, hãy sử dụng preRenderView
thay thế <f:viewAction>
. Nếu cần, bạn có thể thêm dấu kiểm FacesContext#isPostback()
để chỉ thực hiện preRenderView
hành động theo yêu cầu ban đầu.
Xem thêm: