ViewParam so với @ManagedProperty (value = “# {param.id}”)


97

Sự khác biệt giữa việc xác định các Tham số Chế độ xem như thế này là gì:

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>

Và xác định thuộc tính trong ManagedBean như thế này:

@ManagedProperty(value = "#{param.id}")
private Integer id;

Câu trả lời:


144

<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><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 includeViewParamsthuộc tính của <h:link>hoặc includeViewParams=truetham số yêu cầu trong bất kỳ URL nào.

  • Có thể được sử dụng trên @RequestScopedbean, nhưng nó yêu cầu bean phải có @ViewScopednế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 idtham 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 UICommandthà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 usernulldo 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 @PostConstructincludeViewParamslà 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.


Xem thêm:


1
Có những cách thay thế khác để truy xuất các tham số yêu cầu trong các trường hợp ngoại lệ: FacesContext.getCurrentInstance (). GetExternalContext (). GetRequestParameterMap (). Get ("tên tham số");
angelcervera

1
@angel: Chỉ khi bean có phạm vi rộng hơn phạm vi yêu cầu khiến @ManagedProperty tham số yêu cầu không thể thực hiện được.
BalusC

chào @BalusC Tôi thực sự dựa vào giá trị của id được truy xuất từ ​​param.id bằng cách sử dụng Managedproperty trên bài đăng thứ hai. Làm thế nào tôi có thể bao gồm nó bằng cách sử dụng f: param? cảm ơn rất nhiều
sys_debug 19/12/11

1
@thufir: Nó được đặt trong giai đoạn cập nhật giá trị mô hình. Postconstruct chạy rất xa trước đó, ngay sau khi xây dựng bean và việc tiêm phụ thuộc. Nó có sẵn trong phương thức nghe được gọi bởi<f:event type="preRenderView"> hoặc JSF 2.2 sắp tới <f:viewAction>.
BalusC


6

2 điểm khác biệt khác:

  • @ManagedPropertychỉ 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.

1
Do đó, bạn có thể sử dụng chú thích: org.omnifaces.cdi.Param
dforce 22/02/18
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.