Bagaimana cara memaksa fase pembangunan di halaman JSF 1.2 menggunakan JSTL?

Saya menggunakan tag JSTL di aplikasi JSF saya. Dengan tindakan tertentu, saya memerlukan pohon komponen untuk dibangun kembali seolah-olah itu adalah bangunan awal. Gejala saya saat ini adalah objek yang salah terhadap asosiasi komponen, duplikat id, dan masalah lain dengan komponen basi. Ini menggunakan tag c:foreach (tidak dapat menggunakan tag berulang, lihat contoh tautan) yang digunakan dalam fase pembuatan.

Pemahaman saya adalah mungkin untuk memaksakan pembangunan kembali, namun saya belum dapat menemukan di mana atau bagaimana hal itu terjadi. Saya terbuka untuk solusi yang dimulai pada klien atau di server.

Untuk contoh kode yang saya gunakan, lihat halaman ini di tab dinamis di Richfaces. http://in.relation.to/Bloggers/UsingDynamicallyCreatedRichFacesTabPanelForSearchResults

Catatan: Menggunakan ui:repeat atau a4j:repeat tidak memungkinkan. Lihat halaman contoh untuk detailnya.

Catatan Lainnya: Kacang aplikasi memiliki cakupan sesi dan data di dalamnya harus mencakup, hanya saja bukan status pohon komponen.

Pembaruan Pertanyaan ini terkait langsung dengan masalah yang diangkat di artikel ini dan komentar pertama. Saya tidak tahu bagaimana sebenarnya melakukan solusi di komentar pertama dan jawaban yang diterima membawa saya ke sana.


person Adam    schedule 09.06.2011    source sumber


Jawaban (1)


Menurut saya, komponen yang sudah basi bukanlah masalahnya. ID duplikat khususnya merupakan efek samping dari penggunaan tag <c:forEach>. Hal ini karena <c:forEach> akan menambahkan komponen turunan ke pohon komponen beberapa kali dan setiap kali akan mencoba menggunakan ID yang sama (tidak seperti <ui:repeat>). Hal ini jelas menghasilkan ID duplikat (Anda akan melihat pada contoh yang Anda tautkan, ID tersebut tidak menentukan ID apa pun dalam tag <c:forEach>).

Saya tidak yakin apa yang mereka maksud dengan 'fase pembuatan tampilan'. Jika Anda melihat dokumentasi JSF, Anda akan melihatnya di sana tidak ada fase seperti itu. Bagaimanapun, ketika Anda menggunakan <ui:repeat>, selama panggilan AJAX yang Anda gunakan untuk melakukan pencarian merender ulang rich:tabPanel maka itu akan berfungsi.

Alasan yang mereka kutip karena <ui:repeat> tidak berfungsi adalah:

Anda tidak dapat menggunakan komponen berulang (baik ui:repeat maupun a4j:repeat) untuk itu karena komponen tersebut berfungsi selama waktu render halaman dan tidak membuat komponen di pohon JSF tetapi hanya mengulangi instance yang sama.

Dan dalam contohnya mereka menggunakan:

...
<a4j:commandButton action="#{capitalsBean.search}" value="Search" reRender="output" id="search"/>
...
<a4j:outputPanel id="output">
    <rich:tabPanel id="tapPanel" width="700" rendered="#{not empty capitalsBean.foundCapitals}">
        <c:forEach items="#{capitalsBean.foundCapitals}" var="cap">
        ...

Jika Anda menentukan reRender="output" pada a4j:commandButton pencarian, bagaimana 'waktu render halaman' tidak terjadi untuk tapPanel??

Singkatnya, penggunaan <ui:repeat>, JSTL dan JSF biasanya bukan teman yang baik.

EDIT: Saya seharusnya melakukan ini terlebih dahulu karena saya tidak memiliki pengalaman dengan rich:tabPanel tetapi <ui:repeat>, tampaknya, tidak dapat digunakan dengan rich:tabPanel (tetapi bukan karena alasan yang disebutkan dalam contoh yang Anda tautkan, maka kebingungan saya). Namun jangan gunakan <c:forEach>, gunakan komponen yang mengikat rich:tabPanel.

person Gyan aka Gary Buyn    schedule 18.06.2011
comment
Masalah saya bukan duplikat id karena tag c:forEach mengulangi id kode keras seperti di dalam c:foreach saya menggunakan f:subview. Masalahnya adalah ketika halaman berubah terkadang pohon komponen sudah basi. Saya akan memeriksa pengikatan komponen untuk melihat apakah itu solusinya. Saya akan mencoba menemukan frase yang tepat untuk frase view build. - person Adam; 20.06.2011
comment
Saya yakin yang saya maksud dengan fase pembuatan tampilan adalah tampilan baru atau jalur tampilan awal dari fase tampilan pemulihan yang kemudian melewati fase respons render? - person Adam; 20.06.2011
comment
Sejujurnya saya tidak tahu cara kerja siklus hidup JSF sejauh itu. Namun Anda tidak perlu melakukannya. Panggilan AJAX memanggil siklus hidup JSF dengan cara yang sama seperti postback JSF biasa. Satu-satunya perbedaan adalah Anda dapat memilih komponen mana yang diproses oleh fase berbeda menggunakan atribut process dan reRender. Saya tidak mengerti mengapa Anda mendapatkan pohon komponen yang 'basi'. Satu-satunya hal yang mungkin 'basi' di sisi klien adalah hal-hal yang tidak termasuk dalam atribut reRender. - person Gyan aka Gary Buyn; 21.06.2011
comment
Sepertinya saya belum menjawab pertanyaan Anda dengan memuaskan... Terima kasih telah menerimanya. Coba pengikatannya dan hubungi saya kembali. - person Gyan aka Gary Buyn; 21.06.2011
comment
Pengikatan tersebut membawa saya ke jalur yang benar menuju solusi seperti ini: tabPanel.getParent().getChildren().clear(); Ini akan menghapus panel tab dari pohon komponen dan akan dibangun kembali. - person Adam; 21.06.2011