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