H: commandLink yerine h: outputLink'i ne zaman kullanmalıyım?


129

Ne zaman an <h:outputLink>yerine an kullanmalıyım <h:commandLink>?

commandLinkA'nın bir HTTP gönderisi oluşturduğunu anlıyorum ; Tahmin ediyorum ki bu outputLinkHTTP alır. Bununla birlikte, okuduğum JSF eğitim materyalinin çoğu commandLink(neredeyse?) Yalnızca kullanır .

Bağlam: Stack Overflow'unki gibi, bir kullanıcı sayfasına bir başlık bağlantısı gösteren küçük bir demo projesi uyguluyorum ...

daha fazla jquery gerekiyor

... ve emin değilim commandLink(belki ?faces-redirect=trueyer imi için kullanmak ) veya outputLinkdoğru seçim mi?

Yanıtlar:


195

<h:outputLink>Bir fullworthy HTML vermektedir <a>düzgün URL ile eleman hrefbir bookmarkable GET isteğini tetikler özniteliği. Yönetilen bir fasulye eylem yöntemini doğrudan çağıramaz.

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

<h:commandLink>Bir HTML vermektedir <a>bir ile eleman onclickbir (gizli) POST formu gönderir ve yönetilen fasulye eylem yöntemi çağırabilirsiniz senaryo. Ayrıca bir <h:form>.

<h:form>
    <h:commandLink value="link text" action="destination" />
</h:form>

?faces-redirect=trueParametre <h:commandLink>(gereğince POST sonra bir yönlendirme tetikler Sonrası Yönlendirme-Get bağlantı aslında tıklandığında, yalnızca hedef sayfanın bookmarkability artırır (URL "arkasında bir" olmayacak artık) desen) ama değişmez hrefait <a>bir fullworthy URL olması için eleman. Hala kalır #.

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

JSF 2.0'dan bu yana <h:link>, bir URL yerine bir görünüm kimliği (navigasyon durumu sonucu) alabilen de vardır . <a>Uygun URL ile birlikte bir HTML öğesi oluşturacaktır href.

<h:link value="link text" outcome="destination" />

Öyleyse, SO kullanıcı adı bağlantısı gibi saf ve yer imlerine eklenebilir sayfadan sayfaya gezinme içinse, <h:outputLink>veya kullanın <h:link>. Botlar genellikle POST formlarını veya JS kodunu şifrelemediği için bu SEO için daha iyidir. Ayrıca, sayfalar artık yer imlerine eklenebilir olduğundan ve URL artık "bir arkada" olmadığından UX geliştirilecektir.

Gerektiğinde, yapıcıda veya @PostConstructa @RequestScopedveya @ViewScoped @ManagedBeansöz konusu hedef sayfaya eklenmiş olan ön işleme işini yapabilirsiniz . Fasulye özellikleri olarak GET parametrelerini kullanabilir @ManagedPropertyveya <f:viewParam>ayarlayabilirsiniz.

Ayrıca bakınız:


2
Hayır, olmak zorunda değil. Bir UICommandbileşene yalnızca bileşenlerin girmesi gerekir UIForm.
BalusC

3
Aslında yok. Genellikle, ne zaman, sopa olabilir h:outputLinkveya h:linkbağlantılar için. SEO küçümsenmemelidir. Bu arada, SO'daki gibi güzel REST benzeri URL'ler için PrettyFaces'e bir göz atın .
BalusC

1
Hayır, fark, h:linkJSF görünüm kimliğini (ör. page) Değer olarak h:outputLinkalması ve değer olarak gerçek bir URL (ör. /page.xhtmlVeya /page.jsf, veya FacesServleteşlemenize bağlı olarak başka bir şey ) almasıdır . URL kodlaması her iki durumda da gerçekleşir. Bu arada, EL'nin şablon metnindeki oluşturma davranışı #{...}ile h:outputText. Her ikisi de önceden tanımlanmış XML varlıklarından kaçar (hayır, bu URL kodlamasıyla aynı değildir). h:outputTextDaha attribtues gibi sadece teklifler id, styleClassvb bileşeni ve / veya işaretlemeyi kontrol etmek.
BalusC

1
@BalusC Cevabınızın ilk satırındaki "fullworthy HTML" ile tam olarak neyi kastediyorsunuz?
Geek

1
@Geek: Sadece noktaya kadar bir HTML <a>öğesi, daha fazlası yok, fantezi yok, JS kodu yok vb.
BalusC

4

Ayrıca h: commandLink kullanımının h: link yerine sayfa yüklemesinin (performans) uzun sürdüğünü görüyorum. h: link, h: commandLink'e kıyasla daha hızlıdır


1
Buna inanmakta zorlanıyorum. Söylenti / kendi anekdot kanıtınız dışında, bunu destekleyecek herhangi bir şeyiniz var mı?
Matt Ball

5
@Matt: Örneğin, satır başına 3 giriş alanı içeren 1000'den fazla satır içeren bir veriye sahip bir sayfadaki "Tanrı" formu içinde bu POST gezinme bağlantısına sahip olduğunuzda daha yavaş olduğunu tahmin edebiliyorum. Ama böyle bir sayfanın başka ciddi sorunları da var :)
BalusC
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.