2010-12-30 8 views
3

Ich habe den folgenden Code in meiner jsp:prüfen Anfrage Parameterwert in Struts2 Tag

<s:property value="#parameters['test']"/> 
<br/><s:property value="'1'.equals(#parameters['test'])"/> 

jetzt, wenn ich Zugriff auf diese Aktion wie folgt aus:? test.action test = 1

ich die folgende:

1 
false 

Fragen, warum 1 ist nicht gleich 1?

Antwort

3

bearbeiten: Es gibt einen Unterschied zwischen "" (doppelte Anführungszeichen) und '' (einfache Anführungszeichen) in OGNL.

Mit doppelten Anführungszeichen werden einzelne Zeichen in Zeichenfolgen ausgewertet, während einfache Anführungszeichen einzelne Zeichen in Zeichenarten auswerten. Sie können mehrere Zeichen in einfache Anführungszeichen setzen und es wird als eine Zeichenfolge ausgewertet.

weitere Anforderung Anwendungsbereich ist nicht

Map<String, String> 

aber

Map<String, String[]> 

wie in letzten 5 Zeilen der JSP gesehen unten werden kann.

JSP

<%@taglib prefix="s" uri="/struts-tags"%> 
<!-- values from action where letters = "abcd" --> 
<s:property value="letters"/><br/> <!-- Displays: abcd --> 
<s:property value="letters.equals('abcd')"/><br/> <!-- Displays: true --> 
<s:property value="'abcd'.compareTo('abcd')"/><br/> <!-- Displays: 0 --> 
<s:property value="'abcd'.compareTo('abcd') == 0"/><br/> <!-- Displays: true --> 
<s:property value="'abcd'.equals('abcd')"/><br/> <!-- Displays: true --> 
<s:property value="'abcd'.equals(letters)"/><br/> <!-- Displays: true --> 
<br/> 
<!-- RUN with ?test=a&test2=abc appended to the url --> 
<!-- Time for the numbers from action where number = 1--> 
<s:property value="number"/><br/><!-- Displays: 1 --> 
<s:property value="number.toString()"/><br/><!-- Displays: 1 --> 
<!-- OGNL strings in certain cases must be double quoted --> 
<s:property value='"1".equals(number.toString())'/><br/><!-- Displays: true --> 
<!-- As we can see single quotes does automatic type conversion to Character which is then evaluates false--> 
<s:property value="'1'.equals(number.toString())"/><br/><!-- Displays: false --> 
<!-- here a string is compared to an integer which is false--> 
<s:property value='"1".equals(number)'/><br/><!-- Displays: false --> 
<br/><!-- Request Variables --> 
<s:property value="#parameters['test']"/><br/><!-- Displays: a --> 
<!-- a is single quoted so automatic type conversion probably converted it to a Character, which is not equal to string "a" --> 
<s:property value="'a'.equals(#parameters['test'])"/><br/><!-- Displays: false --> 
<!-- both are strings so equality works as expected --> 
<s:property value='#parameters["test"]'/><br/><!-- Displays: a --> 
<s:property value='"a".equals(#parameters["test"])'/><br/><!-- Displays: false because #parameters["test"] is a string[] and calling toString on string[] does not work --> 
<!-- #parameters['test2'] now is 'abc' automatic type conversion of OGNL swill convert 'abc' to a string and so both are equal --> 
<s:property value='#parameters["test2"]'/><br/> 
<!-- Double quotes must be a string --> 
<s:property value='"abc".compareTo(#parameters["test2"]) == 0'/><br/><!-- Displays: true --> 
<!-- Single quote so automatic type conversion... string of chars is converted to String --> 
<s:property value="'abc'.compareTo(#parameters['test2']) == 0"/><br/><!-- Displays: true --> 
<!-- Out of curiosity I'd like to know if '1' is an Integer or a Byte --> 
<s:property value="'1'.toString()"/><br/><!-- Answer: Neither it prints "class java.lang.Character" --> 
<!-- 'a' is a Character however equals calls toString() --> 
<!-- But the request object (and session too) is not <string, string> but <string, string[]> --> 
1: <s:property value='"1".class'/><br/> <!-- class java.lang.String --> 
2: <s:property value='#parameters["test"].class'/><br/> <!-- Array of string: class [Ljava.lang.String; --> 
3: <s:property value='#parameters["test"][0].class'/><br/> <!-- This is what we need: class java.lang.String --> 
<s:property value='#parameters["test"][0].equals("a")'/><br/> <!-- Now this works --> 
<s:property value="#parameters['test'][0].equals('a'.toString())"/><br/> <!-- this is another way, leaving off the .toString results in false --> 

test.jsp (Aktion)

Paket struts2; importieren com.opensymphony.xwork2.ActionSupport;

public class test extends ActionSupport{ 
    public String letters = "abcd"; 
    public int number = 1; 
} 
+0

1 ist nur ein Beispiel. jeder String verhält sich gleich: funktioniert nicht – eumust

+0

Nun nein, weil == für eingebaute Typen ist. Strings können nicht auf diese Weise verglichen werden. Wenn #parameters ['test'] zu 'hallo' wird funktionieren. Wenn #parameters ['test'] eine Ganzzahl ergibt, wird funktionieren. – Quaternion

+0

gerade getestet: erzeugt false bei test.action? Test = hallo – eumust

0

Ich habe gerade festgestellt, dass #parameters ['test'] ein Array von String zurückgibt. Wenn Sie also sagen:

Sie tatsächlich eine Zeichenfolge '1' mit einem Array {'1'} vergleichen daher gibt es false zurück. Vielleicht ist dies, weil es zwei Parameter mit dem Namen übereinstimmen würde

richtige Sache zu tun

<s:property value="'1'.equals(#parameters['test'][0])"/> 
Verwandte Themen