Voici un second billet dans la série sur Les bonnes pratiques avec Struts.

Introduction

Une fois un formulaire saisi par un utilisateur, il faut qu’il soit validé un minimum. Cette validation peut se faire à deux endroits :

  • côté client : dans le butineur avec du code Javascript
  • côté serveur : dans le serveur d’application avec du code Java

La validation côté client permet d’éviter un aller-retour avec le serveur dans le cas où un champ du formulaire est invalide. Par contre, il est impossible de s’assurer que le contrôle côté client a réellement été effectué[1]. C’est pourquoi, il faut toujours réaliser les contrôles côté serveur.

Tout le monde s’accorde pour dire qu’il est souhaitable d’effectuer des contrôles côté client[2] et côté serveur[3].

Solutions

Struts propose plusieurs façon pour gérer ces contrôles :

ActionForm.validate

Le formulaire à coder doit hériter de la classe ActionForm et ré-implémenter la méthode ActionErrors validate(ActionMapping mapping,HttpServletRequest request).

Cette méthode est appelée à chaque fois qu’un objet ActionForm est chargé. Cela permet d’automatiser la validation du formulaire côté serveur. Voici un exemple d’implémentation :

public class LoginForm extends ActionForm {
	private String login;
	private String password;
	public void setLogin(String login) {
		this.login = login;
	}
	public string getLogin() {
		return login;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public string getPassword() {
		return password;
	}
	public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {
		ActionErrors errors = new ActionErrors();
		if ( login==null || login.lenght<=8) {
			errors.add("error",new ActionMessage ("error.login"));
		}
		if ( password==null || password.lenght<=8) {
			errors.add("error",new ActionMessage ("error.password"));
		}
		return errors;
	}
}

Struts Validator

Struts Validator est un framework à part entière qui permet d’effectuer la validation de formulaire côté client et côté serveur par simple configuration. En effet, il faut configurer les règles de validations dans un fichier XML, ensuite Struts Validator génère le code Java et le code Javascript à exécuter lors de la validation du formulaire.

Pour cela , il faut ajouter la déclaration suivante dans le fichier /WEB-INF/validation.xml :

<formset language="">
	<form name="loginForm">
		<field property="login" depends="required,minlength">
			<arg0 key="welcome.login.login"/>
			<arg1 name="minlength" key="${var:minlength}" resource="false" />
			<var>
				<var-name>minlength</var-name>
				<var-value>8</var-value>
			</var>
		</field>
		<field property="password" depends="required,minlength">
			<arg0 key="welcome.login.password"/>
			<arg1 name="minlength" key="${var:minlength}" resource="false" />
			<var>
				<var-name>minlength</var-name>
				<var-value>8</var-value>
			</var>
		</field>
	</form>
</formset>

De plus, le formulaire doit être déclaré de la façon suivante dans la page JSP :

<html:javascript formName="loginForm" dynamicJavascript="true" staticJavascript="true" />
<html:form action="/login" focus="login" onsubmit="return validateLoginForm(this);">
	<html:text property="login" size="16" /><br />
	<html:password property="password" size="16" redisplay="false" /><br />
	<html:submit value="login" />
</html:form>

Ainsi, le code Javascript est générer pour contrôler le formulaire côté client. Et Struts contrôle côté serveur le formulaire une nouvelle fois.

Conclusion

Le framework Validator permet de centraliser les règles de contrôle. De plus, grâce à ce système les contrôles Javascript et Java sont toujours à jour.

Je n’y ai pas encore trouvé d’utilité eu le besoin, mais certaines personnes utilisent la combinaison des deux méthodes.

Si toutes les règles de contrôles proposées par Struts Validator ne sont pas suffisantes, il est possible de créer ses propres règles. Comme cela  a déjà été présenté avec la règle compareTo pour Struts Validator. Faire référence au validateur compareTo.

Maintenant, vous n’aurez plus d’excuse pour ne pas réaliser de contrôle sur vos formulaires !

Notes

[1] Le Javascript peut être désactivé dans le butineur. Le client peut être un programme autre qu’un butineur

[2] Pour améliorer l’ergonomie.

[3] Pour améliorer la sécurité.