Kapan menggunakan f: viewAction / preRenderView versus PostConstruct?

96

Kapan seseorang harus menggunakan acara f:viewActionatau preRenderViewuntuk menginisialisasi data untuk halaman versus menggunakan @PostConstructanotasi? Apakah alasan untuk menggunakan salah satu atau yang lain berdasarkan jenis cakupan kacang pendukung misalnya Jika kacang pendukung adalah @RequestScoped, maka pilihan untuk menggunakan f:viewActionatau preRenderViewlebih @PostConstructuntuk menginisialisasi kacang pendukung Anda sebelum menampilkan tampilan menjadi tidak relevan karena keduanya akan menghasilkan efek yang sama?

f: viewAction atau preRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

atau

@Posting

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}
Praktik terbaik
sumber

Jawaban:

119

Kapan sebaiknya seseorang menggunakan peristiwa f: viewAction atau preRenderView untuk menginisialisasi data untuk ayat halaman menggunakan anotasi @PostConstruct?

Gunakan <f:viewAction>saat Anda ingin menjalankan metode sebelum HTML dirender. Ini sangat berguna jika Anda ingin melakukan tindakan berdasarkan nilai model yang disetel <f:viewParam>selama fase nilai model pembaruan. Yakni, mereka tidak tersedia saat @PostConstructdijalankan. Di JSF 2.0 / 2.1, tag ini tidak ada dan Anda harus menggunakan preRenderViewsolusinya.

Jika kacang latar adalah @RequestScoped, apakah mereka secara efektif melakukan hal yang persis sama? (lalu terserah pilihan pengembang? (@PostConstruct sepertinya "lebih bersih").

Tidak, mereka pasti tidak melakukan hal yang sama secara efektif. The @PostConstructintented untuk melakukan tindakan langsung setelah konstruksi kacang dan pengaturan dari semua dependensi disuntikkan dan properti yang dikelola seperti @EJB, @Inject, @ManagedProperty, dll Yaitu, dependensi disuntikkan tidak tersedia di dalam konstruktor kacang. Dengan demikian ini akan berjalan hanya sekali per tampilan, sesi atau aplikasi ketika kacang adalah tampilan, sesi atau aplikasi yang tercakup. Secara <f:viewAction>default, is hanya dipanggil pada permintaan GET awal, tetapi dapat via onPostback="true"atribut dikonfigurasi untuk dipanggil pada permintaan postback juga. The preRenderViewevent dipanggil pada setiap permintaan HTTP (ya, ini juga termasuk permintaan ajax!).

Diringkas, penggunaan @PostConstructjika Anda ingin melakukan tindakan pada dependensi disuntikkan dan properti yang dikelola yang ditetapkan oleh @EJB, @Inject, @ManagedProperty, dll selama konstruksi kacang. Gunakan <f:viewAction>jika Anda juga ingin melakukan tindakan pada properti yang disetel oleh <f:viewParam>. Jika Anda masih di JSF 2.0 / 2.1, menggunakan preRenderViewbukan <f:viewAction>. Anda dapat jika perlu menambahkan centang FacesContext#isPostback()untuk melakukan preRenderViewtindakan hanya berdasarkan permintaan awal.

Lihat juga:

BalusC
sumber
Terima kasih. Maaf, saya mengedit pertanyaan asli saya saat Anda menulis tanggapan ...
Praktik Terbaik
Saya menyebutkan ruang lingkup kacang karena @PostConstruct hanya akan dipanggil sekali jika kacang itu SessionScoped (pada saat kacang pertama kali dibuat) tetapi preRenderView akan dipanggil setiap kali halaman diakses. Atau apakah saya salah?
BestPractices
Ya benar. Acara tampilan pra-render dipanggil pada fase tindakan pemanggilan. Konstruksi posting dipanggil setelah konstruksi kacang. Kacang dengan cakupan sesi tidak dibuat pada setiap permintaan HTTP.
BalusC
Saya bertanya-tanya metode saya dipanggil selama permintaan ajax. panggilan isPostBack () menyelamatkan hari !!
jacosta
Demi kelengkapan, kita harus menyebutkan Omnifaces '@Param : "Untuk parameter permintaan HTTP pada dasarnya seperti itu <f:viewParam>, tetapi dengan perbedaan utama bahwa parameter yang diinjeksi tersedia secara langsung selama @PostConstruct, memungkinkan cara pemrosesan yang jauh lebih mudah tanpa perlu <f:event type="preRenderView">atau <f:viewAction>di melihat."
Jens Piegsa
1

Apakah Anda perlu menginisialisasi properti kacang yang dikelola? -> Lalu, gunakan @ PostConstruct Jika tidak, apakah Anda perlu bekerja dengan params yang diteruskan dari tampilan lain? -> Lalu, gunakan " preRenderView "

Val Martinez
sumber