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.