Khi nào sử dụng f: viewAction / preRenderView so với PostConstruct?


95

Khi nào người ta nên sử dụng f:viewActionhoặc preRenderViewsự kiện để khởi tạo dữ liệu cho một trang thay vì sử dụng @PostConstructchú thích? Cơ sở lý luận để sử dụng cái này hay cái kia dựa trên loại phạm vi của đậu hỗ trợ, ví dụ: Nếu là đậu hỗ trợ @RequestScoped, thì lựa chọn sử dụng f:viewActionhoặc sử dụng preRenderViewhơn @PostConstructđể khởi tạo đậu hỗ trợ của bạn trước khi hiển thị chế độ xem sẽ không liên quan như cả hai dẫn đến hiệu quả tương tự?

f: viewAction hoặc preRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

hoặc là

@PostConstruct

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}

Câu trả lời:


117

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 @PostConstructchạy. Trong JSF 2.0 / 2.1, thẻ này không tồn tại và bạn phải sử dụng preRenderViewgiả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 @PostConstructlà 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, @ManagedPropertyvv 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ự preRenderViewkiệ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 @PostConstructnế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 preRenderViewthay thế <f:viewAction>. Nếu cần, bạn có thể thêm dấu kiểm FacesContext#isPostback()để chỉ thực hiện preRenderViewhành động theo yêu cầu ban đầu.

Xem thêm:


Cảm ơn. Xin lỗi tôi chỉnh sửa câu hỏi ban đầu của tôi trong khi bạn đang viết câu trả lời ...
BestPractices

Tôi đã đề cập đến phạm vi bean vì @PostConstruct sẽ chỉ được gọi một lần nếu bean là SessionScoped (tại thời điểm bean được tạo lần đầu tiên) nhưng preRenderView sẽ được gọi mỗi khi trang được truy cập. Hay tôi đã hiểu sai?
BestPractices

Vâng đúng rồi. Sự kiện chế độ xem kết xuất trước được gọi trong giai đoạn hành động gọi. Cấu trúc bài đăng được gọi sau khi xây dựng bean. Một bean phạm vi phiên không được xây dựng trên mọi yêu cầu HTTP.
BalusC

Tôi đã tự hỏi phương pháp của tôi đã được gọi trong các yêu cầu ajax. cuộc gọi isPostBack () được lưu trong ngày !!
jacosta

1

Bạn có cần khởi tạo các thuộc tính của bean được quản lý không? -> Sau đó, sử dụng @ PostConstruct Nếu không, bạn có cần làm việc với các tham số được truyền từ chế độ xem khác không? -> Sau đó, sử dụng " preRenderView "

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.