Struts 2 - Value Stack / OGNL

La pila de valor

La pila de valores es un conjunto de varios objetos que mantiene los siguientes objetos en el orden proporcionado:

No Señor Objetos y descripción
1

Temporary Objects

Hay varios objetos temporales que se crean durante la ejecución de una página. Por ejemplo, el valor de iteración actual para una colección que se repite en una etiqueta JSP.

2

The Model Object

Si está utilizando objetos de modelo en su aplicación de struts, el objeto de modelo actual se coloca antes de la acción en la pila de valores.

3

The Action Object

Este será el objeto de acción actual que se está ejecutando.

4

Named Objects

Estos objetos incluyen #application, #session, #request, #attr y #parameters y hacen referencia a los alcances de servlet correspondientes.

Se puede acceder a la pila de valores a través de las etiquetas proporcionadas para JSP, Velocity o Freemarker. Hay varias etiquetas que estudiaremos en capítulos separados, que se utilizan para obtener y establecer la pila de valores de struts 2.0. Puede obtener el objeto valueStack dentro de su acción de la siguiente manera:

ActionContext.getContext().getValueStack()

Una vez que tenga un objeto ValueStack, puede utilizar los siguientes métodos para manipular ese objeto:

No Señor Métodos y descripción de ValueStack
1

Object findValue(String expr)

Encuentre un valor evaluando la expresión dada contra la pila en el orden de búsqueda predeterminado.

2

CompoundRoot getRoot()

Obtenga el CompoundRoot que contiene los objetos empujados a la pila.

3

Object peek()

Coloque el objeto en la parte superior de la pila sin cambiar la pila.

4

Object pop()

Coloque el objeto en la parte superior de la pila y retírelo de la pila.

5 void push(Object o)

Pon este objeto en la parte superior de la pila.

6

void set(String key, Object o)

Establece un objeto en la pila con la clave dada para que sea recuperable por findValue (clave, ...)

7

void setDefaultType(Class defaultType)

Establece el tipo predeterminado para convertir si no se proporciona ningún tipo al obtener un valor.

8

void setValue(String expr, Object value)

Intenta establecer una propiedad en un bean de la pila con la expresión dada utilizando el orden de búsqueda predeterminado.

9

int size()

Obtenga la cantidad de objetos en la pila.

El OGNL

los Object-Graph Navigation Language(OGNL) es un poderoso lenguaje de expresión que se utiliza para hacer referencia y manipular datos en ValueStack. OGNL también ayuda en la transferencia de datos y conversión de tipos.

El OGNL es muy similar al lenguaje de expresión JSP. OGNL se basa en la idea de tener una raíz o un objeto predeterminado dentro del contexto. Se puede hacer referencia a las propiedades del objeto predeterminado o raíz utilizando la notación de marcado, que es el símbolo de almohadilla.

Como se mencionó anteriormente, OGNL se basa en un contexto y Struts crea un mapa ActionContext para usar con OGNL. El mapa ActionContext consta de lo siguiente:

  • Application - Variables de ámbito de aplicación

  • Session - Variables de alcance de sesión

  • Root / value stack - Todas sus variables de acción se almacenan aquí

  • Request - Solicitar variables de ámbito

  • Parameters - Solicitar parámetros

  • Atributes - Los atributos almacenados en la página, solicitud, sesión y ámbito de aplicación.

Es importante comprender que el objeto Acción siempre está disponible en la pila de valores. Entonces, por lo tanto, si su objeto Action tiene propiedades“x” y “y” están disponibles para su uso.

Los objetos en ActionContext se hacen referencia mediante el símbolo de almohadilla, sin embargo, los objetos en la pila de valores se pueden referenciar directamente.

Por ejemplo, si employee es una propiedad de una clase de acción, entonces se puede hacer referencia a ella de la siguiente manera:

<s:property value = "name"/>

en vez de

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

Si tiene un atributo en la sesión llamado "inicio de sesión", puede recuperarlo de la siguiente manera:

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

OGNL también admite el manejo de colecciones, a saber, Mapa, Lista y Conjunto. Por ejemplo, para mostrar una lista desplegable de colores, puede hacer:

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

La expresión OGNL es inteligente para interpretar el "rojo", "amarillo", "verde" como colores y construir una lista basada en eso.

Las expresiones OGNL se utilizarán ampliamente en los próximos capítulos cuando estudiaremos diferentes etiquetas. Entonces, en lugar de mirarlos de forma aislada, veámoslo usando algunos ejemplos en la sección Etiquetas de formulario / Etiquetas de control / Etiquetas de datos y Etiquetas Ajax.

Ejemplo de ValueStack / OGNL

Crear acción

Consideremos la siguiente clase de acción donde accedemos a valueStack y luego configuramos algunas claves a las que accederemos usando OGNL en nuestra vista, es decir, la página 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 realidad, Struts 2 agrega su acción a la parte superior del valueStack cuando se ejecuta. Por lo tanto, la forma habitual de poner cosas en Value Stack es agregar captadores / definidores para los valores a su clase de Acción y luego usar la etiqueta <s: property> para acceder a los valores. Pero les estoy mostrando cómo funcionan exactamente ActionContext y ValueStack en puntales.

Crear vistas

Creemos el siguiente archivo jsp HelloWorld.jspen la carpeta WebContent de su proyecto eclipse. Esta vista se mostrará en caso de que la acción devuelva un éxito:

<%@ 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>

También necesitamos crear index.jsp en la carpeta WebContent cuyo contenido es el siguiente:

<%@ 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>

Archivos de configuración

A continuación se muestra el contenido de struts.xml archivo -

<?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>

A continuación se muestra el contenido de web.xml archivo -

<?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>

Haga clic derecho en el nombre del proyecto y haga clic en Export > WAR Filepara crear un archivo War. Luego implemente este WAR en el directorio de aplicaciones web de Tomcat.

Finalmente, inicie el servidor Tomcat e intente acceder a la URL http://localhost:8080/HelloWorldStruts2/index.jsp. Esto producirá la siguiente pantalla

Ahora ingrese cualquier palabra en el cuadro de texto dado y haga clic en el botón "Saludar" para ejecutar la acción definida. Ahora, si revisa el registro generado, encontrará el siguiente texto en la parte inferior:

Size of the valueStack: 3

Esto mostrará la siguiente pantalla, que mostrará cualquier valor que ingrese y el valor de key1 y key2 que pusimos en ValueStack.