Streben 2 - Value Stack / OGNL

Der Wertestapel

Der Wertestapel besteht aus mehreren Objekten, die die folgenden Objekte in der angegebenen Reihenfolge halten:

Sr.Nr. Objekte & Beschreibung
1

Temporary Objects

Es gibt verschiedene temporäre Objekte, die während der Ausführung einer Seite erstellt werden. Beispiel: Der aktuelle Iterationswert für eine Sammlung, die in einem JSP-Tag durchlaufen wird.

2

The Model Object

Wenn Sie in Ihrer Struts-Anwendung Modellobjekte verwenden, wird das aktuelle Modellobjekt vor der Aktion auf dem Wertestapel platziert.

3

The Action Object

Dies ist das aktuelle Aktionsobjekt, das ausgeführt wird.

4

Named Objects

Diese Objekte umfassen #application, #session, #request, #attr und #parameters und verweisen auf die entsprechenden Servlet-Bereiche.

Auf den Wertestapel kann über die für JSP, Velocity oder Freemarker bereitgestellten Tags zugegriffen werden. Es gibt verschiedene Tags, die wir in separaten Kapiteln untersuchen werden, um den Wertestapel für Streben 2.0 zu erhalten und festzulegen. Sie können das valueStack-Objekt wie folgt in Ihre Aktion aufnehmen:

ActionContext.getContext().getValueStack()

Sobald Sie ein ValueStack-Objekt haben, können Sie dieses Objekt mit den folgenden Methoden bearbeiten:

Sr.Nr. ValueStack-Methoden und Beschreibung
1

Object findValue(String expr)

Suchen Sie einen Wert, indem Sie den angegebenen Ausdruck anhand des Stapels in der Standardsuchreihenfolge auswerten.

2

CompoundRoot getRoot()

Holen Sie sich den CompoundRoot, der die auf den Stapel geschobenen Objekte enthält.

3

Object peek()

Holen Sie sich das Objekt oben auf den Stapel, ohne den Stapel zu ändern.

4

Object pop()

Holen Sie sich das Objekt oben auf den Stapel und entfernen Sie es vom Stapel.

5 void push(Object o)

Legen Sie dieses Objekt oben auf den Stapel.

6

void set(String key, Object o)

Legt ein Objekt auf dem Stapel mit dem angegebenen Schlüssel fest, damit es von findValue (Schlüssel, ...) abgerufen werden kann.

7

void setDefaultType(Class defaultType)

Legt den Standardtyp fest, in den konvertiert werden soll, wenn beim Abrufen eines Werts kein Typ angegeben wird.

8

void setValue(String expr, Object value)

Es wird versucht, eine Eigenschaft für eine Bean im Stapel mit dem angegebenen Ausdruck in der Standardsuchreihenfolge festzulegen.

9

int size()

Ermitteln Sie die Anzahl der Objekte im Stapel.

Die OGNL

Das Object-Graph Navigation Language(OGNL) ist eine leistungsstarke Ausdruckssprache, mit der Daten auf dem ValueStack referenziert und bearbeitet werden. OGNL hilft auch bei der Datenübertragung und Typkonvertierung.

Die OGNL ist der JSP-Ausdruckssprache sehr ähnlich. OGNL basiert auf der Idee, ein Stamm- oder Standardobjekt im Kontext zu haben. Auf die Eigenschaften des Standard- oder Stammobjekts kann mithilfe der Markup-Notation verwiesen werden, bei der es sich um das Pfund-Symbol handelt.

Wie bereits erwähnt, basiert OGNL auf einem Kontext und Struts erstellt eine ActionContext-Map zur Verwendung mit OGNL. Die ActionContext-Map besteht aus folgenden Elementen:

  • Application - Variablen mit Anwendungsbereich

  • Session - Variablen mit Sitzungsbereich

  • Root / value stack - Alle Ihre Aktionsvariablen werden hier gespeichert

  • Request - Gültigkeitsbereichsvariablen anfordern

  • Parameters - Parameter anfordern

  • Atributes - Die in Seiten-, Anforderungs-, Sitzungs- und Anwendungsbereich gespeicherten Attribute

