Was ist der Unterschied zwischen #,% und $ Zeichen in Struts-Tags?

74

Ich arbeite mit Struts2 und wenn ich auf Wertestapelvariablen zugreife, weiß ich nicht, ob ich %oder #oder verwenden soll $. Ich probiere sie alle aus, bis ich die richtige gefunden habe.

Kann jemand erklären, was der Unterschied zwischen diesen ist?

Khashayar
quelle

Antworten:

111

Verwendung von # (Pfundzeichen)

OGNL wird verwendet, um auf Objekte im ActionContext wie folgt zu verweisen:

  • objectName: Objekt im ValueStack (Standard- / Stammobjekt im OGNL-Kontext), z. B. eine Action-Eigenschaft
  • #objectName: Objekt im ActionContext, aber außerhalb des ValueStack, speziell ...
    • #objectName: ActionContext-Objekt, das mit den Struts2-Daten-Tags mit dem Standardaktionsbereich erstellt wurde (z. B. <s:set name="foo" value="'Testing'" />referenziert von <s:property value="#foo" />)
    • #parameters.objectName: Anforderungsparameter
    • #request.objectName: Attribut mit Anforderungsbereich
    • #session.objectName: Attribut mit Sitzungsbereich
    • #application.objectName: Attribut mit Anwendungsbereich
    • #attr.objectName: Attribut in Seite, Anforderung, Sitzung oder Anwendungsbereich (in dieser Reihenfolge gesucht)

Die oben genannten Kartenreferenzen mit Gültigkeitsbereich (Parameter, Anforderung, Sitzung und Anwendung) können auf zwei Arten erstellt werden:

  • #scopeName.objectName oder
  • #scopeName['objectName']

Verwendung von% (Prozentzeichen)

%{ OGNL expression } wird verwendet, um die OGNL-Auswertung eines Attributs zu erzwingen, das normalerweise als String-Literal interpretiert wird.

Beispiel: <s:property value="myProperty" default="%{myDynamicDefaultValue}" />

Verwendung von @ (am Zeichen)

Das @ -Symbol wird verwendet, um auf statische Eigenschaften und Methoden zu verweisen. Beachten Sie, dass Sie dies möglicherweise in Ihren Struts2-Eigenschaften aktivieren müssen:struts.ognl.allowStaticMethodAccess=true

Beispiele:

@my.package.ClassName@MY_STATIC_PROPERTY
@my.package.ClassName@myStaticMethod

Verwendung von $ (Dollarzeichen)

Struts2 OGNL verwendet das Dollarzeichen nicht besonders. Es kann jedoch verwendet werden, um normale JSTL-Ausdrücke auszuwerten. Zum Beispiel:

Struts2: <h1><s:property value="#pageTitle" /></h1>
(entspricht ...)
JSTL:<h1>${pageTitle}</h1>

Devon Biere
quelle
7
Über $ Bitte beachten Sie, dass das <s:property>xss hack sicher ist, während ${}es nicht ist. Verwenden Sie ${}mit Vorsicht!
Alireza Fattahi
Genau, wie wir in Ihren Fragen und
Antworten
Verlassen Sie sich nicht darauf, dass allowStaticMethodAccesses bald aus dem Struts-
Alireza Fattahi
10

