Jawaban:
<f:viewParam>:Menetapkan nilai selama fase nilai model pembaruan saja (karena meluas UIInput).
Nilai yang ditetapkan tidak tersedia selama @PostConstruct, jadi Anda memerlukan tambahan <f:event type="preRenderView" listener="#{bean.init}" />di dalam <f:metadata>untuk melakukan inisialisasi / pramuat berdasarkan nilai yang ditetapkan. Sejak JSF 2.2 Anda bisa menggunakan <f:viewAction>untuk itu sebagai gantinya.
Memungkinkan untuk bertingkat <f:converter>dan <f:validator>untuk konversi / validasi yang lebih halus. Bahkan <h:message>bisa dilampirkan.
Dapat disertakan sebagai string kueri GET menggunakan includeViewParamsatribut <h:link>atau includeViewParams=trueparameter permintaan di URL mana pun.
Dapat digunakan pada @RequestScopedbean, tetapi membutuhkan bean @ViewScopedjika Anda ingin parameter view bertahan dari kegagalan validasi yang disebabkan oleh form yang diapit dalam view, jika tidak Anda perlu secara manual menyimpan semua parameter request untuk request selanjutnya dengan <f:param>perintah komponen.
Contoh :
<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" />
dengan
private User user;
dan sebuah @FacesConverter("userConverter"). Memanggil halaman dengan http://example.com/context/user.xhtml?id=123 akan melewatkan idparameter melalui konverter dan mengatur Userobjek sebagai properti kacang.
@ManagedProperty:Menetapkan nilai segera setelah pembuatan kacang.
Nilai @PostConstructyang ditetapkan tersedia selama memungkinkan inisialisasi / pramuat yang mudah dari properti lain berdasarkan nilai yang ditetapkan.
Tidak mengizinkan konversi / validasi deklaratif dalam tampilan.
Properti terkelola #{param}tidak diperbolehkan pada kacang dengan cakupan yang lebih luas dari ruang lingkup permintaan, jadi kacang harus demikian @RequestScoped.
Jika Anda mengandalkan properti terkelola #{param}yang ada di permintaan POST berikutnya, Anda perlu menyertakannya seperti <f:param>di UICommandkomponen.
Contoh :
@ManagedProperty("#{param.id}")
private Long id;
private User user;
@EJB
private UserService userService;
@PostConstruct
public void init() {
user = userService.find(id);
}
Tapi Anda harus mengelola validasi diri Anda setiap kali useradalah nulldengan mengutak-atik FacesContext#addMessage()atau sesuatu.
Anda dapat menggunakan keduanya jika keduanya @PostConstructdan includeViewParamswajib. Anda hanya tidak dapat lagi menerapkan konversi / validasi mendetail.
@ManagedPropertyparameter permintaan tidak mungkin.
<f:event type="preRenderView">atau JSF 2.2 mendatang <f:viewAction>.
2 perbedaan lainnya:
@ManagedPropertyhanya dapat digunakan dengan biji yang dikelola oleh JSF, bukan dengan biji yang dikelola oleh CDI ( @Named);
<f:viewParam> hanya bekerja dengan parameter permintaan GET.