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.
UICommanddan UIInputkomponen harus ditempatkan di dalam UIFormkomponen, misalnya <h:form>(dan dengan demikian bukan HTML biasa <form>), jika tidak, tidak ada yang dapat dikirim ke server. UICommandkomponen 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 UIFormkomponen satu sama lain. Ini ilegal dalam HTML. Perilaku browser tidak ditentukan. Awas dengan menyertakan file! Anda dapat menggunakan UIFormkomponen 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 UIInputnilai 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 iddari <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 UICommandatau UIInputkomponen ditempatkan di dalam komponen iterasi seperti <h:dataTable>,, <ui:repeat>dll, maka Anda perlu memastikan bahwa valuekomponen 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 @PostConstructkacang (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 UICommandatau UIInputkomponen 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 @PostConstructkacang (dan dengan demikian tidak dalam metode pengambil!) Harus memperbaikinya. Lihat juga Bagaimana ajax-refresh dinamis termasuk konten dengan menu navigasi? (JSF SPA) .
The renderedatribut dari komponen dan semua orang tua nya dan testatribut dari setiap orangtua <c:if>/ <c:when>tidak harus mengevaluasi untuk falseselama 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 @ViewScopedkacang atau memastikan bahwa Anda benar preinitializing kondisi di @PostConstructdari @RequestScopedkacang harus memperbaikinya. Hal yang sama berlaku untuk disabledatribut komponen, yang seharusnya tidak dievaluasi trueselama 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 onclickatribut dari UICommandkomponen dan onsubmitatribut dari UIFormkomponen tidak harus kembali falseatau 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 UIInputdan UICommandkomponen 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 @Dependentyang 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 UICommandtombol 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 renderdalam <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 FacesServletkehendak 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 ActionEventargumen actionListeneradalah javax.faces.event.ActionEventdan 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 actionbukan actionListener. Lihat juga Perbedaan antara tindakan dan daftar tindakan .
Pastikan bahwa tidak ada PhaseListeneratau apa pun EventListenerdalam 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 Filteratau Servletdalam rantai permintaan-respons yang sama telah memblokir permintaan untuk FacesServletentah 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:calendarelemen UI dengan defaultLabelatribut (atau, dalam beberapa kasus, rich:placeholdersub-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 UICommandkomponen, itu akan terjadi UICommand#queueEvent()dan dalam kasus UIInputkomponen, 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.