Es ist wichtig zu verstehen, dass das Action-Objekt immer im Wertestapel verfügbar ist. Also, wenn Ihr Action-Objekt Eigenschaften hat“x” und “y” Es stehen Ihnen diese zur Verfügung.

Objekte im ActionContext werden mit dem Pfund-Symbol referenziert. Die Objekte im Wertestapel können jedoch direkt referenziert werden.

Zum Beispiel wenn employee ist eine Eigenschaft einer Aktionsklasse, auf die wie folgt verwiesen werden kann:

<s:property value = "name"/>

Anstatt von

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

Wenn Sie in der Sitzung ein Attribut namens "Login" haben, können Sie es wie folgt abrufen:

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

OGNL unterstützt auch den Umgang mit Sammlungen - nämlich Map, List und Set. Um beispielsweise eine Dropdown-Liste mit Farben anzuzeigen, können Sie Folgendes tun:

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

Der OGNL-Ausdruck ist klug, um "Rot", "Gelb", "Grün" als Farben zu interpretieren und darauf basierend eine Liste zu erstellen.

Die OGNL-Ausdrücke werden in den nächsten Kapiteln ausführlich verwendet, wenn wir verschiedene Tags untersuchen. Betrachten wir sie also nicht isoliert, sondern anhand einiger Beispiele im Abschnitt Formular-Tags / Steuer-Tags / Daten-Tags und Ajax-Tags.

ValueStack / OGNL-Beispiel

Aktion erstellen

Betrachten wir die folgende Aktionsklasse, in der wir auf valueStack zugreifen und dann einige Schlüssel festlegen, auf die wir in unserer Ansicht mit OGNL zugreifen, dh auf der JSP-Seite.

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;
   }
}

Tatsächlich fügt Struts 2 Ihre Aktion bei der Ausführung oben im valueStack hinzu. Die übliche Methode, um Dinge auf den Wertestapel zu legen, besteht darin, Ihrer Aktionsklasse Getter / Setter für die Werte hinzuzufügen und dann mit dem Tag <s: property> auf die Werte zuzugreifen. Aber ich zeige Ihnen, wie genau ActionContext und ValueStack in Streben funktionieren.

Ansichten erstellen

Lassen Sie uns die folgende JSP-Datei erstellen HelloWorld.jspim WebContent-Ordner in Ihrem Eclipse-Projekt. Diese Ansicht wird angezeigt, falls die Aktion erfolgreich ist.

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

Wir müssen auch schaffen index.jsp im WebContent-Ordner, dessen Inhalt wie folgt lautet:

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

Konfigurationsdateien

Es folgt der Inhalt von struts.xml Datei -

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

Es folgt der Inhalt von web.xml Datei -

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

Klicken Sie mit der rechten Maustaste auf den Projektnamen und klicken Sie auf Export > WAR Fileum eine War-Datei zu erstellen. Stellen Sie diese WAR dann im Webanwendungsverzeichnis von Tomcat bereit.

Starten Sie abschließend den Tomcat-Server und versuchen Sie, auf die URL zuzugreifen http://localhost:8080/HelloWorldStruts2/index.jsp. Dadurch wird der folgende Bildschirm angezeigt

Geben Sie nun ein beliebiges Wort in das angegebene Textfeld ein und klicken Sie auf die Schaltfläche "Hallo sagen", um die definierte Aktion auszuführen. Wenn Sie nun das generierte Protokoll überprüfen, finden Sie unten den folgenden Text:

Size of the valueStack: 3

Daraufhin wird der folgende Bildschirm angezeigt, in dem der von Ihnen eingegebene Wert und der Wert von Schlüssel1 und Schlüssel2 angezeigt werden, den wir auf ValueStack gesetzt haben.