Passer un objet entre @ ViewScoped beans sans utiliser GET params
j'ai un browse.xhtml
où je parcours une liste de cars
et je veux voir les détails de la voiture dans details.xhtml
quand un bouton" View more " est appuyé. Leurs fèves de soutien sont @ViewScoped
et sont appelés BrowseBean
et DetailsBean
, respectivement.
maintenant, je ne voudrais pas que l'utilisateur/client voit l'ID de la voiture dans L'URL, donc je voudrais éviter D'utiliser GET params, comme présenté ici et ici .
y a-t-il un moyen d'y parvenir? J'utilise Mojarra 2.2.8 avec PrimeFaces 5 et OmniFaces 1.8.1.
1 réponses
Dépend si vous envoyez une redirection ou simplement la navigation.
si vous envoyez une redirection, alors mettez - la dans la portée flash:
Faces.setFlashAttribute("car", car);
C'est disponible dans le @PostConstruct
de la prochaine fève comme:
Car car = Faces.getFlashAttribute("car");
ou, si vous ne faites que naviguer, mettez - le dans la portée de la requête:
Faces.setRequestAttribute("car", car);
C'est disponible dans le @PostConstruct
de la prochaine fève comme:
Car car = Faces.getRequestAttribute("car");
voir aussi:
- "L'injection D'une vue scoped bean dans une autre vue scoped bean cause it to be recreated
- Comment passer des objets d'une page à une autre page dans JSF sans écrire un convertisseur
notez que je suppose que vous êtes très au courant du choix de conception d'avoir deux entièrement séparé vues qui ne peuvent pas exister (être idempotent) sans l'autre vue, au lieu d'avoir par exemple une vue unique avec un contenu Rendu conditionnel. Et que vous savez déjà comment exactement la vue devrait se comporter quand elle est effectivement demandée idempotently (i.e. via un signet, un lien partagé, par un searchbot, etc). Si non, alors je recommande fortement de lire attentivement la réponse à cette question: comment naviguer dans JSF? Comment faire pour que L'URL reflète la page actuelle (et non la précédente) .
mise à jour: si vous n'utilisez pas OmniFaces, utilisez respectivement:
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("car", car);
Car car = (Car) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("car");
FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("car", car);
Car car = (Car) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("car");