2010-12-06 4 views
4

Je crée une interface de type assistant composée de 3 pages jsp et de 3 actions Struts utilisant Struts 1.3. Le flux est comme suit: page1> action1 -> page2> action2 -> page3> action3Le bean de formulaire de session Struts ne conserve pas l'état

J'utilise un bean de formulaire de session (un formulaire d'action avec la portée de session) pour partager des données entre les demandes. Le problème que j'ai est que les données que j'ai soumis dans la page2 sont disponibles dans l'action 2, mais pas dans l'action 3. Je doute qu'il pourrait être je n'ai pas un formulaire sur page3 pour tenir ces données, ou parce que j'appelle action3 via jQuery post méthode au lieu d'un formulaire régulier soumettre, mais je ne suis vraiment pas sûr.

J'ai creusé tout l'Internet pendant presque une journée et toujours pas de chance. Quelqu'un pourrait-il offrir de l'aide? Merci beaucoup.

+0

Est-ce Struts 1? –

+1

Oui, c'est struts 1.3 – Sandeep

+0

stockez-vous vos sessions dans le formulaire 'request.getSession(). SetAttribute (KEY, VALUE)'? –

Répondre

0

Comment accédez-vous au bean formulaire de la page2 dans action2 ainsi que dans action3.
Je suppose que vous accédez au mauvais chemin. Obtenez-vous une exception concernant invalidCast ou quelque chose.

+0

Dans la classe d'action, j'accède à mon formulaire comme ceci: MyForm myForm = (MyForm) form; Aucune exception n'a été levée et, dans l'action 2, j'ai pu obtenir les données correctes. c'est-à-dire myForm.getName(). Mais avec le même code dans action3, toutes les propriétés sont vidées, comme si une nouvelle instance de mon formulaire avait été créée. – Sandeep

5

Je suppose que vous avez peut-être assigné un même formulaire à la fois à l'action dans StrutsConfig.xml et par conséquent, il ne donne pas l'exception ClassCastException. Soit dit en passant, si vous souhaitez accéder à la même forme haricot qui a été rempli sur l'action 2 choses, procédez comme suit

  1. Regardez le strutsConfig fichier pour ActionMapping des deux actions (2 et 3) . Conservez le nom du formulaire différent pour une action distincte (par exemple, form2 pour action2 et form3 pour action3).
  2. En Action3, au lieu de la coulée de la forme, utilisez cette form2 = (FormBean2) session.getAttribute("form2");

La raison ci-dessus, puisque les deux actions utilisent la même forme, entretoises pourraient avoir l'écraser. Espérons que ci-dessus va résoudre votre problème.

+0

Merci, j'ai résolu mon problème. Je souhaite que Struts offre une façon plus simple de faire une chose si simple :-) – Sandeep

1

Merci pour toutes vos contributions. Voici comment j'ai résolu mon problème. Je n'aime pas vraiment cette solution, mais c'est peut-être la plus belle que je puisse trouver.

Dans la page 3 j'ai ajouté des champs cachés pour toute propriété que je veux être disponible dans l'action 3. Struts stockera les valeurs dans ce champ caché et quand le formulaire est soumis à nouveau, les données seront alors ranimées au formulaire d'action.

Il me semble que Struts fonctionne comme ceci: quand il charge la page 3, il essaie de remplir le formulaire de la page 3 avec les valeurs de myForm. Lorsque le formulaire est soumis, le processus est inversé, il remplit myForm avec des valeurs du formulaire de l'utilisateur. Le problème est que, avant de remplir myForm avec des valeurs soumises par l'utilisateur, il réinitialise les propriétés de myForm. Et parce qu'après la réinitialisation, il ne trouve pas la valeur de ces champs, il le laisse vide.

Je ne pense pas qu'il soit logique que Struts fonctionne de cette façon, mais ... que ce soit.

4

La méthode reset() sur le formulaire est appelée avec chaque requête et vous perdez donc l'état. Vous pouvez contrôler cela par programme.

public class MyForm extends ActionForm { 
    boolean reset = true; 
    private String[] checkboxes = {}; 

    @Override 
    public void reset(ActionMapping mapping, HttpServletRequest request) { 
     if (reset) { 
      this.checkboxes = new String[]; 
      // etc 
     } 

     reset = true; 
    } 

    public void doNotReset() { 
     reset = false; 
    } 
} 

Appelez doNotReset() sur le formulaire.

Questions connexes