VII. Exemple 05B - Navigation dans un formulaire de saisie▲
Nous étudions un formulaire présentant plusieurs boutons pour soumettre (submit) les données saisies à une action.
VII-A. Le projet Netbeans▲
Le projet Netbeans est le suivant :
Les éléments du projet sont les suivants :
- [DoSomething.jsp] : l'unique vue de l'application qui présente les trois boutons de navigation ainsi qu'un lien.
- [DoSomething.java] et [DoSomethingElse.java] : les deux actions du projet
- [messages.properties] : le fichier des messages internationalisés
- [struts.xml] : le fichier de configuration Struts 2
VII-B. Configuration▲
Le fichier [struts.xml] suivant configure l'application :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<!
DOCTYPE
struts
PUBLIC
"
-//Apache
Software
Foundation//DTD
Struts
Configuration
2.0//EN
"
"
http://struts.apache.org/dtds/struts-2.0.dtd
"
>
<
struts
>
<
constant
name
=
"
struts.custom.i18n.resources
"
value
=
"
messages
"
/
>
<
package
name
=
"
actions
"
namespace
=
"
/actions
"
extends
=
"
struts-default
"
>
<
action
name
=
"
DoSomething
"
class
=
"
actions.DoSomething
"
>
<
result
name
=
"
success
"
>
/vues/DoSomething.jsp<
/
result
>
<
/
action
>
<
action
name
=
"
DoSomethingElse
"
class
=
"
actions.DoSomethingElse
"
>
<
result
name
=
"
success
"
>
/vues/DoSomething.jsp<
/
result
>
<
/
action
>
<
/
package
>
<
/
struts
>
- l'action [/actions/DoSomething] provoquera l'instanciation de la classe [actions.DoSomething] et sa méthode execute sera exécutée par défaut. Ce défaut peut être annulé si les paramètres passés à l'action [Something] précisent une autre méthode. Quelque soit la méthode exécutée, elle devra rendre la clé de navigation success puisque seule cette clé a été définie. La vue [DoSomething.jsp] sera alors affichée.
- la configuration de l'action [/actions/DoSomethingElse] est identique.
VII-C. Le fichier des messages▲
Le fichier des messages [messages.properties] est le suivant :
2.
3.
4.
5.
6.
formulaire.titre1=Actions et M\u00e9thodes
formulaire.titre2=Actions et M\u00e9thodes
formulaire.execute=DoSomething.execute
formulaire.action1=DoSomething.action1
formulaire.action2=DoSomethingElse.action2
formulaire.action3=DoSomething.action3
VII-D. La vue [DoSomething.jsp]▲
La vue [DoSomething.jsp] est la suivante :
Son code est le suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<
%
@
page
contentType
=
"
text/html
"
pageEncoding
=
"
UTF-8
"
%
>
<
%
@
taglib
prefix
=
"
s
"
uri
=
"
/struts-tags
"
%
>
<!
DOCTYPE
html
>
<
html
>
<
head
>
<
meta
http-equiv
=
"
Content-Type
"
content
=
"
text/html;
charset=UTF-8
"
>
<
title
>
<
s
:
text
name
=
"
formulaire.titre1
"
/
>
<
/
title
>
<
/
head
>
<
body
>
<
h1
>
<
s
:
text
name
=
"
formulaire.titre2
"
/
>
<
/
h1
>
<
s
:
form
action
=
"
DoSomething
"
>
<
s
:
submit
key
=
"
formulaire.execute
"
/
>
<
s
:
submit
key
=
"
formulaire.action1
"
method
=
"
action1
"
/
>
<
s
:
submit
key
=
"
formulaire.action2
"
action
=
"
DoSomethingElse
"
method
=
"
action2
"
/
>
<
/
s
:
form
>
<
s
:
url
id
=
"
url
"
action
=
"
DoSomething
"
method
=
"
action3
"
/
>
<
s
:
a
href
=
"
%{url}
"
>
<
s
:
text
name
=
"
formulaire.action3
"
/
>
<
/
s
:
a
>
<
/
body
>
<
/
html
>
- ligne 11 : le formulaire sera posté à l'action [DoSomething]. Cela ne veut pas forcément dire que c'est cette action qui va être déclenchée. Cela dépend du bouton submit utilisé pour le POST.
- ligne 12 : le bouton submit ne précise ni action, ni méthode. Ce sera l'action [DoSomething] précisée par la balise <form> qui sera instanciée. La méthode exécutée sera celle définie dans le fichier [struts.xml], la méthode execute.
- ligne 13 : le bouton submit précise une méthode. Ce sera l'action [DoSomething] précisée par la balise <form> qui sera instanciée. La méthode exécutée sera la méthode action1.
- ligne 14 : le bouton submit précise une action et une méthode. Ce sera l'action [DoSomethingElse] qui sera instanciée. La méthode exécutée sera la méthode action2.
- lignes 16-17 : un lien vers l'action [DoSomething] et la méthode action3. L'action [DoSomething] sera instanciée et sa méthode action3 exécutée. Contrairement aux boutons submit, le clic sur le lien ne provoque pas un POST mais un GET. Il n'y a donc aucun paramètre posté.
Le code Html généré par ce code, lorsqu'on demande l'Url [http://localhost:8084/exemple-05B/actions/DoSomething.action] est le suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<!
DOCTYPE
html
>
<
html>
<
head>
<
meta
http-equiv
=
"
Content-Type
"
content
=
"
text/html;
charset=UTF-8
"
>
<
title>
Actions et Méthodes<
/
title>
<
/
head>
<
body>
<
h1>
Actions et Méthodes<
/
h1>
<
form
...
action
=
"
/exemple-05B/actions/DoSomething.action
"
method
=
"
post
"
>
...
<
input
type
=
"
submit
"
...
name
=
"
formulaire.execute
"
value
=
"
DoSomething.execute
"
/
>
...
<
input
type
=
"
submit
"
...
name
=
"
method:action1
"
value
=
"
DoSomething.action1
"
/
>
...
<
input
type
=
"
submit
"
...
name
=
"
action:DoSomethingElse!action2
"
value
=
"
DoSomethingElse.action2
"
/
>
...
<
/
form>
...
<
a
href
=
"
/exemple-05B/actions/DoSomething!action3.action
"
>
DoSomething.action3<
/
a>
<
/
body>
<
/
html>
- ligne 9 : la balise form du formulaire Html. L'attribut action indique l'Url à laquelle seront postés les paramètres du formulaire. Cette Url est celle de l'action [DoSomething].
- lignes 11, 13, 15 : les attributs name des boutons seront postés à l'action cible du bouton submit. C'est ce qui permet à Struts de déterminer l'action à instancier et la méthode à exécuter.
- ligne 13 : l'attribut name=method:action1 indique que la méthode DoSomething.action1 doit être exécutée.
- ligne 15 : l'attribut name= action:DoSomethingElse!action2 indique que la méthode DoSomethingElse.action2 doit être exécutée.
- ligne 11 : l'attribut name= formulaire.execute ne précise ni action, ni méthode. C'est donc la méthode DoSomething.execute qui sera exécutée.
- ligne 19 : le lien demande explicitement l'exécution de la méthode DoSomething.action3
VII-E. Les actions▲
L'action [DoSomething] est la suivante :
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.
package
actions;
import
com.opensymphony.xwork2.ActionSupport;
public
class
DoSomething extends
ActionSupport {
public
DoSomething
(
) {
System.out.println
(
"
DoSomething
"
);
}
@
Override
public
String execute
(
) {
System.out.println
(
"
DoSomething.execute
"
);
return
SUCCESS;
}
public
String action1
(
) {
System.out.println
(
"
DoSomething.action1
"
);
return
SUCCESS;
}
public
String action3
(
) {
System.out.println
(
"
DoSomething.action3
"
);
return
SUCCESS;
}
}
- les méthodes execute, action1 et action3 écrivent sur la console du serveur web et rendent la clé de navigation success.
- ligne 8 : le constructeur écrit également sur la console du serveur web
Les différentes écritures sur la console permettent de savoir quelles méthodes sont exécutées lors d'une requête.
L'action [DoSomethingElse] est similaire :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
package
actions;
import
com.opensymphony.xwork2.ActionSupport;
public
class
DoSomethingElse extends
ActionSupport {
public
DoSomethingElse
(
) {
System.out.println
(
"
DoSomethingElse
"
);
}
@
Override
public
String execute
(
) {
System.out.println
(
"
DoSomethingElse.execute
"
);
return
SUCCESS;
}
public
String action2
(
) {
System.out.println
(
"
DoSomethingElse.action2
"
);
return
SUCCESS;
}
}
VII-F. Les tests▲
Les tests montrent les résultats suivants (sur la console du serveur web) :
- lors d'un clic sur le bouton [DoSomething.execute], l'action [DoSomething] est instanciée et sa méthode execute exécutée.
- lors d'un clic sur le bouton [DoSomething.action1], l'action [DoSomething] est instanciée et sa méthode action1 exécutée.
- lors d'un clic sur le bouton [DoSomethingElse.action2], l'action [DoSomethingElse] est instanciée et sa méthode action2 exécutée.
- lors d'un clic sur le lien [DoSomething.action3], l'action [DoSomething] est instanciée et sa méthode action3 exécutée.