Bonjour.

Je me pose des questions concernant l'enchainement de plusieurs actions avec Struts 2.

Aujourd'hui, j'ai une seule action (qui fonctionne correctement) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
        <action name="genererDmistInitiale" class="dmist.pages.dmist.PageDmistInitialeAction" method="preparationDmistInitiale">
		    <result name="success">/pages/dmist/pageDmistInitiale.jsp</result>
        </action>
dans laquelle j'exécute le code suivant :
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
 
public String preparationDmistInitiale() throws Exception
    {
 
		/*
		 * Selection des enregistrements à traiter		
		 */
 
		ActiviteDAO activiteDAO = new ActiviteDAO();
 
		List<Activite> listeActivite;
		listeActivite = activiteDAO.findByWhereAaMm(aa, mm);
		/*
		 * Calcul des taux de cotisation et de reduction
		 * avec MAJ de la base de données        
		 */
 
		activiteDAO.setAutoCommit(false);
		for (Activite activite : listeActivite)
		{
			activite.calculerCotisation();
			activiteDAO.update(activite);
		}
		activiteDAO.commit();
		activiteDAO.setAutoCommit(true);
 
		/*
		 * Création du fichier 
		 */
		DmistInit dmistInit = new DmistInit(aa,mm,listeActivite);
		dmistInit.genererDmistInitiale();
 
		/*
		 * Fin du traitement       
		 */
		addActionMessage(getText("error.dmistInitiale.traitementOK"));
		return SUCCESS;
    }
Mon idée aurait été de découper la méthode précédente en deux morceaux afin de pouvoir suivre l'évolution du traitement sur ma page JSP (en effet, aujourd'hui, j'arrive sur une nouvelle page uniquement au SUCCESS).

La première action aurait pu être :
- le chargement de l'objet listeActivite : listeActivite = activiteDAO.findByWhereAaMm(aa, mm);
- le calcul et la mise à jour en base : activite.calculerCotisation(); et activiteDAO.update(activite);

Une deuxième action qui ne s'occupe que de la création du fichier : new DmistInit(aa,mm,listeActivite); et dmistInit.genererDmistInitiale();

Il faudrait alors sortir le champ listeActivite pour le mettre en attribut de la classe et l'avoir alors dans les deux méthodes.

Au niveau de fichier xml, il faudrait faire quelquechose comme cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
<action name="actionA" class="dmist.pages.dmist.PageDmistInitialeAction" method="methodeA">
		    <result name="success" type="redirectAction">actionB</result>
</action>
<action name="actionB" class="dmist.pages.dmist.PageDmistInitialeAction" method="methodeB">
		    <result name="success">/pages/dmist/pageDmistInitiale.jsp</result>
</action>
J'ai alors les problèmes suivant :
- Avec le xml ci-dessus, cela ne me permet pas d'être sur une autre page jsp au moment du traitement de la seconde action (pour que l'utilisateur sache que l'action A est terminée et que l'action B est en cours
- Lors de l'appel à la seconde méthode, j'ai l'impression que Struts recrée une nouvelle instance de ma classe d'action. Mon champs listeActivite devient alors NULL.
Suis-je donc obligé de mettre à la fin de ma première action mon objet en session et de le récupérer lors de ma deuxième action (ou dans le prepare()) comme cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
session.put(LISTE_ACTIVITE, listeActivite);
...
 
listeActivite = (List<Activite>) getSession().get(LISTE_ACTIVITE);
ou le passage de paramètre ne peut-il pas se faire "tout seul" avec struts?

Merci d'avance pour votre aide