L'implémentation d'une validation personnalisée dans Struts2 permet d'étendre les capacités natives du framework pour répondre à des règles métier spécifiques, comme le filtrage de mots interdits. Cette procédure se décompose en trois étapes : la création de la classe Java, sa déclaration dans le registre des validateurs, et son application au sein d'un fichier XML de validation.
1. Création de la classe de validation
Pour créer un validateur de champ, il est recommandé d'étendre la classe FieldValidatorSupport. Dans l'exemple suivant, nous développons un filtre qui rejette les entrées contenant des termes proscrits.
package fr.tech.validation;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
public class WordFilterValidator extends FieldValidatorSupport {
@Override
public void validate(Object object) throws ValidationException {
String fieldName = getFieldName();
Object value = getFieldValue(fieldName, object);
if (value instanceof String) {
String input = ((String) value).trim();
if (isForbidden(input)) {
addFieldError(fieldName, object);
}
}
}
private boolean isForbidden(String input) {
String[] blacklist = {"spam", "badword", "illegal"};
for (String word : blacklist) {
if (input.toLowerCase().contains(word)) {
return true;
}
}
return false;
}
}
2. Enregistrement du validateur personnalisé
Pour que Struts2 reconnaisse ce nouveau validateur, il faut créer ou modifier le fichier validators.xml à la racine du dossier src (ou resources). Ce fichier doit inclure les validateurs par défaut ainsi que votre définition personnalisée.
<?xml version="1.0" encoding="UTF-8"?>
<validators>
<!-- Validateurs standards -->
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<!-- ... autres validateurs standards ... -->
<!-- Définition du validateur personnalisé -->
<validator name="wordFilter" class="fr.tech.validation.WordFilterValidator"/>
</validators>
3. Configuraton de l'Action et des métadonnées de validation
Voici une classe Action simple recevant un paramètre "username" :
package fr.tech.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String username;
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
@Override
public String execute() {
return SUCCESS;
}
}
Le fichier de validation associé, nommé UserAction-validation.xml et placé dans le même package que l'Action, utilise alors l'alias wordFilter défini précédemment :
<?xml version="1.0" encoding="UTF-8"?>
<validators>
<field name="username">
<field-validator type="requiredstring">
<message>Le nom d'utilisateur est requis.</message>
</field-validator>
<field-validator type="wordFilter">
<message>Le nom contient des termes non autorisés.</message>
</field-validator>
</field>
</validators>
4. Intégration dans struts.xml et Interface Utilisateur
Dans le fichier struts.xml, assurez-vous de configurer le résultat input pour rediriger l'utilisateur vers le formulaire en cas d'erreur de validation.
<action name="submitUser" class="fr.tech.action.UserAction">
<result name="input">/register.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
Enfin, le formluaire JSP utilice les balises Struts2 pour afficher automatiquement les messages d'erreur :
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<s:form action="submitUser">
<s:textfield name="username" label="Nom d'utilisateur" />
<s:submit value="Valider" />
</s:form>
</body>
</html>