Struts 2 - Value Stack / OGNL

Stos wartości

Stos wartości to zestaw kilku obiektów, który utrzymuje następujące obiekty w podanej kolejności -

Sr.No Obiekty i opis
1

Temporary Objects

Istnieje wiele obiektów tymczasowych, które są tworzone podczas wykonywania strony. Na przykład bieżąca wartość iteracji kolekcji zapętlonej w znaczniku JSP.

2

The Model Object

Jeśli używasz obiektów modelu w aplikacji Struts, bieżący obiekt modelu jest umieszczany przed operacją na stosie wartości.

3

The Action Object

Będzie to aktualnie wykonywany obiekt akcji.

4

Named Objects

Te obiekty obejmują #application, #session, #request, #attr i #parameters i odwołują się do odpowiednich zakresów serwletów.

Dostęp do stosu wartości można uzyskać za pośrednictwem tagów przewidzianych dla JSP, Velocity lub Freemarker. Istnieją różne znaczniki, które będziemy badać w oddzielnych rozdziałach, służą do pobierania i ustawiania stosu wartości Struts 2.0. Możesz pobrać obiekt valueStack wewnątrz akcji w następujący sposób -

ActionContext.getContext().getValueStack()

Gdy masz już obiekt ValueStack, możesz manipulować nim za pomocą następujących metod:

Sr.No Metody i opis ValueStack
1

Object findValue(String expr)

Znajdź wartość, porównując dane wyrażenie ze stosem w domyślnej kolejności wyszukiwania.

2

CompoundRoot getRoot()

Pobierz CompoundRoot, który przechowuje obiekty odłożone na stos.

3

Object peek()

Umieść obiekt na szczycie stosu bez zmiany stosu.

4

Object pop()

Umieść obiekt na szczycie stosu i usuń go ze stosu.

5 void push(Object o)

Umieść ten obiekt na szczycie stosu.

6

void set(String key, Object o)

Ustawia obiekt na stosie z podanym kluczem, aby można go było pobrać przez findValue (klucz, ...)

7

void setDefaultType(Class defaultType)

Ustawia domyślny typ do konwersji, jeśli podczas pobierania wartości nie zostanie podany żaden typ.

8

void setValue(String expr, Object value)

Próbuje ustawić właściwość fasoli w stosie z podanym wyrażeniem przy użyciu domyślnej kolejności wyszukiwania.

9

int size()

Uzyskaj liczbę obiektów w stosie.

OGNL

Plik Object-Graph Navigation Language(OGNL) to zaawansowany język wyrażeń, który jest używany do odwoływania się do danych w ValueStack i manipulowania nimi. OGNL pomaga również w przesyłaniu danych i konwersji typów.

OGNL jest bardzo podobny do języka wyrażeń JSP. OGNL opiera się na idei posiadania obiektu głównego lub domyślnego w kontekście. Do właściwości obiektu domyślnego lub głównego można się odwoływać za pomocą notacji znaczników, która jest symbolem funta.

Jak wspomniano wcześniej, OGNL opiera się na kontekście, a Struts tworzy mapę ActionContext do użytku z OGNL. Mapa ActionContext składa się z następujących elementów -

  • Application - Zmienne o zakresie aplikacji

  • Session - Zmienne o zasięgu sesji

  • Root / value stack - Tutaj przechowywane są wszystkie zmienne akcji

  • Request - Zmienne o zakresie żądań

  • Parameters - Parametry żądania

  • Atributes - Atrybuty przechowywane na stronie, żądaniu, sesji i zakresie aplikacji

Ważne jest, aby zrozumieć, że obiekt Action jest zawsze dostępny na stosie wartości. Dlatego jeśli obiekt Action ma właściwości“x” i “y” są łatwo dostępne do użycia.

Do obiektów w ActionContext można odwoływać się za pomocą symbolu funta, jednak do obiektów w stosie wartości można się bezpośrednio odwoływać.

Na przykład, jeśli employee jest właściwością klasy akcji, można do niej odwoływać się w następujący sposób -

<s:property value = "name"/>

zamiast

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

Jeśli masz atrybut w sesji o nazwie „login”, możesz go pobrać w następujący sposób -

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

OGNL wspiera także obsługę zbiorów - czyli Map, List i Set. Na przykład, aby wyświetlić rozwijaną listę kolorów, możesz zrobić -

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

Wyrażenie OGNL sprytnie interpretuje „czerwony”, „żółty”, „zielony” jako kolory i buduje na tej podstawie listę.

Wyrażenia OGNL będą szeroko używane w następnych rozdziałach, w których będziemy badać różne znaczniki. Więc zamiast patrzeć na nie osobno, przyjrzyjmy się temu, korzystając z kilku przykładów w sekcji Tagi formularzy / Tagi kontrolne / Tagi danych i tagi Ajax.

Przykład ValueStack / OGNL

Utwórz akcję

Rozważmy następującą klasę akcji, w której uzyskujemy dostęp do valueStack, a następnie ustawiamy kilka kluczy, do których będziemy uzyskiwać dostęp za pomocą OGNL w naszym widoku, tj. Strona 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;
   }
}

W rzeczywistości Struts 2 dodaje twoją akcję na początek valueStack po wykonaniu. Tak więc zwykłym sposobem umieszczania rzeczy na stosie wartości jest dodanie pobierających / ustawiających wartości do klasy Action, a następnie użycie tagu <s: property> w celu uzyskania dostępu do wartości. Ale pokazuję ci, jak dokładnie ActionContext i ValueStack działają w struts.

Utwórz widoki

Stwórzmy poniższy plik jsp HelloWorld.jspw folderze WebContent w projekcie eclipse. Ten widok zostanie wyświetlony w przypadku, gdy akcja zwróci sukces -

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

Musimy też tworzyć index.jsp w folderze WebContent, którego zawartość jest następująca -

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

Pliki konfiguracyjne

Poniżej znajduje się treść struts.xml plik -

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

Poniżej znajduje się treść web.xml plik -

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

Kliknij prawym przyciskiem myszy nazwę projektu i kliknij Export > WAR Fileaby utworzyć plik wojny. Następnie wdróż tę WAR w katalogu webapps serwera Tomcat.

Na koniec uruchom serwer Tomcat i spróbuj uzyskać dostęp do adresu URL http://localhost:8080/HelloWorldStruts2/index.jsp. Spowoduje to wyświetlenie następującego ekranu

Teraz wprowadź dowolne słowo w podanym polu tekstowym i kliknij przycisk „Say Hello”, aby wykonać zdefiniowaną akcję. Teraz, jeśli sprawdzisz wygenerowany dziennik, na dole znajdziesz następujący tekst -

Size of the valueStack: 3

Spowoduje to wyświetlenie następującego ekranu, na którym zostanie wyświetlona dowolna wartość, którą wprowadzisz, oraz wartość klucza1 i klucza2, które umieściliśmy w ValueStack.