Wann sollte ich h: outputLink anstelle von h: commandLink verwenden?

129

Wann sollte ich ein <h:outputLink>anstelle eines verwenden <h:commandLink>?

Ich verstehe, dass a commandLinkeinen HTTP-Beitrag generiert; Ich vermute, dass outputLinkHTTP generiert wird. Das heißt, das meiste JSF-Tutorial-Material, das ich gelesen habe, verwendet commandLink(fast?) Ausschließlich.

Kontext: Ich implementiere ein kleines Demo-Projekt, das einen Header-Link zu einer Benutzerseite zeigt, ähnlich wie bei Stack Overflow ...

braucht mehr jquery

... und ich bin mir nicht sicher, ob commandLink(vielleicht ?faces-redirect=truefür Lesezeichen) oder outputLinkdie richtige Wahl ist.

Matt Ball
quelle

Antworten:

195

Das <h:outputLink>rendert ein vollwertiges HTML- <a>Element mit der richtigen URL im hrefAttribut, wodurch eine mit Lesezeichen versehene GET-Anforderung ausgelöst wird . Es kann keine verwaltete Bean-Aktionsmethode direkt aufrufen.

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

Das <h:commandLink>rendert ein HTML- <a>Element mit einem onclickSkript, das ein (verstecktes) POST-Formular sendet und eine verwaltete Bean-Aktionsmethode aufrufen kann. Es muss auch in einem platziert werden <h:form>.

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

Der ?faces-redirect=trueParameter auf dem <h:commandLink>, der nach dem POST eine Umleitung auslöst (gemäß dem Post-Redirect-Get- Muster), verbessert die Lesezeichenfähigkeit der Zielseite nur, wenn tatsächlich auf den Link geklickt wird (die URL wird nicht mehr "eins dahinter" sein). , aber es ändert nichts hrefvon dem <a>Element, um eine vollwertige URL zu sein. Es bleibt immer noch #.

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

Seit JSF 2.0 gibt es auch <h:link>eine Ansichts-ID (ein Navigationsfallergebnis) anstelle einer URL. Es wird auch ein HTML- <a>Element mit der richtigen URL in generiert href.

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

Wenn es sich also um eine reine und mit Lesezeichen versehene Navigation von Seite zu Seite handelt, wie z. B. den SO-Benutzernamen-Link, verwenden Sie <h:outputLink>oder <h:link>. Das ist auch besser für SEO, da Bots normalerweise weder POST-Formulare noch JS-Code verschlüsseln. Außerdem wird UX verbessert, da die Seiten jetzt mit Lesezeichen versehen werden können und die URL nicht mehr "eins dahinter" ist.

Bei Bedarf können Sie die Vorverarbeitungsaufgabe im Konstruktor oder @PostConstructeines @RequestScopedoder @ViewScoped @ManagedBeanausführen, das an die betreffende Zielseite angehängt ist. Sie können GET-Parameter als Bean-Eigenschaften verwenden @ManagedPropertyoder <f:viewParam>festlegen.

Siehe auch:

BalusC
quelle
2
Nein, muss nicht sein. UICommandIn einer UIFormKomponente müssen nur Komponenten enthalten sein.
BalusC
3
Eigentlich keine. Wenn Sie können, bleiben Sie im Allgemeinen bei h:outputLinkoder h:linkfür Links. SEO sollte nicht unterschätzt werden. Übrigens, für nette REST-ähnliche URLs wie hier auf SO, schauen Sie sich PrettyFaces an .
BalusC
1
Nein, der Unterschied besteht darin, dass h:linkdie JSF-Ansichts-ID (z. B. page) als Wert und h:outputLinkeine echte URL (z. B. /page.xhtmloder /page.jsfoder eine andere, abhängig von Ihrer FacesServletZuordnung) als Wert verwendet wird. Die URL-Codierung erfolgt in beiden Fällen trotzdem. Es gibt übrigens keinen Unterschied zwischen dem Renderverhalten von EL im Vorlagentext #{...}und h:outputText. Beides entgeht vordefinierten XML-Entitäten (nein, das ist nicht dasselbe wie URL-Codierung). Das h:outputTexteinzige bietet mehr Attribute wie id, styleClassusw., um die Komponente und / oder das Markup zu steuern.
BalusC
1
@BalusC Was genau meinst du mit "vollwertigem HTML" in der ersten Zeile deiner Antwort?
Geek
1
@Geek: nur auf den Punkt ein HTML- <a>Element, nichts mehr, keine Phantasie, kein JS-Code, etc.
BalusC
4

Ich sehe auch, dass das Laden der Seite (Leistung) bei Verwendung von h: commandLink viel länger dauert als bei Verwendung von h: link. h: link ist schneller als h: commandLink

Ashok
quelle
1
Ich finde das schwer zu glauben. Haben Sie außer Hörensagen / Ihren eigenen anekdotischen Beweisen etwas, das dies unterstützt?
Matt Ball
5
@Matt: Ich kann mir vorstellen, dass es langsamer ist, wenn Sie diesen POST-Navigationslink in einem "Gott" -Formular auf einer Seite mit beispielsweise einer Datentabelle mit> 1000 Zeilen mit 3 Eingabefeldern pro Zeile haben. Aber eine solche Seite hat sowieso andere ernsthafte Probleme :)
BalusC