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 includeViewParams
atribut <h:link>
atau includeViewParams=true
parameter permintaan di URL mana pun.
Dapat digunakan pada @RequestScoped
bean, tetapi membutuhkan bean @ViewScoped
jika 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 id
parameter melalui konverter dan mengatur User
objek sebagai properti kacang.
@ManagedProperty
:Menetapkan nilai segera setelah pembuatan kacang.
Nilai @PostConstruct
yang 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 UICommand
komponen.
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 user
adalah null
dengan mengutak-atik FacesContext#addMessage()
atau sesuatu.
Anda dapat menggunakan keduanya jika keduanya @PostConstruct
dan includeViewParams
wajib. Anda hanya tidak dapat lagi menerapkan konversi / validasi mendetail.
@ManagedProperty
parameter permintaan tidak mungkin.
<f:event type="preRenderView">
atau JSF 2.2 mendatang <f:viewAction>
.
2 perbedaan lainnya:
@ManagedProperty
hanya dapat digunakan dengan biji yang dikelola oleh JSF, bukan dengan biji yang dikelola oleh CDI ( @Named
);
<f:viewParam>
hanya bekerja dengan parameter permintaan GET.