ViewParam vs @ManagedProperty (value = “# {param.id}”)

97

Apa perbedaan antara mendefinisikan View Params seperti ini:

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

Dan mendefinisikan properti di ManagedBean seperti ini:

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

Jawaban:

144

<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.


Lihat juga:

BalusC
sumber
1
Ada alternatif lain untuk mengambil parameter permintaan dalam kasus luar biasa: FacesContext.getCurrentInstance (). GetExternalContext (). GetRequestParameterMap (). Get ("parametername");
angelcervera
1
@angel: Hanya ketika kacang memiliki cakupan yang lebih luas daripada ruang lingkup permintaan yang membuat @ManagedPropertyparameter permintaan tidak mungkin.
BalusC
hai @BalusC Saya mengandalkan nilai id yang diambil dari param.id menggunakan managedproperty pada posting kedua. Bagaimana cara memasukkannya menggunakan f: param? terima kasih banyak
sys_debug
1
@thufir: Ini disetel selama fase nilai model pembaruan. Konstruksi pasca berjalan jauh sebelum itu, langsung setelah konstruksi kacang dan injeksi ketergantungan. Ini tersedia dalam metode pendengar yang dipanggil oleh <f:event type="preRenderView">atau JSF 2.2 mendatang <f:viewAction>.
BalusC
6

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.
pengguna1643352
sumber
1
Oleh karena itu, Anda dapat menggunakan anotasi: org.omnifaces.cdi.Param
dforce