JSF/Primefaces - bouton de commande: ouvrir de nouveaux onglets du navigateur sans ViewScoped bean se faire tuer
Je suis en train d'ouvrir un nouvel onglet dans le navigateur avec une vue JSF (dans un portlet, déployé dans Liferay) à partir d'un point de vue soutenu par une ViewScoped
bean. À l'aide d'une action normale de redirection tue le haricot.
J'ai essayé la méthode fournie ici et ici, mais malheureusement sans succès.
Le bouton est plus ou moins comme ceci:
<p:commandButton value="#{msg.label}" onclick="target='_blank'"
action="#{sessionScopedBean.action(param)}" ajax="false" />
Le déplacement de la target='_blank'
à la forme de l'attribut n'a pas aidé. J'ai essayé tous deux de retour null
et void
, sans succès. Modification de l'ajax true
cassé la navigation, n'est-ce pas ouvrir un nouvel onglet, mais aussi ne pas tuer le ViewScoped
bean.
La action
méthode contenu ressemble à ceci:
public void action(String param) throws IOException {
//some business logic
FacesContext.getCurrentInstance().getExternalContext().redirect("viewName.xhtml");
}
La vue ne contient pas de balise gestionnaires comme <c:if test="...">
ou <ui:include src="...">
. Il contient un <ui:repeat id="..." value="#{viewScopedBean.collection}"
tag, mais de l'enlever changé de noter.
var="..." varStatus="...">
Le formulaire est joint en <ui:composition>
et <ui:define>
balises.
Le point de vue, je rediriger vers a aucun lien avec la ViewScoped bean. Des idées? 🙂
OriginalL'auteur MarcelK | 2013-09-03
Vous devez vous connecter pour publier un commentaire.
La portée de vue cassé parce que vous êtes avec la redirection d'action fondamentalement demandant au client de feu d'une marque nouvelle requête GET sur l'URL donnée. Vous devriez plutôt être de retour
null
ouvoid
, et à condition de rendre les résultats dans le même vue.Voir aussi:
La solution a déjà été donnée dans les liens que vous avez trouvé: mettre les données de l'intérêt dans le flash de la portée avant de rediriger l'obtenir à partir du flash la portée du bean associé à la cible de vue. Si cela ne fonctionne pas pour vous, pour quelque raison, une autre solution serait de générer une clé unique (
java.util.UUID
peut-être?) et de le stocker dans la session champ d'application que la clé associée à certaines données que vous souhaitez conserver dans l'redirigé demande,et de passer ensuite que la clé en tant que paramètre de la requête dans l'URL de redirection
de sorte que vous pouvez dans le postconstruct de la fève associés à la cible en vue d'obtenir les données:
Je n'ai pas vu ces liens. Les réponses à ces liens suggère d'utiliser le flash la portée de cette. L'utilisation du flash la portée est en effet aussi une façon, cela a essentiellement le même effet que ci-dessus séance d'approche. Mais après un temps, je sais que le flash portée a quelques questions en combinaison avec certaines Mojarra versoins et que vous êtes à l'aide d'un portlet (qui est un très restrictive de l'environnement), je voulais juste exclure des problèmes avec flash portée.
Ok, donc c'est impossible de tricher avec le système et de faire ViewScoped bean survivre à une redirection dans un nouvel onglet? J'ai eu cette idée parce que vous avez écrit "en Effet, la vue étendue de haricots dans le premier onglet/fenêtre se faire tuer par le retour d'un
String
de navigation en cas de résultats. Vous désirez retournernull
ouvoid
de la garder vivante." et les gens d'abord écrit sur les données manquantes au moment de retourner sur le premier onglet 🙂Vue l'étendue de haricots vit aussi longtemps que la vue JSF. Une vue JSF vie aussi longtemps que vous êtes postbacking pour le même point de vue (en retournant
null
/void
). Une fois que vous envoyez une redirection (ce qui est totalement indépendamment de la cible dans le même ou un nouvel onglet), puis la vue est détruite. Juste retournull
ouvoid
, et à condition de rendre les résultats dans la même vue. Il va travailler (c'est aussi complètement indépendamment de la cible dans le même ou un nouvel onglet).Donc, pour résumer les choses: le vide/null méthode ne fonctionnera que si les Visages.redirect() est de la même vue, mais l'habitude si c'est pour une autre. Il n'est donc pas un moyen de contourner le ViewScoped bean comportement. Je vais essayer une autre façon de traiter avec ce bug dans le code héritage (comme vous l'avez suggéré). Merci pour votre réponse. Comme pour la deuxième partie de votre (maintenant édité) réponse, il n'était pas ce que j'ai essayé de faire (la transmission des données à la nouvelle vue de haricots n'était pas un problème). Le problème était de perdre des données dans le premier point de vue, qui était encore actif à partir du point de vue utilisateur.
OriginalL'auteur BalusC