Struts 2 - Value Stack / OGNL
Il Value Stack
Lo stack di valori è un insieme di diversi oggetti che mantiene i seguenti oggetti nell'ordine fornito:
Suor n | Oggetti e descrizione |
---|---|
1 | Temporary Objects Ci sono vari oggetti temporanei che vengono creati durante l'esecuzione di una pagina. Ad esempio, il valore di iterazione corrente per una raccolta di cui viene eseguito il looping in un tag JSP. |
2 | The Model Object Se si utilizzano oggetti del modello nell'applicazione Struts, l'oggetto del modello corrente viene posizionato prima dell'azione nella pila dei valori. |
3 | The Action Object Questo sarà l'oggetto azione corrente che viene eseguito. |
4 | Named Objects Questi oggetti includono #application, #session, #request, #attr e #parameters e fanno riferimento agli ambiti servlet corrispondenti. |
È possibile accedere allo stack di valori tramite i tag forniti per JSP, Velocity o Freemarker. Ci sono vari tag che studieremo in capitoli separati, sono usati per ottenere e impostare lo stack di valori di struts 2.0. Puoi ottenere un oggetto valueStack all'interno della tua azione come segue:
ActionContext.getContext().getValueStack()
Una volta che hai un oggetto ValueStack, puoi usare i seguenti metodi per manipolare quell'oggetto:
Suor n | Metodi e descrizione ValueStack |
---|---|
1 | Object findValue(String expr) Trova un valore valutando l'espressione data rispetto allo stack nell'ordine di ricerca predefinito. |
2 | CompoundRoot getRoot() Ottieni CompoundRoot che tiene gli oggetti spinti nella pila. |
3 | Object peek() Porta l'oggetto in cima alla pila senza cambiare la pila. |
4 | Object pop() Prendi l'oggetto in cima alla pila e rimuovilo dalla pila. |
5 | void push(Object o) Metti questo oggetto in cima alla pila. |
6 | void set(String key, Object o) Imposta un oggetto sullo stack con la chiave data in modo che sia recuperabile da findValue (key, ...) |
7 | void setDefaultType(Class defaultType) Imposta il tipo predefinito in cui convertire se non viene fornito alcun tipo quando si ottiene un valore. |
8 | void setValue(String expr, Object value) Tenta di impostare una proprietà su un bean nello stack con l'espressione data utilizzando l'ordine di ricerca predefinito. |
9 | int size() Ottieni il numero di oggetti nella pila. |
L'OGNL
Il Object-Graph Navigation Language(OGNL) è un potente linguaggio di espressione che viene utilizzato per fare riferimento e manipolare i dati su ValueStack. OGNL aiuta anche nel trasferimento dei dati e nella conversione del tipo.
L'OGNL è molto simile al linguaggio di espressione JSP. OGNL si basa sull'idea di avere un oggetto root o predefinito all'interno del contesto. È possibile fare riferimento alle proprietà dell'oggetto predefinito o radice utilizzando la notazione di markup, che è il simbolo della sterlina.
Come accennato in precedenza, OGNL si basa su un contesto e Struts costruisce una mappa ActionContext da utilizzare con OGNL. La mappa ActionContext è composta da quanto segue:
Application - Variabili nell'ambito dell'applicazione
Session - Variabili con ambito di sessione
Root / value stack - Tutte le tue variabili di azione sono memorizzate qui
Request - Richiedi variabili con ambito
Parameters - Richiedi parametri
Atributes - Gli attributi memorizzati in pagina, richiesta, sessione e ambito dell'applicazione
È importante comprendere che l'oggetto Action è sempre disponibile nello stack di valori. Quindi, quindi, se il tuo oggetto Action ha proprietà“x” e “y” sono prontamente disponibili per l'uso.
Gli oggetti nell'ActionContext vengono indicati utilizzando il simbolo cancelletto, tuttavia è possibile fare riferimento direttamente agli oggetti nello stack di valori.
Ad esempio, if employee è una proprietà di una classe di azione, quindi può essere referenziato come segue:
<s:property value = "name"/>
invece di
<s:property value = "#name"/>
Se hai un attributo nella sessione chiamato "login" puoi recuperarlo come segue:
<s:property value = "#session.login"/>
OGNL supporta anche la gestione delle raccolte, ovvero Map, List e Set. Ad esempio, per visualizzare un elenco a discesa di colori, potresti fare:
<s:select name = "color" list = "{'red','yellow','green'}" />
L'espressione OGNL è intelligente per interpretare il "rosso", "giallo", "verde" come colori e costruire un elenco basato su questo.
Le espressioni OGNL saranno ampiamente utilizzate nei prossimi capitoli quando studieremo diversi tag. Quindi, piuttosto che guardarli isolatamente, guardiamoli usando alcuni esempi nella sezione Tag modulo / Tag di controllo / Tag dati e Tag Ajax.
ValueStack / OGNL Esempio
Crea azione
Consideriamo la seguente classe di azione in cui accediamo a valueStack e quindi impostiamo alcune chiavi a cui accederemo utilizzando OGNL nella nostra vista, ovvero la pagina 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;
}
}
In realtà, Struts 2 aggiunge la tua azione all'inizio del valueStack quando viene eseguita. Quindi, il modo usuale per inserire elementi nello Stack dei valori è aggiungere getter / setter per i valori alla classe Action e quindi utilizzare il tag <s: property> per accedere ai valori. Ma ti sto mostrando come funzionano esattamente ActionContext e ValueStack in struts.
Crea viste
Creiamo il file jsp di seguito HelloWorld.jspnella cartella WebContent nel tuo progetto eclipse. Questa visualizzazione verrà visualizzata nel caso in cui l'azione abbia esito positivo -
<%@ 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>
Dobbiamo anche creare index.jsp nella cartella WebContent il cui contenuto è il seguente:
<%@ 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>
File di configurazione
Di seguito è riportato il contenuto di struts.xml file -
<?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>
Di seguito è riportato il contenuto di web.xml file -
<?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>
Fare clic con il tasto destro sul nome del progetto e fare clic Export > WAR Fileper creare un file War. Quindi distribuire questo WAR nella directory webapps di Tomcat.
Infine, avvia il server Tomcat e prova ad accedere all'URL http://localhost:8080/HelloWorldStruts2/index.jsp. Questo produrrà la seguente schermata
Ora inserisci una parola nella casella di testo data e fai clic sul pulsante "Say Hello" per eseguire l'azione definita. Ora, se controllerai il log generato, troverai il seguente testo in fondo -
Size of the valueStack: 3
Verrà visualizzata la seguente schermata, che visualizzerà il valore immesso e il valore di key1 e key2 che abbiamo inserito in ValueStack.