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.
Jika Anda
h:commandLink
berada di dalam,h:dataTable
ada alasan lain mengapa halh:commandLink
itu tidak berfungsi:Sumber data dasar yang terikat pada
h:dataTable
juga harus tersedia di siklus hidup JSF kedua yang dipicu ketika tautan diklik.Jadi, jika sumber data yang mendasarinya adalah permintaan yang dicakup, maka
h:commandLink
tidak akan berfungsi!sumber
Meskipun jawaban saya tidak 100% berlaku, tetapi kebanyakan mesin pencari menemukan ini sebagai hit pertama, saya memutuskan untuk mempostingnya nontheless:
Jika Anda menggunakan PrimeFaces (atau API serupa)
p:commandButton
ataup:commandLink
, kemungkinan Anda lupa menambahkan secara eksplisitprocess="@this"
ke komponen perintah Anda.Seperti yang dinyatakan oleh Panduan Pengguna PrimeFaces di bagian 3.18, default untuk
process
danupdate
keduanya@form
, yang cukup banyak menentang default yang mungkin Anda harapkan dari JSFf:ajax
atau RichFaces, yang masingexecute="@this"
-render="@none"
masing.Hanya butuh saya waktu looong untuk mencari tahu. (... dan saya pikir agak tidak sopan untuk menggunakan default yang berbeda dari JSF!)
sumber
process
adalah@form
. Jadi jika tindakan tidak dipanggil dengan cara ini, tetapi dilakukan saat menggunakan@this
, maka kemungkinan besar poin 3 dari jawaban saya berlaku.p:commandButton
yang tidak meminta metode actionListener sampai saya menambahkanprocess="@this"
. Lebih lanjut, Panduan Pengguna PrimeFaces secara eksplisit mencantumkan default yang saya sebutkan di bagian 3.18 dan 3.19. Itu ada di sini: primefaces.googlecode.com/files/primefaces_users_guide_3_4.pdf ... mungkin defaultnya diubah?process="@this"
dan tambahkan<p:messages autoUpdate="true">
(atau baca saja log server untuk pesan yang antri tetapi tidak ditampilkan) dan Anda akan melihat bahwa sebenarnya terjadi kesalahan konversi / validasi.Saya akan menyebutkan satu hal lagi yang menyangkut Primefaces
p:commandButton
!Ketika Anda menggunakan
p:commandButton
untuk tindakan yang perlu dilakukan di server, Anda tidak dapat menggunakantype="button"
karena itu untuk tombol Push yang digunakan untuk mengeksekusi javascript kustom tanpa menyebabkan permintaan ajax / non-ajax ke server.Untuk tujuan ini, Anda dapat mengeluarkan
type
atribut (nilai defaultnya adalah"submit"
) atau Anda dapat menggunakan secara eksplisittype="submit"
.Semoga ini bisa membantu seseorang!
sumber
p:commandButton
memiliki beberapa nilaitype
atribut, danbutton
merupakan salah satu yang menyangkut segalanya tentang sisi klien. Agak sulit untuk menemukan ini diPrimefaces
doc, tapi di sini ada satu tautan: developer.am/primefaces/…Terjebak dengan masalah ini sendiri dan menemukan satu lagi penyebab masalah ini. Jika Anda tidak memiliki metode penyetel dalam kacang latar untuk properti yang digunakan di * .xhtml Anda, maka tindakan itu sama sekali tidak diminta.
sumber
PropertyNotWritableException
. Jika Anda tidak melihatnya, mungkin Anda memecat permintaan ajax tanpa penangan pengecualian ajax yang tepat, tetapi Anda harus melihatnya di log server.Saya baru-baru ini mengalami masalah dengan perintah UIC yang tidak meminta dalam aplikasi JSF 1.2 menggunakan Komponen IBM Extended Faces.
Saya memiliki tombol perintah pada deretan dataat (versi yang diperluas, jadi
<hx:datatable>
) dan perintah UIC tidak akan diaktifkan dari baris tertentu dari tabel (baris yang tidak akan diaktifkan adalah baris yang lebih besar daripada ukuran tampilan baris standar).Saya memiliki komponen tarik-turun untuk memilih jumlah baris yang akan ditampilkan. Nilai yang mendukung bidang ini ada di
RequestScope
. Data yang mendukung tabel itu sendiri adalah semacamViewScope
(dalam kenyataannya, sementaraSessionScope
).Jika tampilan baris ditingkatkan melalui kontrol yang nilainya juga terikat pada
rows
atribut datatable , tidak ada baris yang ditampilkan sebagai hasil dari perubahan ini yang dapat memunculkan perintah UIC saat diklik.Menempatkan atribut ini dalam cakupan yang sama dengan data tabel itu sendiri memperbaiki masalah.
Saya pikir ini disinggung dalam BalusC # 4 di atas, tetapi tidak hanya nilai tabel perlu View atau Sesi scoped tetapi juga atribut yang mengontrol jumlah baris untuk ditampilkan pada tabel itu.
sumber
Saya punya masalah ini juga dan baru benar-benar mulai mengasah pada penyebab utama setelah membuka konsol web browser. Sampai saat itu, saya tidak dapat menerima pesan kesalahan (bahkan dengan
<p:messages>
). Konsol web menunjukkan kode status HTTP 405 yang kembali dari Internet<h:commandButton type="submit" action="#{myBean.submit}">
.Dalam kasus saya, saya memiliki campuran vanilla HttpServlet yang menyediakan autentikasi OAuth melalui Auth0 dan JSF facelet dan bean yang menjalankan tampilan aplikasi dan logika bisnis saya.
Setelah saya refactored web.xml saya, dan menghapus mid-man-servlet, itu kemudian "ajaib" bekerja.
Intinya, masalahnya adalah bahwa orang tengah-servlet menggunakan RequestDispatcher.forward (...) untuk mengalihkan dari lingkungan HttpServlet ke lingkungan JSF sedangkan servlet dipanggil sebelum diarahkan dengan HttpServletResponse.sendRedirect (.. .).
Pada dasarnya, menggunakan sendRedirect () memungkinkan "wadah" JSF untuk mengambil kendali sedangkan RequestDispatcher.forward () jelas tidak.
Apa yang saya tidak tahu adalah mengapa facelet dapat mengakses properti kacang tetapi tidak dapat mengaturnya, dan ini jelas berteriak untuk menghilangkan campuran servlets dan JSF, tapi saya harap ini membantu seseorang menghindari berjam-jam head- ke-meja-membenturkan.
sumber
Saya memiliki banyak kesenangan men-debug masalah di mana
<h:commandLink>
tindakan dirichfaces
datatable
menolak memecat. Meja yang digunakan untuk bekerja di beberapa titik tetapi berhenti tanpa alasan yang jelas. Saya tidak meninggalkan kebutuhan bisnis yang terlewat, hanya untuk mengetahui bahwa sayarich:datatable
menggunakan yang salahrowKeyConverter
yang menghasilkan nol yang dengan senang hati digunakan sebagai kunci baris. Ini mencegah<h:commandLink>
tindakan saya dipanggil.sumber
Satu lagi kemungkinan: jika gejalanya adalah doa pertama berfungsi, tetapi yang berikutnya tidak, Anda mungkin menggunakan PrimeFaces 3.x dengan JSF 2.2, seperti yang dijelaskan di sini: Tidak ada kondisi tampilan yang dikirim .
sumber
Saya memperbaiki masalah saya dengan menempatkan:
Di:
sumber
Ini solusinya, yang berhasil untuk saya.
Di sini, proses = "userGroupSetupForm" atrribute wajib untuk panggilan Ajax. actionListener memanggil metode dari @ViewScope Bean. Juga memperbarui pesan growl, Datatable: userGroupList dan Form: userGroupSetupForm.
sumber
Menyelesaikan;
sumber