Câu trả lời:
<f:viewParam>
:Chỉ đặt giá trị trong giai đoạn cập nhật giá trị mô hình (vì nó mở rộng UIInput
).
Giá trị đã đặt không có sẵn trong thời gian này @PostConstruct
, vì vậy bạn cần bổ sung <f:event type="preRenderView" listener="#{bean.init}" />
bên trong việc <f:metadata>
khởi tạo / tải trước việc cần làm dựa trên các giá trị đã đặt. Vì JSF 2.2 bạn có thể sử dụng <f:viewAction>
cho điều đó thay thế.
Cho phép lồng ghép <f:converter>
và <f:validator>
chuyển đổi / xác thực chi tiết hơn. Ngay cả một <h:message>
có thể được đính kèm.
Có thể được đưa vào dưới dạng chuỗi truy vấn GET sử dụng includeViewParams
thuộc tính của <h:link>
hoặc includeViewParams=true
tham số yêu cầu trong bất kỳ URL nào.
Có thể được sử dụng trên @RequestScoped
bean, nhưng nó yêu cầu bean phải có @ViewScoped
nếu bạn muốn các tham số của chế độ xem tồn tại bất kỳ lỗi xác thực nào gây ra bởi các biểu mẫu trong chế độ xem, nếu không, bạn cần phải giữ lại thủ công tất cả các tham số yêu cầu cho các yêu cầu tiếp theo bằng <f:param>
lệnh các thành phần.
Ví dụ :
<f:metadata>
<f:viewParam id="user_id" name="id" value="#{bean.user}"
required="true" requiredMessage="Invalid page access. Please use a link from within the system."
converter="userConverter" converterMessage="Unknown user ID."
/>
</f:metadata>
<h:message for="user_id" />
với
private User user;
và một @FacesConverter("userConverter")
. Trang mời bởi http://example.com/context/user.xhtml?id=123 sẽ chuyển id
tham số qua trình chuyển đổi và đặt User
đối tượng làm thuộc tính bean.
@ManagedProperty
:Đặt giá trị ngay sau khi xây dựng bean.
Giá trị đặt có sẵn trong @PostConstruct
đó cho phép dễ dàng khởi tạo / tải trước các thuộc tính khác dựa trên giá trị đặt.
Không cho phép chuyển đổi / xác thực khai báo trong chế độ xem.
Thuộc tính được quản lý của #{param}
không được phép trên các bean có phạm vi rộng hơn phạm vi yêu cầu, do đó, bean là bắt buộc @RequestScoped
.
Nếu bạn dựa vào một thuộc tính được quản lý #{param}
có mặt trong các yêu cầu POST tiếp theo, thì bạn cần đưa nó <f:param>
vào trong các UICommand
thành phần.
Ví dụ :
@ManagedProperty("#{param.id}")
private Long id;
private User user;
@EJB
private UserService userService;
@PostConstruct
public void init() {
user = userService.find(id);
}
Nhưng bạn phải quản lý xác nhận cho mình bất cứ khi nào user
là null
do loay hoay với FacesContext#addMessage()
hoặc một cái gì đó.
Bạn có thể sử dụng cả hai khi cả hai @PostConstruct
và includeViewParams
là bắt buộc. Bạn chỉ không thể áp dụng chuyển đổi / xác thực chi tiết nữa.
@ManagedProperty
tham số yêu cầu không thể thực hiện được.
<f:event type="preRenderView">
hoặc JSF 2.2 sắp tới <f:viewAction>
.
2 điểm khác biệt khác:
@ManagedProperty
chỉ sử dụng được với các bean được quản lý bởi JSF, không phải với các bean được CDI quản lý ( @Named
);
<f:viewParam>
chỉ hoạt động với các tham số của yêu cầu GET.