Utilisation des expressions OGNL dans Struts2

Dans le framwork Struts2, OGNL (Object Graph Navigation Language) constitue un outil d'expression essentiel pour naviguer dans les objets Java. Ce langage permet d'interagir avec les propriétés et les méthodes des objets de manière directe et cohérente.

Principes fondamentaux d'OGNL

OGNL offre plusieurs fonctionnlaités clés : l'appel de méthodes sur des instances (par exemple, objet.methode()), l'accès à des membres statiques de classes (format @[classe]@[méthode|attribut]), la gestion d'opérations d'affectation et la navigation dans les structures d'objets imbriqués.

Gestion des données avec ValueStack et ActionContext

Dans Struts2, le ValueStack est une pile de données qui agit comme conteneur racine pour OGNL. Les objets placés dans le ValueStack sont accessibles directement sans préfixe. L'ActionContext sert de conteneur global pour les objets non racinaux, qui nécessitent un préfixe '#' pour l'accès. La hiérarchie des données suit un ordre de priorité : page, requête, session, application.

Distinction entre OGNL et EL

OGNL est spécifique aux balises Struts2 et privilégie la recherche dans le ValueStack, tandis que l'Expression Language (EL) est utilisé dans les JSP standard et interroge les portées de données (request, session, etc.). Cette différence impacte la manière dont les valeurs sont résolues dans les templates.

Exemples d'implémentation

Voici un utilitaire pour manipuler les expressions OGNL :

import ognl.Ognl; import ognl.OgnlContext; import ognl.OgnlException;

public class OgnlHelper {

private OgnlHelper() {
}

public static Object recupererValeur(String expression, OgnlContext contexte, Object racine) {
    try {
        return Ognl.getValue(expression, contexte, racine);
    } catch (OgnlException e) {
        throw new RuntimeException(e);
    }
}

public static void definirValeur(String expression, OgnlContext contexte, Object racine, Object valeur) {
    try {
        Ognl.setValue(expression, contexte, racine, valeur);
    } catch (OgnlException e) {
        throw new RuntimeException(e);
    }
}

}


</div>Démonstration avec des objets métier :

<div>```
import ognl.OgnlContext;

public class ExempleOGNL {
    public static void main(String[] args) {
        Employe employe = new Employe();
        employe.setNom("Alice");

        Responsable responsable = new Responsable();
        responsable.setNom("M. Laurent");

        OgnlContext contexte = new OgnlContext();
        contexte.put("employe", employe);
        contexte.put("responsable", responsable);
        contexte.setRoot(employe);

        // Récupération de valeurs
        String nomEmploye = (String) OgnlHelper.recupererValeur("nom", contexte, employe);
        System.out.println(nomEmploye); // Alice

        String nomResponsable = (String) OgnlHelper.recupererValeur("#responsable.nom", contexte, employe);
        System.out.println(nomResponsable); // M. Laurent

        // Modification de valeurs
        OgnlHelper.definirValeur("nom", contexte, employe, "Bob");
        nomEmploye = (String) OgnlHelper.recupererValeur("nom", contexte, employe);
        System.out.println(nomEmploye); // Bob
    }
}

public class ActionDemo { public String executer() { ValueStack pile = ActionContext.getContext().getValueStack(); pile.push(new Employe("Employe1", 3000)); pile.push(new Etudiant("Etudiant1", "ETU001"));

    System.out.println(pile.findValue("nom")); // Etudiant1
    System.out.println(pile.findValue("salaire")); // 3000
    return "succes";
}

}


</div>Configuration Struts correspondante :

<div>```
<action name="/demo_*" class="com.example.ActionDemo" method="{1}">
    <result name="succes">/resultat.jsp</result>
</action>

Étiquettes: struts2 OGNL ValueStack Java JSP

Publié le 12 juin à 20h01