Das <h:outputLink>
rendert ein vollwertiges HTML- <a>
Element mit der richtigen URL im href
Attribut, 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 onclick
Skript, 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=true
Parameter 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 href
von 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 @PostConstruct
eines @RequestScoped
oder @ViewScoped
@ManagedBean
ausführen, das an die betreffende Zielseite angehängt ist. Sie können GET-Parameter als Bean-Eigenschaften verwenden @ManagedProperty
oder <f:viewParam>
festlegen.
Siehe auch:
UICommand
In einerUIForm
Komponente müssen nur Komponenten enthalten sein.h:outputLink
oderh:link
für Links. SEO sollte nicht unterschätzt werden. Übrigens, für nette REST-ähnliche URLs wie hier auf SO, schauen Sie sich PrettyFaces an .h:link
die JSF-Ansichts-ID (z. B.page
) als Wert undh:outputLink
eine echte URL (z. B./page.xhtml
oder/page.jsf
oder eine andere, abhängig von IhrerFacesServlet
Zuordnung) 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#{...}
undh:outputText
. Beides entgeht vordefinierten XML-Entitäten (nein, das ist nicht dasselbe wie URL-Codierung). Dash:outputText
einzige bietet mehr Attribute wieid
,styleClass
usw., um die Komponente und / oder das Markup zu steuern.<a>
Element, nichts mehr, keine Phantasie, kein JS-Code, etc.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
quelle