XV. Exemple 12 - Conversions et validations diverses▲
La nouvelle application présente la saisie de divers éléments disposant de validateurs Struts :
- en [1], le formulaire de saisie
- en [2], la confirmation des saisies
L'application a un fonctionnement similaire aux précédentes aussi ne commenterons-nous que les points qui diffèrent.
XV-A. Le projet Netbeans▲
Le projet Netbeans est le suivant :
- en [1], les vues de l'application
- [Accueil.jsp] : la page d'accueil
- [FormDivers.jsp] : le formulaire de saisie
- [ConfirmationFormDivers.jsp] : la page de confirmation
- en [2], le fichier des messages [messages.properties] et le fichier de configuration principal de Struts
- en [3] :
- [FormDivers.java] : l'action qui affiche et traite le formulaire
- [FormDivers-validation.xml] : les règles de validation de l'action [FormDivers]. Ce fichier délègue ces validations au modèle.
- [FormDiversModel] : le modèle de l'action [FormDivers]
- [ FormDiversModel-validation.xml] : les règles de validation du modèle
- [FormDiversModel.properties] : le fichier des messages du modèle
- [example.xml] : fichier de configuration secondaire de Struts
XV-B. La configuration du projet▲
Le projet est principalement configuré par le fichier [example.xml] suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?
xml
version="1.0"
encoding="UTF-8"
?
>
<!
DOCTYPE
struts
PUBLIC
"
-//Apache
Software
Foundation//DTD
Struts
Configuration
2.0//EN
"
"
http://struts.apache.org/dtds/struts-2.0.dtd
"
>
<
struts
>
<
package
name
=
"
example
"
namespace
=
"
/example
"
extends
=
"
struts-default
"
>
<
action
name
=
"
Accueil
"
>
<
result
name
=
"
success
"
>
/example/Accueil.jsp<
/
result
>
<
/
action
>
<
action
name
=
"
FormDivers
"
class
=
"
example.FormDivers
"
>
<
result
name
=
"
input
"
>
/example/FormDivers.jsp<
/
result
>
<
result
name
=
"
cancel
"
type
=
"
redirect
"
>
/example/Accueil.jsp<
/
result
>
<
result
name
=
"
success
"
>
/example/ConfirmationFormDivers.jsp<
/
result
>
<
/
action
>
<
/
package
>
<
/
struts
>
Il est analogue à celui qui a été étudié dans les version précédentes.
XV-C. Les fichiers des messages▲
Le fichier [messages.properties] est le suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Accueil.titre=Accueil
Accueil.message=Struts 2 - Conversions et validations
Accueil.FormDivers=Saisies diverses (email, url, chaine de caract\u00e8res avec contr\u00f4le du nombre de caract\u00e8res)
Form.titre=Conversions et validations
FormDivers.message=Struts 2 - Conversions et validations de types divers
Form.submitText=Valider
Form.cancelText=Annuler
Form.clearModel=Raz mod\u00e8le
Confirmation.titre=Confirmation
Confirmation.message=Confirmation des valeurs saisies
Confirmation.champ=champ
Confirmation.valeur=valeur
Confirmation.lien=Formulaire de test
xwork.default.invalid.fieldvalue=Valeur invalide pour le champ "{0}".
Le fichier [FormDiversModel.properties] est le suivant :
2.
3.
4.
5.
6.
email.prompt=1-Tapez une adresse \u00E9lectronique (x@y.z)
email.error=Format invalide
url.prompt=2-Tapez une url (http://www.ibm.com)
url.error=Format invalide
chaine.prompt=3-Tapez une chaine de 5 caract\u00E8res
chaine.error=Format invalide
XV-D. Le formulaire de saisie▲
La vue [FormDivers.jsp] 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.
<%@
page
contentType
=
"
text
/
html
;
charset
=
UTF
-
8
"
pageEncoding
=
"
UTF
-
8
"
%>
<%@
taglib
prefix
=
"
s
"
uri
=
"
/
struts
-
tags
"
%>
<
html
>
<
head
>
<
title
>
<
s
:
text
name
=
"
Form
.
titre
"
/
>
<
/
title
>
<
s
:
head
/
>
<
/
head
>
<
body
background
=
"
<
s
:
url
value
=
"
/
ressources
/
standard
.
jpg
"
/
>
"
>
<
h2
>
<
s
:
text
name
=
"
FormDivers
.
message
"
/
>
<
/
h2
>
<
s
:
form
name
=
"
formulaire
"
action
=
"
FormDivers
"
>
<
s
:
textfield
name
=
"
email
"
key
=
"
email
.
prompt
"
size
=
"
30
"
/
>
<
s
:
textfield
name
=
"
url1
"
key
=
"
url
.
prompt
"
size
=
"
30
"
/
>
<
s
:
textfield
name
=
"
chaine
"
key
=
"
chaine
.
prompt
"
size
=
"
10
"
/
>
<
s
:
submit
key
=
"
Form
.
submitText
"
method
=
"
execute
"
/
>
<
/
s
:
form
>
<
br
/
>
<
s
:
url
id
=
"
url
"
action
=
"
FormDivers
"
method
=
"
cancel
"
/
>
<
s
:
a
href
=
"
%
{
url
}
"
>
<
s
:
text
name
=
"
Form
.
cancelText
"
/
>
<
/
s
:
a
>
<
br
/
>
<
s
:
url
id
=
"
url
"
action
=
"
FormDivers
"
method
=
"
clearModel
"
/
>
<
s
:
a
href
=
"
%
{
url
}
"
>
<
s
:
text
name
=
"
Form
.
clearModel
"
/
>
<
/
s
:
a
>
<
/
body
>
<
/
html
>
Les lignes 12 à 14 sont les trois zones de saisie.
XV-E. La vue de confirmation▲
La vue de confirmation [ConfirmationFormDivers.jsp] 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.
27.
28.
29.
30.
31.
32.
33.
<%@
page
contentType
=
"
text
/
html
;
charset
=
UTF
-
8
"
pageEncoding
=
"
UTF
-
8
"
%>
<%@
taglib
prefix
=
"
s
"
uri
=
"
/
struts
-
tags
"
%>
<
html
>
<
head
>
<
title
>
<
s
:
text
name
=
"
Confirmation
.
titre
"
/
>
<
/
title
>
<
s
:
head
/
>
<
/
head
>
<
body
background
=
"
<
s
:
url
value
=
"
/
ressources
/
standard
.
jpg
"
/
>
"
>
<
h2
>
<
s
:
text
name
=
"
Confirmation
.
message
"
/
>
<
/
h2
>
<
table
border
=
"
1
"
>
<
tr
>
<
th
>
<
s
:
text
name
=
"
Confirmation
.
champ
"
/
>
<
/
th
>
<
th
>
<
s
:
text
name
=
"
Confirmation
.
valeur
"
/
>
<
/
th
>
<
/
tr
>
<
tr
>
<
td
>
<
s
:
text
name
=
"
email
.
prompt
"
/
>
<
/
td
>
<
td
>
<
s
:
text
name
=
"
email
"
/
>
<
/
td
>
<
/
tr
>
<
tr
>
<
td
>
<
s
:
text
name
=
"
url
.
prompt
"
/
>
<
/
td
>
<
td
>
<
s
:
text
name
=
"
url1
"
/
>
<
/
td
>
<
/
tr
>
<
tr
>
<
td
>
<
s
:
text
name
=
"
chaine
.
prompt
"
/
>
<
/
td
>
<
td
>
<
s
:
text
name
=
"
chaine
"
/
>
<
/
td
>
<
/
tr
>
<
/
table
>
<
br
/
>
<
s
:
url
id
=
"
url
"
action
=
"
FormDivers
!
input
"
/
>
<
s
:
a
href
=
"
%
{
url
}
"
>
<
s
:
text
name
=
"
Confirmation
.
lien
"
/
>
<
/
s
:
a
>
<
/
body
>
<
/
html
>
XV-F. Le modèle [FormDiversModel]▲
Les champs de saisie du formulaire [FormDivers.jsp] sont injectés dans le modèle [FormDiversModel] suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package
example;
public
class
FormDiversModel {
//
constructeur
sans
paramètre
public
FormDiversModel
(
) {
}
//
champs
private
String email;
private
String url1 ;
private
String chaine;
//
raz
modèle
public
void
clearModel
(
) {
email =
null
;
url1 =
null
;
chaine =
null
;
}
//
getters
et
setters
...
}
XV-G. La validation du modèle▲
La validation du modèle est contrôlée par deux fichiers : [FormDivers-validation.xml] et [FormDiversModel-validation.xml].
Le fichier [FormDivers-validation.xml] délègue les validations au fichier [FormDiversModel-validation.xml] suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<!--
<!DOCTYPE
validators
PUBLIC
"-//OpenSymphony
Group//XWork
Validator
1.0.2//
EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->
<!
DOCTYPE
validators
PUBLIC
"
-//OpenSymphony
Group//XWork
Validator
1.0.2//
EN
"
"
http://localhost:8084/exemple-10/example/xwork-validator-1.0.2.dtd
"
>
<
validators
>
<
field
name
=
"
model
"
>
<
field-validator
type
=
"
visitor
"
>
<
param
name
=
"
appendPrefix
"
>
false<
/
param
>
<
message
/
>
<
/
field-validator
>
<
/
field
>
<
/
validators
>
Nous avons déjà rencontré ce fichier.
Le fichier [FormDateModel-validation.xml] contient les règles de validation suivantes :
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.
<!--
<!DOCTYPE
validators
PUBLIC
"-//OpenSymphony
Group//XWork
Validator
1.0.2//
EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->
<!
DOCTYPE
validators
PUBLIC
"
-//OpenSymphony
Group//XWork
Validator
1.0.2//
EN
"
"
http://localhost:8084/exemple-12/example/xwork-validator-1.0.2.dtd
"
>
<
validators
>
<
field
name
=
"
email
"
>
<
field-validator
type
=
"
requiredstring
"
short-circuit
=
"
true
"
>
<
message
key
=
"
email.error
"
/
>
<
/
field-validator
>
<
field-validator
type
=
"
email
"
short-circuit
=
"
true
"
>
<
message
key
=
"
email.error
"
/
>
<
/
field-validator
>
<
/
field
>
<
field
name
=
"
url1
"
>
<
field-validator
type
=
"
requiredstring
"
short-circuit
=
"
true
"
>
<
message
key
=
"
url.error
"
/
>
<
/
field-validator
>
<
field-validator
type
=
"
url
"
short-circuit
=
"
true
"
>
<
message
key
=
"
url.error
"
/
>
<
/
field-validator
>
<
/
field
>
<
field
name
=
"
chaine
"
>
<
field-validator
type
=
"
requiredstring
"
short-circuit
=
"
true
"
>
<
message
key
=
"
chaine.error
"
/
>
<
/
field-validator
>
<
field-validator
type
=
"
stringlength
"
short-circuit
=
"
true
"
>
<
param
name
=
"
minLength
"
>
5<
/
param
>
<
param
name
=
"
maxLength
"
>
5<
/
param
>
<
message
key
=
"
chaine.error
"
/
>
<
/
field-validator
>
<
/
field
>
<
/
validators
>
- lignes 11-18 : vérifient la validité du champ email
- lignes 15-17 : vérifient que la chaîne email est une adresse électronique valide
- lignes 20-27 : vérifient la validité du champ url1
- lignes 24-26 : vérifient que la chaîne url1 est une Url valide
- lignes 29-38 : vérifient la validité du champ chaine
- lignes 33-37 : vérifient que la chaîne chaine a 5 caractères exactement.
XV-H. L'action [FormDivers]▲
L'action [FormDivers] 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
package
example;
import
com.opensymphony.xwork2.ActionSupport;
import
com.opensymphony.xwork2.ModelDriven;
import
java.util.Map;
import
org.apache.struts2.interceptor.SessionAware;
import
org.apache.struts2.interceptor.validation.SkipValidation;
public
class
FormDivers extends
ActionSupport implements
ModelDriven, SessionAware {
//
constructeur
sans
paramètre
public
FormDivers
(
) {
}
//
modèle
de
l'action
public
Object getModel
(
) {
if
(
session.get
(
"
model
"
) =
=
null
) {
session.put
(
"
model
"
, new
FormDiversModel
(
));
}
return
session.get
(
"
model
"
);
}
@
SkipValidation
public
String clearModel
(
) {
//
raz
du
modèle
(
(
FormDiversModel) getModel
(
)).clearModel
(
);
//
résultat
return
INPUT;
}
public
String cancel
(
) {
//
on
nettoie
le
modèle
(
(
FormDiversModel) getModel
(
)).clearModel
(
);
//
résultat
return
"
cancel
"
;
}
//
SessionAware
Map<
String, Object>
session;
public
void
setSession
(
Map<
String, Object>
session) {
this
.session =
session;
}
}
L'action [FormDivers] est bâtie sur le même modèle que les actions étudiées précédemment. Ici, il n'y a simplement pas de méthode validate pour compléter la validation faite par le fichier [FormDiversModel-validation.xml].