Kapan saya harus menggunakan h: outputLink daripada h: commandLink?
129
Kapan saya harus menggunakan <h:outputLink>bukan <h:commandLink>?
Saya mengerti bahwa commandLinkmenghasilkan posting HTTP; Saya menduga itu outputLinkakan menghasilkan HTTP. Yang mengatakan, sebagian besar materi tutorial JSF saya baca menggunakan commandLink(hampir?) Secara eksklusif.
Konteks: Saya menerapkan proyek demo kecil wee yang menunjukkan tautan header ke halaman pengguna, seperti Stack Overflow ...
... dan saya tidak yakin apakah commandLink(mungkin menggunakan ?faces-redirect=trueuntuk bookmark) atau outputLinkmerupakan pilihan yang tepat.
The <h:outputLink>merender HTML fullworthy <a>elemen dengan URL yang tepat dalam hrefatribut yang kebakaran permintaan GET bookmarkable. Itu tidak bisa secara langsung memanggil metode tindakan kacang yang dikelola.
The <h:commandLink>merender HTML <a>elemen dengan onclicknaskah yang mengirimkan formulir (tersembunyi) POST dan dapat memanggil metode tindakan kacang berhasil. Ini juga harus ditempatkan di dalam <h:form>.
The ?faces-redirect=trueparameter pada <h:commandLink>, yang memicu redirect setelah POST (sesuai Post-Redirect-Dapatkan pola), hanya meningkatkan bookmarkability dari halaman target ketika link tersebut benar-benar mengklik (URL tidak akan "satu di belakang" lagi) , tetapi tidak mengubah hrefdari <a>elemen menjadi URL fullworthy. Masih ada #.
Sejak JSF 2.0, ada juga <h:link>yang dapat mengambil ID tampilan (hasil kasus navigasi) alih-alih URL. Ini akan menghasilkan <a>elemen HTML juga dengan URL yang tepat di href.
<h:linkvalue="link text"outcome="destination"/>
Jadi, jika itu untuk navigasi halaman-ke-halaman murni dan dapat-bookmark seperti tautan nama pengguna SO, gunakan <h:outputLink>atau <h:link>. Itu juga lebih baik untuk SEO karena bot biasanya tidak mengacak bentuk POST atau kode JS. Juga, UX akan ditingkatkan karena halaman-halamannya sekarang dapat di-bookmark dan URL-nya bukan "satu di belakang" lagi.
Bila perlu, Anda dapat melakukan pekerjaan preprocessing di konstruktor atau @PostConstructdari @RequestScopedatau @ViewScoped@ManagedBeanyang dilampirkan ke halaman tujuan yang dimaksud. Anda dapat menggunakan @ManagedPropertyatau <f:viewParam>untuk mengatur parameter GET sebagai properti kacang.
Tidak, tidak harus begitu. Hanya UICommandkomponen yang perlu dimasukkan dalam suatu UIFormkomponen.
BalusC
3
Sebenarnya tidak ada. Secara umum, bila Anda bisa, tetap menggunakan h:outputLinkatau h:linkuntuk tautan. SEO seharusnya tidak diremehkan. Omong-omong, untuk URL seperti REST yang bagus seperti di SO, lihat PrettyFaces .
BalusC
1
Tidak, perbedaannya adalah bahwa h:linkmengambil ID tampilan JSF (misalnya page) sebagai nilai dan h:outputLinkmengambil URL nyata (misalnya /page.xhtmlatau /page.jsf, atau lainnya tergantung pada FacesServletpemetaan Anda ) sebagai nilai. Pengodean URL tetap terjadi di kedua kasus. Omong-omong, tidak ada perbedaan antara perilaku render EL dalam teks templat #{...}dan h:outputText. Kedua lolos entitas XML yang telah ditetapkan (tidak, itu tidak sama dengan pengkodean URL). The h:outputTextsatunya tawaran lebih attribtues suka id, styleClass, dll untuk mengontrol komponen dan / atau markup.
BalusC
1
@ BalusC Apa sebenarnya yang Anda maksud dengan "HTML yang layak" di baris pertama jawaban Anda?
Geek
1
@ Geek: hanya satu <a>elemen HTML to-the-point , tidak lebih, tidak fanciness, tidak ada kode JS, dll.
BalusC
4
Saya juga melihat bahwa pemuatan halaman (kinerja) membutuhkan waktu lama dalam menggunakan h: commandLink daripada h: link. h: tautan lebih cepat dibandingkan dengan h: commandLink
Saya merasa sulit untuk percaya. Selain desas-desus / bukti anekdotal Anda sendiri, apakah Anda punya sesuatu untuk mendukung itu?
Matt Ball
5
@Matt: Saya dapat membayangkan bahwa ini lebih lambat ketika Anda memiliki tautan navigasi POST ini di dalam formulir "God" di halaman dengan misalnya data yang berisi> 1000 baris yang berisi 3 bidang input per baris. Tetapi halaman seperti itu memiliki masalah serius lainnya :)
UICommand
komponen yang perlu dimasukkan dalam suatuUIForm
komponen.h:outputLink
atauh:link
untuk tautan. SEO seharusnya tidak diremehkan. Omong-omong, untuk URL seperti REST yang bagus seperti di SO, lihat PrettyFaces .h:link
mengambil ID tampilan JSF (misalnyapage
) sebagai nilai danh:outputLink
mengambil URL nyata (misalnya/page.xhtml
atau/page.jsf
, atau lainnya tergantung padaFacesServlet
pemetaan Anda ) sebagai nilai. Pengodean URL tetap terjadi di kedua kasus. Omong-omong, tidak ada perbedaan antara perilaku render EL dalam teks templat#{...}
danh:outputText
. Kedua lolos entitas XML yang telah ditetapkan (tidak, itu tidak sama dengan pengkodean URL). Theh:outputText
satunya tawaran lebih attribtues sukaid
,styleClass
, dll untuk mengontrol komponen dan / atau markup.<a>
elemen HTML to-the-point , tidak lebih, tidak fanciness, tidak ada kode JS, dll.Saya juga melihat bahwa pemuatan halaman (kinerja) membutuhkan waktu lama dalam menggunakan h: commandLink daripada h: link. h: tautan lebih cepat dibandingkan dengan h: commandLink
sumber