Alors la navigation en JSF n'est pas aussi simple ou "ergonomique". En réalité, c'est normal que l'URL que tu vois en survolant le lien ne soit pas l'URL "attendue", car en fait le lien ne sait pas vers quelle page cela va rediriger l'utilisateur !
De plus, tous les liens JSF soumettent des formulaires via JavaScript.
Je ne vais pas trop rentrer dans les détails, mais un autre aspect important est que JSF fonctionne sur le principe du postback (du moins son comportement par défaut), et qu'en fait la navigation entre les pages est géré du coup en interne, par le framework JSF...
Bon comment ça marche les navigations ? Dans un commandLink / commandButton, tu as un attribut "action", qui peut être soit statique (dans ton cas), ou bien faire appel à une action Java (côté serveur). Quelque chose du type action="#{monBean.monAction}". Cette action a la signature suivante :
public String monAction() { ... }
La chaine de caractères retournée va correspondre à l'ID de la règle de navigation à appliquer. Quand tu définis une action statique (par ex. <h:commandLink action="go_signin"), c'est exactement pareil. La seule différence, c'est qu'il n'y a pas de traitement spécifique côté serveur.
Dans tes règles de navigation, tu définis ceci :
1 2 3 4 5 6 7 8 9
| <navigation-rule>
<display-name>index</display-name>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<from-outcome>go_signin</from-outcome>
<to-view-id>/signin.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule> |
Pour JSF, ça signifie ceci : "Quand l'utilisateur est sur la page index.jsp, et qu'il exécute une action qui retourne comme valeur "go_signin", il faut le rediriger vers la page signin.jsp".
L'intérêt c'est qu'un même bouton peut définir plusieurs redirections possibles. Prennons un exemple :
<h:commandButton value="Valider" action="#{monBean.valider}"/>
Ensuite, dans le code Java, je fais :
1 2 3 4 5 6 7
| public String valider() {
// Je fais des trucs...
if (someErrorsOccured) {
return "error";
}
return "new_page";
} |
Enfin, dans le fichier faces-config.xml, je définis 2 règles de navigation. L'une indique de diriger l'utilisateur vers la page "error.jsp" si from-outcome="error", l'autre indique de rediriger vers la page "new_page.jsp". Bien sûr, tu peux multiplier les cas...
Partager