IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

@keepAlive & <redirect />


Sujet :

JSF Java

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut @keepAlive & <redirect />
    Bonjour,

    Comment peut-on contourner le fait que le @keepAlive ne fonctionne pas lorsque la balise <redirecte/> est présente dans le navigationCase avec un bean en request?

    Je m'explique:
    Je veux implémenter une fonctionnalité qui est composée de plusieurs étapes (pages). toutes les étapes utilisent le même managed-bean qui est en scope request avec une annotation @keepAlive.

    ça marche quand:
    1-) managed-bean en scope session && <redirecte/>.
    2-) managed-bean en scope request sans le redirecte <redirecte /> ?
    mais ça ne fonctionne pas si le bean et en request et qu'il y a un redirecte dans le faces-config


    Quelqu'un aurait une idée de la façon dont on peut contourner ce problème ?

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Par défaut
    Ce n'est pas un problème, c'est le comportement normal...

    Pourquoi veux-tu pouvoir faire un redirect et utiliser ce composant ?
    L'utilisation normal c'est une déclaration dans la request et l'objet est propagé de requête en requête... si tu fais un redirect, tu casses la succession des requêtes donc ça ne fonctionnera plus c'est certain.
    Rien ne sert d'utiliser ce composant si tu met ton bean en session... puisqu'il n'y aura jamais qu'une seule instance de ton bean.

    La solution si tu dois obligatoirement faire un redirect, c'est de mettre l'objet qui t'intéresse dans la session avant l'appel et de le récupérer ensuite (je me sers de cette solution notamment pour les affichages dans des servlets).

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    j'ai rajouté le <redirecte /> juste pour que l'URL soit mise à jour dans le navigateur. j'ai remarqué que ce n'est pas le cas si je ne mets pas de redirecte.

    Et puis, J'aimerais éviter de passer par le scope session.

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu peux expliquer ce qui ne marche pas?? le bean est réinitialisé?

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Oui, le bean est réinitialisé malgré le @keepAlive

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par soucine Voir le message
    Oui, le bean est réinitialisé malgré le @keepAlive
    et pourquoi ça ne marche pas, tu change de page, le keepalive est fait pour pouvoir utiliser un bean entre plusieurs requete ajax, si tu change de page, c'est comme un nouveau context.
    D'ailleurs dans JSF 2.0, il y'a un nouveau scope: page dont le fonctionnement est similaire à keepAlivE.

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 154
    Par défaut
    Quand tu utilises redirect, tu créés une nouvelle request... Ça équivaut à cliquer sur un lien.

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Dans ce cas, Est-ce qu'il y aurait une autre façon que le <redirecte /> pour que l'URL soit mise à jour dans le navigateur ?

  9. #9
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu peux montrer le code qui cause tous ce problème?

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    ça ressemble à ça:

    page1.jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
     
    <h:form>
    	testValue= <h:inputText value="#{myBean.testValue}" />
    	<h:commandButton action="#{myBean.traiterValue}"  value="goToNextPage" />
    </h:form>
    page2.jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
     
    <h:outputText value="#{myBean.testValue}" />
    MyBean.java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    @KeepAlive
    public class MyBean {
    	private String testValue = "default";
     
    	public MyBean(){
    		System.out.println("MyBean");
    	}
     
    	public String getTestValue() {
    		return testValue;
    	}
     
    	public void setTestValue(String testValue) {
    		this.testValue = testValue;
    	}
     
    	public String traiterValue() {
    		testValue = "Valeur saisie= " + testValue;
    		System.out.println("testValue= " + testValue);
    		return "etape_2";
    	}
    }
    faces-config.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?xml version="1.0" encoding="UTF-8"?>
    <faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
    	xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
    	...
    	<managed-bean>
    		<managed-bean-name>myBean</managed-bean-name>
    		<managed-bean-class>myPackage.MyBean</managed-bean-class>
    		<managed-bean-scope>request</managed-bean-scope>
    	</managed-bean>
    	...
    	<navigation-rule>
    		<from-view-id>/page1.jsf</from-view-id>
    		<navigation-case>
    			<from-outcome>etape_2</from-outcome>
    			<to-view-id>/page2.jsf</to-view-id>
    			<redirect />
    		</navigation-case>
    	</navigation-rule>
    	...

  11. #11
    Membre éclairé Avatar de VirageGroup
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 81
    Par défaut
    bonjour,

    Effectivement c'est le comportement normal. Mais cela reste un problème.

    Il me semble que SEAM et sa gestion de scope permet d'y pallier.
    Sinon, il faut passer par un hack maison du même style que celui du problème du "redirect et des messages JSF":
    Il faut sauver temporairement les bean "keepalived" dans la session.
    Concrètement, dans la phase avant le redirect (je ne sais plus laquelle) il faut mettre ces beans en session.
    Puis dans le before restore view, récupérer ces beans pour les restaurer dans la request Map.

    Pour la petite histoire, le <redirect> est aussi nécessaire pour RichFaces si on veut pouvoir générer des requêtes de type: une requête ajax provoque une réponse non ajax.

    VG.

Discussions similaires

  1. [VB.NET]Double redirection.
    Par CammCamm dans le forum ASP.NET
    Réponses: 9
    Dernier message: 24/11/2003, 15h11
  2. [VB6] probleme de redirection d'une commande DOS
    Par WriteLN dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/06/2003, 09h36
  3. [reseaux] redirection de flux
    Par Olive1808 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 12/08/2002, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo