Le <h:outputLink>
rend un <a>
élément HTML digne de ce nom avec l'URL appropriée dans l' href
attribut qui déclenche une requête GET pouvant être mise en signet. Il ne peut pas appeler directement une méthode d'action de bean géré.
<h:outputLink value="destination.xhtml">link text</h:outputLink>
Le <h:commandLink>
rend un <a>
élément HTML avec un onclick
script qui soumet un formulaire POST (masqué) et peut invoquer une méthode d'action de bean géré. Il doit également être placé dans un fichier <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 POST (selon le modèle Post-Redirect-Get ), n'améliore la possibilité de signets de la page cible que lorsque le lien est réellement cliqué (l'URL ne sera plus "un derrière") , mais cela ne change pas le href
de l' <a>
élément pour être une URL complète. 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 générera également un <a>
élément HTML avec l'URL appropriée au format href
.
<h:link value="link text" outcome="destination" />
Donc, s'il s'agit d'une navigation pure et simple de page à page, comme le lien du nom d'utilisateur SO, utilisez <h:outputLink>
ou <h:link>
. C'est également mieux pour le référencement car les robots ne chiffrent généralement pas les formulaires POST ni le code JS. De plus, l'expérience utilisateur sera améliorée car les pages peuvent désormais être mises en signet 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 des paramètres GET comme propriétés de bean.
Voir également:
UICommand
composants doivent entrer dans unUIForm
composant.