Question

J'ai récemment commencé à travailler sur JSF - auparavant, j'avais toujours utilisé PHP ou Python pour le développement Web.

J'ai été quelque peu surpris de constater que JSF utilise HTTP POST pour naviguer lorsque la balise h: commandLink est utilisée.

J'utilise CommandLink car il s'agit apparemment du moyen approprié pour créer des applications JSF. Pourquoi JSF utilise-t-il POST pour la navigation? Quel est le problème avec GET? Je ne peux que supposer que le code JavaScript généré automatiquement par JSF pour les événements onclick pourrait dépasser la longueur maximale autorisée pour une demande GET.

Je connais déjà un certain nombre de pages à l'aide de h: commandLink. Cela fonctionne bien jusqu'à ce que j'utilise le bouton de retour du navigateur. Comment dois-je gérer le bouton de retour dans JSF?

J'ai du mal à comprendre pourquoi JSF a été construit autour du POST. Cela annule les favoris, la pagination en arrière et la possibilité d’indexer votre page dans les moteurs de recherche.

Était-ce utile?

La solution

Cela ne vous aidera pas à créer un lien sur le client, mais soyez conscient de outputLink .

Il existe un élément de redirection pour les règles de navigation qui peut aider à résoudre certains problèmes d'actualisation.

<navigation-rule>
  <display-name>navBack</display-name>
  <from-view-id>/navBack.jsp</from-view-id>
  <navigation-case>
    <from-outcome>navTo</from-outcome>
    <to-view-id>/navTo.jsp</to-view-id>
    <redirect />
  </navigation-case>
</navigation-rule>

Si tout échoue, vous pouvez créer l'URL de redirection vous-même, comme dans cette action:

public String doAction() {
  System.out.println("Did some non-idempotent operation");
  FacesContext context = FacesContext.getCurrentInstance();
  ExternalContext extContext = context.getExternalContext();
  Application app = context.getApplication();
  ViewHandler viewHandler = app.getViewHandler();
  String url = viewHandler.getActionURL(context, "/navTo.jsp");
  url = url + (url.indexOf('?') < 0 ? '?' : '+') + "foo=bar";
  url = extContext.encodeResourceURL(url);
  try {
    extContext.redirect(url);
  } catch (IOException e) {
    throw new FacesException(e);
  }
  return null;
}

Mises en garde: je ne me souviens pas si je code correctement l'URL.

Diverses bibliothèques tierces ajoutent des fonctionnalités différentes. Je ne sais pas si quelque chose a été fait dans JSF 2.0 dans ce domaine, mais cela vaut peut-être la peine d'être examiné.

Autres conseils

Oui. JSF est construit autour du POST et constitue l’un des points les plus difficiles de JSF. Jetez un coup d’œil à JAX-RS / Seam ou Spring pour consulter les pages GET pouvant être marquées d’un signet.

Comme l'a dit BalusC sur son blog , GET devrait être utilisé pour la navigation entre les pages. Utilisez h: outputLink pour la navigation.

Vous pouvez lire son PostRedirectGetListener et il résoudra / actualisera le message de confirmation de nouvelle soumission du formulaire.

Je vous conseille d'ajouter les éléments suivants à beforePhase afin de gérer le traitement ajax partiel (le cas échéant):

if(event.getFacesContext().getPartialViewContext().isAjaxRequest())
{
    return;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top