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 ...

membutuhkan lebih banyak jquery

... dan saya tidak yakin apakah commandLink(mungkin menggunakan ?faces-redirect=trueuntuk bookmark) atau outputLinkmerupakan pilihan yang tepat.

Matt Ball
sumber

Jawaban:

195

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.

<h:outputLink value="destination.xhtml">link text</h:outputLink>

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>.

<h:form>
    <h:commandLink value="link text" action="destination" />
</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 #.

<h:form>
    <h:commandLink value="link text" action="destination?faces-redirect=true" />
</h:form>

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:link value="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.

Lihat juga:

BalusC
sumber
2
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

Ashok
sumber
1
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 :)
BalusC