Das Framework verwendet einen Standard-Namenskontext, um OGNL-Ausdrücke auszuwerten. Das Objekt der obersten Ebene, das sich mit OGNL befasst, ist eine Karte (normalerweise als Kontextkarte oder Kontext bezeichnet). OGNL hat die Vorstellung, dass sich im Kontext ein Stammobjekt (oder ein Standardobjekt) befindet. Im Ausdruck können die Eigenschaften des Stammobjekts ohne einen speziellen "Marker" -Begriff referenziert werden. Verweise auf andere Objekte sind mit einem Nummernzeichen (#) gekennzeichnet.

Das Framework legt den OGNL-Kontext als unseren ActionContext und den Wertestapel als das OGNL-Stammobjekt fest. (Der Wertestapel besteht aus mehreren Objekten, für OGNL scheint es sich jedoch um ein einzelnes Objekt zu handeln.) Zusammen mit dem Wertestapel platziert das Framework andere Objekte im ActionContext, einschließlich Maps, die den Anwendungs-, Sitzungs- und Anforderungskontext darstellen. Diese Objekte existieren im ActionContext neben dem Wertestapel (unserem OGNL-Stamm).

                 |
                 |--application
                 |
                 |--session
   context map---|
                 |--value stack(root)
                 |
                 |--request
                 |
                 |--parameters
                 |
                 |--attr (searches page, request, session, then application scopes)

Weitere Informationen finden Sie hier

OGNL-Basis

Im Grunde genommen setzt struts2 den Objektwert Stack als oberstes Objekt und OGNL wird verwendet, um auf sie zu verweisen. Das Wurzelobjekt kann ohne spezielle "Markierung" oder mit %referenziert werden, während Verweise auf andere Objekte mit einem Nummernzeichen (#) gekennzeichnet sind. # wird grundsätzlich verwendet, um Objekte / Werte aus Anwendung / Sitzung usw. zu referenzieren.

Umesh Awasthi
quelle
<s: iterator value = "sites" status = "portStatus2"> <tr> <td> <s: a href = "#" onclick = "javascript: window.open ('% {link}');"> < s: property value = "name" /> </ s: a> </ td> </ tr> </ s: iterator>
Khashayar
Welcher Link ist hier, da ich dies nicht sehen kann, aber dementsprechend sollte es das oberste Element im Wertestapel sein oder wenn Sie einen Iterator verwenden und seinen Wert referenzieren, bedeutet dies, wenn sich der Iterator durch den Wert bewegt, e = es jedes einzelne Element platziert oben auf dem Wertestapel nacheinander und% {link}
verweist auf
Tut mir leid, ich bin neu auf dieser Seite. Ich meinte in meinem Programm, ich habe eine Liste mit dem Namen Orte und ich mache das! <s: iterator value = "l" status = "portStatus"> <s: if test = "% {# portStatus.count == page + 1}"> <tr> <td rowspan = "11" width = "50 % "align =" right "> <img src =" $ {imagePath} "alt =" Logo "/> </ td> </ tr> <tr> <td> <s: a href =" # "onclick = "javascript: window.open ('% {link}');"> <s: property value = "name" /> </ s: a> </ td> </ tr> </ s: iterator> Dies ist arbeiten, aber ich weiß nicht, warum ich dieses Zeug dort setzen !! Ich versuche sie alle, um eine Antwort zu bekommen !!
Khashayar
Zunächst sollten Sie sich besser mit struts2 vertraut machen, um herauszufinden, was der Wertestapel ist und wie OGNL darin funktioniert. Dies hilft Ihnen dabei, besser zu verstehen.
Umesh Awasthi
Das ist gut, denn um zu verstehen, müssen Sie zuerst verstehen, wie das Struts2-Framework das Objekt in den
Wertestapel
0

Nur um das @Devon Biere zu vervollständigen ...

Verwendung von $ (Dollarzeichen)

Sie können auch ${}in Ihren Ressourcendateien verwenden. Die Streben verwenden automatisch OGNL zum Parsen ${}. Zum Beispiel

sample.foo.bar=This is some ${someProperty} //If the someProperty is in valueStack
sample.welcome.message=Welcome dear ${#session.CurrentUser.farsiFirstName}

Bitte beachten Sie, dass das $Zeichen hier nur ein Auslöser ist, der die Streben auffordert, die Zeichenfolge anhand von OGNL zu bewerten. Verwechseln Sie sie bitte nicht mit ${}JSTL

Struts 2 Dynamische Nachricht mit OGNL

Alireza Fattahi
quelle