Struts 2 - Value Stack / OGNL

La pile de valeur

La pile de valeurs est un ensemble de plusieurs objets qui conserve les objets suivants dans l'ordre fourni -

Sr. Non Objets et description
1

Temporary Objects

Il existe différents objets temporaires qui sont créés lors de l'exécution d'une page. Par exemple, la valeur d'itération actuelle pour une collection en boucle dans une balise JSP.

2

The Model Object

Si vous utilisez des objets de modèle dans votre application Struts, l'objet de modèle actuel est placé avant l'action sur la pile de valeurs.

3

The Action Object

Ce sera l'objet d'action en cours d'exécution.

4

Named Objects

Ces objets incluent #application, #session, #request, #attr et #parameters et font référence aux portées de servlet correspondantes.

La pile de valeurs est accessible via les balises fournies pour JSP, Velocity ou Freemarker. Il existe différentes balises que nous étudierons dans des chapitres séparés, qui sont utilisées pour obtenir et définir la pile de valeurs struts 2.0. Vous pouvez obtenir l'objet valueStack dans votre action comme suit -

ActionContext.getContext().getValueStack()

Une fois que vous avez un objet ValueStack, vous pouvez utiliser les méthodes suivantes pour manipuler cet objet -

Sr. Non Méthodes ValueStack et description
1

Object findValue(String expr)

Trouvez une valeur en évaluant l'expression donnée par rapport à la pile dans l'ordre de recherche par défaut.

2

CompoundRoot getRoot()

Obtenez le CompoundRoot qui contient les objets poussés sur la pile.

3

Object peek()

Obtenez l'objet sur le dessus de la pile sans changer la pile.

4

Object pop()

Obtenez l'objet sur le dessus de la pile et retirez-le de la pile.

5 void push(Object o)

Mettez cet objet sur le dessus de la pile.

6

void set(String key, Object o)

Définit un objet sur la pile avec la clé donnée afin qu'il soit récupérable par findValue (key, ...)

sept

void setDefaultType(Class defaultType)

Définit le type par défaut vers lequel convertir si aucun type n'est fourni lors de l'obtention d'une valeur.

8

void setValue(String expr, Object value)

Tente de définir une propriété sur un bean dans la pile avec l'expression donnée en utilisant l'ordre de recherche par défaut.

9

int size()

Obtenez le nombre d'objets dans la pile.

L'OGNL

le Object-Graph Navigation Language(OGNL) est un langage d'expression puissant utilisé pour référencer et manipuler des données sur ValueStack. OGNL aide également au transfert de données et à la conversion de type.

L'OGNL est très similaire au langage d'expression JSP. OGNL est basé sur l'idée d'avoir un objet racine ou par défaut dans le contexte. Les propriétés de l'objet par défaut ou racine peuvent être référencées à l'aide de la notation de balisage, qui est le symbole dièse.

Comme mentionné précédemment, OGNL est basé sur un contexte et Struts construit une carte ActionContext à utiliser avec OGNL. La carte ActionContext comprend les éléments suivants:

  • Application - Variables de portée de l'application

  • Session - Variables de portée de session

  • Root / value stack - Toutes vos variables d'action sont stockées ici

  • Request - Demander des variables de portée

  • Parameters - Paramètres de demande

  • Atributes - Les attributs stockés dans la portée de la page, de la requête, de la session et de l'application

Il est important de comprendre que l'objet Action est toujours disponible dans la pile de valeurs. Donc, si votre objet Action a des propriétés“x” et “y” ils sont facilement disponibles pour vous.

Les objets dans ActionContext sont référencés à l'aide du symbole dièse, cependant, les objets de la pile de valeurs peuvent être directement référencés.

Par exemple, si employee est une propriété d'une classe d'action, alors elle peut être référencée comme suit -

<s:property value = "name"/>

au lieu de

<s:property value = "#name"/>

Si vous avez un attribut dans la session appelé "login", vous pouvez le récupérer comme suit -

<s:property value = "#session.login"/>

OGNL prend également en charge le traitement des collections - à savoir Map, List et Set. Par exemple, pour afficher une liste déroulante de couleurs, vous pouvez faire -

<s:select name = "color" list = "{'red','yellow','green'}" />

L'expression OGNL est intelligente pour interpréter le «rouge», «jaune», «vert» comme des couleurs et construire une liste basée sur cela.

Les expressions OGNL seront largement utilisées dans les prochains chapitres lorsque nous étudierons différentes balises. Donc, plutôt que de les examiner isolément, examinons-les en utilisant quelques exemples dans la section Balises de formulaire / Balises de contrôle / Balises de données et Balises Ajax.

Exemple ValueStack / OGNL

Créer une action

Considérons la classe d'action suivante où nous accédons à valueStack et définissons ensuite quelques clés auxquelles nous accéderons en utilisant OGNL dans notre vue, c'est-à-dire la page JSP.

package com.tutorialspoint.struts2;

import java.util.*; 

import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
   private String name;

   public String execute() throws Exception {
      ValueStack stack = ActionContext.getContext().getValueStack();
      Map<String, Object> context = new HashMap<String, Object>();

      context.put("key1", new String("This is key1")); 
      context.put("key2", new String("This is key2"));
      stack.push(context);

      System.out.println("Size of the valueStack: " + stack.size());
      return "success";
   }  

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

En fait, Struts 2 ajoute votre action en haut de valueStack lors de son exécution. Ainsi, la manière habituelle de placer des éléments sur la pile de valeurs est d'ajouter des getters / setters pour les valeurs à votre classe Action, puis d'utiliser la balise <s: property> pour accéder aux valeurs. Mais je vous montre comment ActionContext et ValueStack fonctionnent exactement dans des entretoises.

Créer des vues

Créons le fichier jsp ci-dessous HelloWorld.jspdans le dossier WebContent de votre projet eclipse. Cette vue sera affichée au cas où l'action retourne un succès -

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      Entered value : <s:property value = "name"/><br/>
      Value of key 1 : <s:property value = "key1" /><br/>
      Value of key 2 : <s:property value = "key2" /> <br/>
   </body>
</html>

Nous devons également créer index.jsp dans le dossier WebContent dont le contenu est le suivant -

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Hello World</title>
   </head>
   
   <body>
      <h1>Hello World From Struts2</h1>
      <form action = "hello">
         <label for = "name">Please enter your name</label><br/>
         <input type = "text" name = "name"/>
         <input type = "submit" value = "Say Hello"/>
      </form>
   </body>
</html>

Fichiers de configuration

Voici le contenu de struts.xml fichier -

<?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>
   <constant name = "struts.devMode" value = "true" />
   <package name = "helloworld" extends = "struts-default">

      <action name = "hello" 
         class = "com.tutorialspoint.struts2.HelloWorldAction" 
         method = "execute">
         <result name = "success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

Voici le contenu de web.xml fichier -

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Faites un clic droit sur le nom du projet et cliquez sur Export > WAR Filepour créer un fichier War. Déployez ensuite ce WAR dans le répertoire webapps de Tomcat.

Enfin, démarrez le serveur Tomcat et essayez d'accéder à l'URL http://localhost:8080/HelloWorldStruts2/index.jsp. Cela produira l'écran suivant

Entrez maintenant n'importe quel mot dans la zone de texte donnée et cliquez sur le bouton "Dire bonjour" pour exécuter l'action définie. Maintenant, si vous vérifiez le journal généré, vous trouverez le texte suivant en bas -

Size of the valueStack: 3

Cela affichera l'écran suivant, qui affichera la valeur que vous entrerez et la valeur de key1 et key2 que nous avions mis sur ValueStack.