Bonjour à tous.

Plutôt confirmé en Struts1, j'ai voulu passer à Struts2 et j'ai encore quelques problèmes de compréhension apparemment.

Tout d'abord : A quoi servent les "packages" dans le fichier struts.xml ?
Je pensais déclarer plusieurs packages pour définir deux "groupes" d'actions qui auraient eu une liste d'intercepteurs différente.

Groupe d'action n°1 : les actions ne nécessitant pas que l'utilisateur soir connecté. (par exemple l'action qui permet de se connecter)

Groupe d'action n°2 : les actions nécessitant que l'utilisateur soit connecté.

Pensant que les packages servaient à ce genre de choses j'ai donc écrit mon struts.xml comme suit :

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
41
42
43
44
45
46
47
48
49
50
51
52
 
<struts>
	<package name="default" extends="struts-default">
		<!-- =============================================================== -->
		<!--   ACTIONS NE NECESSITANT PAS QUE L UTILISATEUR SOIT CONNECTE    -->
		<!-- =============================================================== -->
 
		<action name="login" class="authenticateAction" method="login">
			<result name="success">home.jsp</result>
			<result name="error">login.jsp</result>
		</action>
 
		<action name="logout" class="authenticateAction" method="logout">
			<result name="success">login.jsp</result>
			<result name="error" >error.jsp</result>
		</action>
 
	</package>
 
 
	<package name="connected" extends="default">
		<!-- =============================================================== -->
		<!--                       INTERCEPTORS                              -->
		<!-- =============================================================== -->
		<interceptors>
			<interceptor name="security" class="blabla.SecurityInterceptor"/>
			<interceptor-stack name="myStack">
				<interceptor-ref name="security">
					<param name="accreditationLevel">user</param>
				</interceptor-ref>
				<interceptor-ref name="defaultStack"/>
			</interceptor-stack>
		</interceptors>
 
		<!-- Définition de la liste des intercepteurs par défaut à utiliser dans
		ce package -->
		<default-interceptor-ref name="myStack"/>
 
 
		<!-- =============================================================== -->
		<!--                           ACTIONS                               -->
		<!-- =============================================================== -->
 
		<action name="home" class="homeAction">
			<result name="success">home.jsp</result>
			<result name="error">error.jsp</result>
		</action>
 
		[...]
 
    </package>
</struts>
Mais apparemment j'ai dû mal comprendre parce qu'ici quand j'essaie d'accéder à l'action "login", l'intercepteur security est quand même appelé alors que celui-ci n'est même pas déclaré dans le package "notConnected".
J'en conclus que quand on définit un default-interceptor-ref dans un package, il s'applique à toutes les actions de tous les packages. Ce qui est très frustrant.

On arrive donc à ma deuxième question : Comment dire à struts d'appliquer deux piles d'intercepteurs différentes à deux groupes d'actions ?

Je peux toujours déclarer mes intercepteurs à la main pour chaque action, mais c'est un truc à les oublier une fois sur deux...