web-dev-qa-db-fra.com

Quand devrais-je utiliser h: outputLink au lieu de h: commandLink?

Quand devrais-je utiliser un <h:outputLink> au lieu d'un <h:commandLink>?

Je comprends qu'un commandLink génère une publication HTTP; Je devine que outputLink générera HTTP obtient. Cela dit, la plupart des didacticiels JSF que j'ai lus utilisent exclusivement commandLink (presque?).

Contexte: J'implémente un petit projet de démonstration qui affiche un lien en-tête vers une page utilisateur, un peu comme le fichier Stack Overflow ...

needs more jquery

... et je ne sais pas si commandLink (peut-être en utilisant ?faces-redirect=true pour la facilité de marquage) ou outputLink est le bon choix.

127
Matt Ball

Le <h:outputLink> rend un HTML digne de ce nom <a> élément avec l'URL appropriée dans l'attribut href qui déclenche une demande GET pouvant être marquée par un signet. Il ne peut pas invoquer directement une méthode d'action de bean géré.

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

Le <h:commandLink> rend un HTML <a> élément avec un script onclick qui soumet un formulaire (masqué) POST) et peut appeler une méthode d'action avec un bean géré. Il doit également être placé à l'intérieur d'un <h:form>.

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

Le ?faces-redirect=true paramètre sur le <h:commandLink>, qui déclenche une redirection après le motif POST (conformément au modèle Post-Redirect-Get )), n'améliore la lisibilité de la page cible que lorsque le lien est réellement cliqué (l'URL ne sera plus "un derrière"), mais cela ne changera pas le href du <a> élément pour être une URL digne de ce nom. Il reste toujours #.

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

Depuis JSF 2.0, il y a aussi le <h:link> qui peut prendre un ID de vue (un résultat de cas de navigation) au lieu d’une URL. Il va générer un HTML <a> Elément avec l'URL appropriée dans href.

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

Donc, si c'est pour une navigation de page à page pure et avec un signet, comme le lien SO nom d'utilisateur, utilisez <h:outputLink> ou <h:link>. C'est aussi mieux pour le référencement puisque les robots ne chiffrent généralement pas POST forme ni code JS. De plus, UX sera amélioré car les pages sont maintenant bookmarkables et l'URL n'est plus "un derrière".

Si nécessaire, vous pouvez effectuer le travail de prétraitement dans le constructeur ou @PostConstruct d'un @RequestScoped ou @ViewScoped@ManagedBean qui est attaché à la page de destination en question. Vous pouvez utiliser @ManagedProperty ou <f:viewParam> pour définir les paramètres GET en tant que propriétés de bean.

Voir également:

191
BalusC

Je constate également que le chargement de la page (performances) prend beaucoup de temps pour utiliser h: commandLink que h: link. h: link est plus rapide que h: commandLink

4
Ashok