Présentation de la Value Stack et introduction à OGNL dans Struts2

L'architecture de Struts2 s'appuie fondamentalement sur un mécanisme de transfert de données appelé la Value Stack (Pile de valeurs). Cette structure, agissant comme une sorte de conetxte central pour une requête, stocke temporairement les objets nécessaires au traitement et à l'affichage.

Introduction à OGNL

Pour interagir avec la Value Stack et d'autres objets de contexte (request, session, application), Struts2 utilise le langage d'expression OGNL (Object-Graph Navigation Language). OGNL permet d'accéder à des propriétés et à des méthodes sur des objets Java de manière concise et uniforme.

Voici un exemple d'action qui peuple la Value Stack ainsi que les contextes de session et d'application.


package com.example.struts;

import java.util.HashMap;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class GreetingAction extends ActionSupport {
    private String identifier;

    @Override
    public String execute() throws Exception {
        ActionContext currentContext = ActionContext.getContext();
        ValueStack stack = currentContext.getValueStack();
        stack.push("username", "Alain (Stack)");
        stack.push("userAge", 25);

        Map<String, Object> sessionMap = currentContext.getSession();
        sessionMap.put("username", "Béatrice (Session)");
        sessionMap.put("userAge", 30);

        Map<String, Object> appAttributes = currentContext.getApplication();
        appAttributes.put("username", "Clément (Application)");
        appAttributes.put("userAge", 40);

        return SUCCESS;
    }
    // Getters et Setters
}

Le fichier de configuration struts.xml associe une URL à cette action et définit la vue de résultat.


<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="saluer" class="com.example.struts.GreetingAction">
            <result name="success">/WEB-INF/views/resultat.jsp</result>
        </action>
    </package>
</struts>

La page JSP utilisant les tags Struts peut récupérer ces valeurs à l'aide d'expressions OGNL.


<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
    Valeur directe de la Stack : <s:property value="username"/> - <s:property value="userAge"/><br/>
    Depuis la requête (paramètres) : <s:property value="#parameters.nom"/><br/>
    Depuis l'attribut request : <s:property value="#request.username"/><br/>
    Depuis la session : <s:property value="#session.username"/><br/>
    Depuis le contexte application : <s:property value="#application.username"/><br/>
    Recherche via 'attr' : <s:property value="#attr.username"/><br/>
</body>
</html>

Accès aux Objets Complexes et aux Méthodes Statiques

OGNL excelle également dans la navigation à travers des objets Java, des collections et des cartes. Il peut aussi accéder à des membres statiques.

Considérons un modèle simple pour un étudiant.


package com.example.model;

public class Etudiant {
    private String nom;
    private int age;

    public Etudiant() {}

    public Etudiant(String nom, int age) {
        this.nom = nom;
        this.age = age;
    }
    // Getters et Setters
}

Ajoutons une classe utilitaire avec des membres statiques.


package com.example.util;

public class UtilStatique {
    public static final String MESSAGE = "Apprendre avec passion";

    public static String obtenirConseil() {
        return "Pratiquer régulièrement";
    }
}

L'action est étendue pour inclure un objet Etudiant, une List et une Map d'étudiants.


package com.example.struts;

import java.util.*;
import com.example.model.Etudiant;
import com.opensymphony.xwork2.ActionSupport;

public class GestionEtudiantAction extends ActionSupport {
    private Etudiant etudiantPrincipal;
    private List<Etudiant> listeEtudiants;
    private Map<String, Etudiant> carteEtudiants;

    @Override
    public String execute() throws Exception {
        etudiantPrincipal = new Etudiant("Marie", 21);

        listeEtudiants = new ArrayList<>();
        listeEtudiants.add(new Etudiant("Paul", 19));
        listeEtudiants.add(new Etudiant("Sophie", 20));

        carteEtudiants = new HashMap<>();
        carteEtudiants.put("meilleur", new Etudiant("Lucas", 22));
        carteEtudiants.put("nouveau", new Etudiant("Émilie", 18));

        return SUCCESS;
    }
    // Getters et Setters
}

Pour autoriser l'accès aux méthodes statiques via OGNL, une configuration supplémentaire est nécessaire dans struts.xml.


<struts>
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
    <!-- Configuration de package et actions... -->
</struts>

Finalement, la vue peut utiliser des expressions OGNL pour naviguer dans ces structures de données et appeler des éléments statiques.


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
    Propriété d'un JavaBean : <s:property value="etudiantPrincipal.nom"/> - <s:property value="etudiantPrincipal.age"/><br/>
    Élément d'une List : <s:property value="listeEtudiants[0].nom"/> &lt; <s:property value="listeEtudiants[1].nom"/><br/>
    Élément d'une Map : <s:property value="carteEtudiants['meilleur'].nom"/> - <s:property value="carteEtudiants['nouveau'].nom"/><br/>

    Propriété statique : <s:property value="@com.example.util.UtilStatique@MESSAGE"/><br/>
    Appel de méthode statique : <s:property value="@com.example.util.UtilStatique@obtenirConseil()"/>
</body>
</html>

Étiquettes: struts2 OGNL Value Stack Java web development

Publié le 14 juin à 17h40