dan Anda juga tidak melihat kesalahan googlable dan / atau peringatan di konsol JavaScript peramban (tekan F12 di Chrome / Firefox23 + / IE9 + untuk membuka toolset pengembang web dan kemudian membuka tab Konsol ), kemudian bekerja di bawah daftar kemungkinan penyebabnya.
UICommand
dan UIInput
komponen harus ditempatkan di dalam UIForm
komponen, misalnya <h:form>
(dan dengan demikian bukan HTML biasa <form>
), jika tidak, tidak ada yang dapat dikirim ke server. UICommand
komponen juga tidak boleh memiliki type="button"
atribut, jika tidak maka akan menjadi tombol mati yang hanya berguna untuk JavaScript onclick
. Lihat juga Cara mengirim nilai input formulir dan memanggil metode dalam JSF bean dan <h: commandButton> tidak memulai postback .
Anda tidak dapat menyarang banyak UIForm
komponen satu sama lain. Ini ilegal dalam HTML. Perilaku browser tidak ditentukan. Awas dengan menyertakan file! Anda dapat menggunakan UIForm
komponen secara paralel, tetapi mereka tidak akan saling memproses selama pengiriman. Anda juga harus berhati-hati dengan antipattern "God Form"; pastikan bahwa Anda tidak secara tidak sengaja memproses / memvalidasi semua input (tidak terlihat) lainnya dalam bentuk yang sama (misalnya memiliki dialog tersembunyi dengan input yang diperlukan dalam bentuk yang sama). Lihat juga Cara menggunakan <h: form> di halaman JSF? Bentuk tunggal? Berbagai bentuk? Formulir bersarang? .
Tidak ada UIInput
nilai error validasi / konversi seharusnya terjadi. Anda dapat menggunakan <h:messages>
untuk menampilkan pesan apa pun yang tidak ditampilkan oleh <h:message>
komponen spesifik input apa pun . Jangan lupa untuk menyertakan id
dari <h:messages>
dalam <f:ajax render>
, jika ada, sehingga akan diperbarui juga pada permintaan ajax. Lihat juga h: pesan tidak menampilkan pesan saat p: commandButton ditekan .
Jika UICommand
atau UIInput
komponen ditempatkan di dalam komponen iterasi seperti <h:dataTable>
,, <ui:repeat>
dll, maka Anda perlu memastikan bahwa value
komponen iterating yang sama persis dipertahankan selama fase nilai permintaan yang berlaku pada formulir kirim permintaan. JSF akan mengulanginya untuk menemukan tautan / tombol yang diklik dan memasukkan nilai input. Menempatkan kacang di ruang lingkup tampilan dan / atau memastikan bahwa Anda memuat model data di @PostConstruct
kacang (dan dengan demikian tidak dalam metode pengambil!) Harus memperbaikinya. Lihat juga Bagaimana dan kapan saya harus memuat model dari basis data untuk h: dataTable .
Jika UICommand
atau UIInput
komponen disertakan oleh sumber dinamis seperti <ui:include src="#{bean.include}">
, maka Anda perlu memastikan bahwa nilai yang sama persis #{bean.include}
dipertahankan selama tampilan waktu pembuatan formulir mengirimkan permintaan. JSF akan menjalankannya kembali saat membangun pohon komponen. Menempatkan kacang di ruang lingkup tampilan dan / atau memastikan bahwa Anda memuat model data di @PostConstruct
kacang (dan dengan demikian tidak dalam metode pengambil!) Harus memperbaikinya. Lihat juga Bagaimana ajax-refresh dinamis termasuk konten dengan menu navigasi? (JSF SPA) .
The rendered
atribut dari komponen dan semua orang tua nya dan test
atribut dari setiap orangtua <c:if>
/ <c:when>
tidak harus mengevaluasi untuk false
selama menerapkan fase nilai permintaan formulir mengirimkan permintaan. JSF akan memeriksanya kembali sebagai bagian dari perlindungan terhadap permintaan yang dirusak / diretas. Menyimpan variabel yang bertanggung jawab untuk kondisi tersebut dalam @ViewScoped
kacang atau memastikan bahwa Anda benar preinitializing kondisi di @PostConstruct
dari @RequestScoped
kacang harus memperbaikinya. Hal yang sama berlaku untuk disabled
atribut komponen, yang seharusnya tidak dievaluasi true
selama fase nilai permintaan berlaku. Lihat juga tindakan JSF CommandButton tidak dipanggil , Formulir kirim dalam komponen yang diberikan secara kondisional tidak diproses danh: commandButton tidak berfungsi setelah saya membungkusnya dalam <h: panelGroup rendered> .
The onclick
atribut dari UICommand
komponen dan onsubmit
atribut dari UIForm
komponen tidak harus kembali false
atau menyebabkan kesalahan JavaScript. Seharusnya dalam kasus <h:commandLink>
atau <f:ajax>
juga tidak ada kesalahan JS terlihat di konsol JS browser. Biasanya googling pesan kesalahan yang tepat sudah akan memberi Anda jawabannya. Lihat juga menambahkan / memuat jQuery secara manual dengan hasil PrimeFaces di Uncaught TypeErrors .
Jika Anda menggunakan Ajax melalui JSF 2.x <f:ajax>
atau mis. PrimeFaces <p:commandXxx>
, pastikan Anda memiliki <h:head>
di dalam master template alih-alih <head>
. Jika tidak, JSF tidak akan dapat secara otomatis menyertakan file JavaScript yang diperlukan yang berisi fungsi Ajax. Ini akan menghasilkan kesalahan JavaScript seperti "mojarra tidak didefinisikan" atau "PrimeFaces tidak didefinisikan" di konsol JS browser. Lihat juga h: commandLink actionlistener tidak dipanggil ketika digunakan dengan f: ajax dan ui: repeat .
Jika Anda menggunakan Ajax, dan nilai yang dikirimkan berakhir null
, maka pastikan bahwa UIInput
dan UICommand
komponen yang diminati dicakup oleh <f:ajax execute>
atau mis. <p:commandXxx process>
, Jika tidak, mereka tidak akan dieksekusi / diproses. Lihat juga Nilai formulir yang dikirimkan tidak diperbarui dalam model saat menambahkan <f: ajax> ke <h: commandButton> dan Memahami proses / pembaruan PrimeFaces dan JSF f: ajax execut / render atribut .
Jika nilai yang dikirimkan masih berakhir null
, dan Anda menggunakan CDI untuk mengelola kacang, maka pastikan Anda mengimpor anotasi cakupan dari paket yang benar, jika tidak, CDI akan default @Dependent
yang secara efektif membuat kembali kacang pada setiap evaluasi EL. ekspresi. Lihat juga @SessionScoped bean kehilangan lingkup dan dibuat ulang setiap saat, bidang menjadi nol dan Apa Lingkup Managed Bean standar dalam aplikasi JSF 2?
Jika orangtua <h:form>
dengan UICommand
tombol sebelumnya telah diberikan / diperbarui oleh permintaan ajax yang berasal dari formulir lain di halaman yang sama, maka tindakan pertama akan selalu gagal di JSF 2.2 atau lebih lama. Tindakan kedua dan selanjutnya akan berhasil. Ini disebabkan oleh bug dalam penanganan kondisi tampilan yang dilaporkan sebagai masalah spesifikasi JSF 790 dan saat ini diperbaiki di JSF 2.3. Untuk versi JSF yang lebih lama, Anda harus secara eksplisit menentukan ID <h:form>
di render
dalam <f:ajax>
. Lihat juga h: commandButton / h: commandLink tidak berfungsi pada klik pertama, hanya berfungsi pada klik kedua .
Jika <h:form>
telah enctype="multipart/form-data"
ditetapkan untuk mendukung pengunggahan file, maka Anda perlu memastikan bahwa Anda menggunakan setidaknya JSF 2.2, atau bahwa filter servlet yang bertanggung jawab untuk mem-parsing permintaan data formulir / data multi-bagian telah dikonfigurasikan dengan benar, jika tidak maka FacesServlet
kehendak akhirnya tidak mendapatkan parameter permintaan sama sekali dan dengan demikian tidak dapat menerapkan nilai-nilai permintaan. Cara mengonfigurasi filter seperti itu tergantung pada komponen unggahan file yang digunakan. Untuk Tomahawk <t:inputFileUpload>
, periksa jawaban ini dan untuk PrimeFaces <p:fileUpload>
, periksa jawaban ini . Atau, jika Anda sebenarnya tidak mengunggah file sama sekali, maka hapus atributnya sama sekali.
Pastikan bahwa ActionEvent
argumen actionListener
adalah javax.faces.event.ActionEvent
dan karenanya bukan java.awt.event.ActionEvent
, yang disarankan sebagian besar IDE sebagai opsi pelengkapan otomatis pertama. Tidak memiliki argumen juga salah jika Anda menggunakan actionListener="#{bean.method}"
. Jika Anda tidak ingin argumen dalam metode Anda, gunakan actionListener="#{bean.method()}"
. Atau mungkin Anda benar-benar ingin menggunakan action
bukan actionListener
. Lihat juga Perbedaan antara tindakan dan daftar tindakan .
Pastikan bahwa tidak ada PhaseListener
atau apa pun EventListener
dalam rantai respons-permintaan telah mengubah siklus hidup JSF untuk melewati fase tindakan pemanggilan dengan misalnya menelepon FacesContext#renderResponse()
atau FacesContext#responseComplete()
.
Pastikan bahwa tidak ada Filter
atau Servlet
dalam rantai permintaan-respons yang sama telah memblokir permintaan untuk FacesServlet
entah bagaimana. Misalnya, filter masuk / keamanan seperti Spring Security. Khususnya dalam permintaan ajax yang secara default akan berakhir tanpa umpan balik UI sama sekali. Lihat juga Spring Security 4 dan PrimeFaces 5 AJAX penanganan permintaan .
Jika Anda menggunakan PrimeFaces <p:dialog>
atau a <p:overlayPanel>
, maka pastikan bahwa mereka memiliki milik mereka sendiri <h:form>
. Karena, komponen-komponen ini secara default oleh JavaScript dipindahkan ke akhir HTML <body>
. Jadi, jika mereka awalnya duduk di dalam <form>
, maka mereka sekarang tidak lagi duduk di <form>
. Lihat juga p: commandbutton action tidak berfungsi di dalam dialog p:
Bug dalam framework. Misalnya, RichFaces memiliki " kesalahan konversi " saat menggunakan rich:calendar
elemen UI dengan defaultLabel
atribut (atau, dalam beberapa kasus, rich:placeholder
sub-elemen). Bug ini mencegah metode kacang dari dipanggil ketika tidak ada nilai yang ditetapkan untuk tanggal kalender. Menelusuri bug kerangka kerja dapat diselesaikan dengan mulai dengan contoh kerja sederhana dan membangun kembali halaman cadangan hingga bug ditemukan.
Jika Anda masih macet, saatnya untuk debug. Di sisi klien, tekan F12 di browser web untuk membuka perangkat pengembang web. Klik tab Konsol jadi lihat conosle JavaScript. Seharusnya bebas dari kesalahan JavaScript. Tangkapan layar di bawah adalah contoh dari Chrome yang menunjukkan kasus pengiriman <f:ajax>
tombol yang diaktifkan tanpa <h:head>
dinyatakan (seperti dijelaskan dalam poin 7 di atas).
Di sisi server, pastikan server dijalankan dalam mode debug. Masukkan debug breakpoint dalam metode komponen JSF yang Anda inginkan untuk dipanggil selama memproses pengiriman formulir. Misalnya dalam hal UICommand
komponen, itu akan terjadi UICommand#queueEvent()
dan dalam kasus UIInput
komponen, itu akan menjadi UIInput#validate()
. Cukup langkah melalui eksekusi kode dan periksa apakah aliran dan variabel sesuai harapan. Screenshot di bawah ini adalah contoh dari debugger Eclipse.