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

Struts 1 Java Discussion :

ActionForm ne marche plus lorsque je revenir sur une page en arriere


Sujet :

Struts 1 Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut ActionForm ne marche plus lorsque je revenir sur une page en arriere
    Bonjour,

    Je dois impérativement pouvoir revenir sur une page.
    pour cela je fais

    <html:img src="/plsvista/config/retour.jpg" onclick="history.back();"/>

    sur ma page jsp.

    Lorsque je suis revenu sur ma page et que je relance l'action et que je recupere ma form par un get , elle n'a plus la même valeur.

    Comment revenir en arrière ?

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut suite du probleme
    j'ai trouvé une solution mais elle m'oblige à refaire un traitement assez long ou à déclarer un variable statique.
    pas très propre ...

    J'ai aussi trouvé un framework qui peut s'avérer utile mais sans garantie de fonctionnement :

    http://www.manfred-wolff.de/struts/a...owTo-Back.html


  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut Es-ce vrai que Struts ne gere pas les history.back() ?
    Bonjour,
    encore moi,

    Es-ce que Struts ne gere pas les retour sur une page d'action ?
    Où es-ce moi qui gère mal les contextes et qui ne gère pas les session ?
    Si quelqu'un a eu le même problème , merci de votre réponse.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    quand tu clic sur ton history.back() tu recuperes bien les memes valeurs dans les champs de ton form ? ce n'est qu'une action javascript (donc coté client, ça n'a aucun impact sur l'action du serveur, l'action struts associée)
    c'est au moment de revalider ton formulaire que tu perds les valeurs ?

    faudrait voir ton code et ficher de configuration struts pour se faire une idée, moi j'viens de tester sur exemple simple et j'ai pas ce probleme (peut etre trop simple aussi mon test ^^ )

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Merci de ta réponse.
    Lorsque je fais history.back() je recupere le bon form avec les bonnes valeurs.
    Mais lorsque je relance une action sur ce formulaire il me fait des traitements sur les valeurs contenues dans mon actionForm.
    Peut être je devrais utiliser un form bean dans mon actionForm.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    J'ai résolu mon probleme en ajoutant un framwork trouvé sur ce site : http://www.manfred-wolff.de/struts/articles/index.html


    Malheureusement , sur internet c'est tres peu écrit que Struts ne supporte pas le Back Button pour revenir en arrière sur un navigateur.

    Heureusement qu'il existe ce site de Mandfred Wolff !

    Je peux vous assurer que si on relance une action apres avoir fait un back sur son navigateur , Struts a en cache n'importe quoi et avant que débute votre action Struts me lancait trois lignes de commandes qui venait d'une autre action.

  7. #7
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut
    Il n'y a pas de raison pour que tu ai des problèmes dans tes actions Struts, si tu geres correctement les contextes de session.

    Pour t'en persuader, tu n'as qu'a mettre un point d'arret dans ton action et faire un Back navigateur. Il te recharge normalement ton action. Si ca n'est pas le cas, il faut que tu penses a mettre une balise meta dans ton header HTML pour forcer le no-cache.
    Etre c'est etre relatif.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut tags meta
    Merci de ta réponse.
    De quels tags Meta parle-tu ?

    Actuellement j'ai intégrer le framework trouvé sur lme site Manfred Wollf :
    http://www.manfred-wolff.de/struts/articles/index.html
    et je gère les retour par un button submitt dans ma page en désactivant le bouton back du navigateur par un javascript.
    J'ai aussi ajouté un script javascript pour que le boutton ne puiise être lancé qu'une fois car cela posait probleme si on cliquait deux fois.

    Mais cette solution n'est pas idéale et je crains que mon chef de projet ne demande à ce que je doive gérer les retour par le browser.
    D'ailleurs n'est-ce pas le rôle de Struts ?

    j'ai trouvé sur internet qu'il fallait peut -être mettre :
    ces lignes dans struts-config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        <init-param>
          <param-name>nocache</param-name>
          <param-value>true</param-value>
        </init-param>
    ou ajouter dans l'action précédente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    response.addHeader("Pragma","no-cache"); 
    response.addHeader("Cache-control","no-cache");
    Merci encore pour ta réponse

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut
    il existe bien ces balises :

    META http-equiv="Pragma" content="no-cache"
    META http-equiv="Cache-Control" content="no-cache, must-revalidate" META http-equiv="Expires" content="0"

    mais es-ce qu'elle existent avec les tags ?

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut Test
    J'ai rajouté sur les deux pages
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <HEAD>
    <META Http-Equiv="Cache-Control" Content="no-cache">
    <META Http-Equiv="Pragma" Content="no-cache">
    <META Http-Equiv="Expires" Content="0"> 
    </HEAD>
    Lorsque je reviens sur A j'ai les bonnes données sur la page
    Mais lorque je relance B avant les traces de mon action B que je trace j'ai 4 instructions qui viennent du cache.

  11. #11
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut
    Si tu étais un peu plus précis ca pourrait aider, montre nous du code.

    Et merci de mettre ton code dans des balises [CODE] (le signe #).
    Etre c'est etre relatif.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut Code et traces de l'erreur
    Bonjour ,

    Tout d'abord je passe dans l'action afficheFiltre de ErreurFiltreAction extends DispatchAction

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
     
    public ActionForward afficheFiltre(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)throws Exception {
     
    	System.out.println("ON ENTRE DANS afficheFiltre");
    	ErreursForm lc_form = (ErreursForm) form;
    	String name = lc_form.getName();
    	System.out.println("Valeur de name : " + name);	
    	lc_form.setName(name);
    	request.setAttribute("name",name);
    	ArrayList errFiltre = lc_form.getListeErrFiltre();
    	ArrayList errTotale = lc_form.getListeErrTotales();
    	lc_form.setListeErrTotales(errTotale);
    	String filtre = lc_form.getFiltre();
    	request.setAttribute("filtre",""+filtre);
    	Map allTheNews = new Hashtable();
     
    	int erreurId = 1;
    	Iterator it = errFiltre.iterator();
    	        while (it.hasNext()) {
    	         com.plsvista.javabeans.Erreur e =  (com.plsvista.javabeans.Erreur) it.next();
    	         e.setChecked(false);
    	         String l_id = String.valueOf(erreurId);
    	         allTheNews.put(l_id, e);
                          erreurId++;
                          }
     
     
    	ArrayList lc_subjects = new ArrayList(allTheNews.values());
    	// Create a new datagrid;
    	DatagridImpl lc_datagrid = (DatagridImpl) DatagridImpl.getInstance();
    	// Initialize the datagrid and the form.
    	lc_datagrid.setData(lc_subjects);
    	lc_datagrid.setDataClass(Erreur.class);
    	lc_form.setErreurs(lc_datagrid);	
    	// Forward to the jsp.
    	System.out.println("Derniere ligne de afficheFiltre");
    	return mapping.findForward("errFiltre");
    }
    puis je lance l'action saveFiltre de ErreurFiltreAction extends DispatchAction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public ActionForward saveFiltre(ActionMapping mapping,
    ActionFormform,HttpServletRequest request, HttpServletResponse response) throws Exception {
                 System.out.println("ON ENTRE DANS saveFiltre : 1ere ligne ");
                 ...
                 // Forward to the jsp
                 System.out.println("Derniere ligne de saveFiltre");
                 return mapping.findForward("auMoins");
    }
    Si je reviens en arrière par history.back() ou par le bouton Back du navigateur (je retrouve ma page correct) mais lorsque je relance à nouveau saveFiltre , je passe dans du code qui n'a rien à voir avec ces deux actions

    Pour être plus clair voici les traces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ON ENTRE DANS afficheFiltre
    Valeur de name : cewe
    Derniere ligne de afficheFiltre
    ON ENTRE DANS saveFiltre : 1ere ligne 
    Derniere ligne de saveFiltre (ici je reviens en arriere rien ne se passe)
                                         (ici je relance saveFiltre)
    ON PASSE DANS setNumBL de la classe Erreur*******
    ON PASSE DANS setNumBL de la classe Erreur******* 
    ON ENTRE DANS saveFiltre : 1ere ligne 
    Derniere ligne de saveFiltre
    Normalement il devrait passer directement à

    (ici je reviens en arriere rien ne se passe)
    (ici je relance saveFiltre)
    ON ENTRE DANS saveFiltre : 1ere ligne
    Derniere ligne de saveFiltre

    Les traces viennent de la methode setNumBL de la classe Erreur que j'ai tracé par un println : (Aucune raison d'être appelé lorsque je lance saveFiltre ! )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void setNumBL(String numBL) {
                 System.out.println("ON PASSE DANS setNumBL de la classe Erreur   ******* ");
    	this.numBL = numBL;
    	}

  13. #13
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut
    Il manque des choses la :

    afficheFiltre est appelé ou ?

    Quel est la tête de ton struts-config.

    Tu n'as qu'une seule Action au final?
    Etre c'est etre relatif.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut L'appel à seveFiltre
    J'ai plusieurs Actions , mais là je n'en utilise qu'une seule c'est une DispatchAction : j'appelle successivement afficheFiltre , saveFiltre , je fais un back et je rappelle saveFiltre.

    Voici la définition de mon Action ErreurAction et de mon form-bean dans mon Struts-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
     
             <action
                path="/erreurFiltre"
                type="com.plsvista.actions.ErreurFiltreAction"
                parameter="reqCode"
                name="erreursForm"
                attribute="erreursl"
                validate="false">
                <forward name="errFiltre"  path="/pages/resultErreurFiltre.jsp"/>
                <forward name="pbErreurFiltre" path="/pages/resultErreurLiees.jsp"/>
                <forward name="intDiffuseurReussie"  path="/pages/intErreur.jsp"/>
                <forward name="auMoins"  path="/pages/resultAumoins.jsp"/>
            </action>
     
            <form-beans>
         <form-bean name="erreursForm"type="com.plsvista.forms.ErreursForm"/>
            </form-beans>
    L'appel à saveFiltre se fait depuis ma page.jsp (celle sur laquelle je reviens par le back ) :

    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
     <layout:form action="/erreurFiltre" reqCode="saveFiltre" width="1000"> 
    	<layout:datagrid property="erreurs" styleClass="DATAGRID" model="datagrid">
      	<layout:datagridColumn title="erreur.numBL" property="numBL"/>
    	<layout:datagridColumn title="erreur.date" property="date" />
    	<layout:datagridColumn title="erreur.codeDiffuseur" property="codeDiffuseur"/>
    	<layout:datagridColumn title="erreur.codeArticle" property="codeArticle"/>
    	<layout:datagridColumn title="erreur.typeErreur" property="typeErreur"/>
    	<layout:datagridColumn title="erreur.message" property="message" />
    	<layout:datagridCheckbox title="erreur.checked" property="checked"/>
     
    	</layout:datagrid>
    	<layout:formActions>
    		<layout:submit>Save</layout:submit>
    	</layout:formActions>
    	</layout:form>

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut
    Le seul moyen de re-lancer une action apres un back et de vider le Cache du Navigateur.
    Par Outils->Option Internet->vider les fichiers.

    Mais comment le faire depuis la page jsp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <%
    response.setHeader("Cache-Control","no-cache");
    response.setHeader("Pragma","must-revalidate");
    	%>
    ne vide pas le cache

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Points : 28
    Points
    28
    Par défaut
    J'ai trouvé :

    il faut ajouter nocache="true" dans les sous-elements controller de Struts.

    Si cet attribut vaut true, Struts ajoute à chaque réponse les en-têtes HTTP désactivant la mise en cache. La valeur par defaut est false.

    en l'ocurence dans le controller de Tiles :

    <controller
    processorClass="org.apache.struts.tiles.TilesRequestProcessor"
    nocache="true" />

    Peut-être ce n'est pas necessaire si l'on n'utilise pas Tiles.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. revenir sur une page sans l'actualiser
    Par ineskh dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2008, 14h31
  2. Revenir sur une page à un endroit précis
    Par toffff dans le forum Langage
    Réponses: 7
    Dernier message: 21/03/2007, 11h35
  3. ne pas pouvoir revenir sur une page en cliquant sur précédent
    Par sagopa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 06/11/2006, 01h10
  4. Comment jouer un clip lorsqu'on presse sur une touche
    Par jbidou88 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 04/05/2006, 08h21
  5. [FLASH 5]un bouton dans une image pour revenir sur une scene
    Par patato valdes dans le forum Flash
    Réponses: 7
    Dernier message: 28/04/2004, 20h21

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