2012-05-10 8 views
6

Ich möchte so etwas wie dies zu tun:char Vergleich in EL-Ausdruck

<c:if test="${somestring.charAt(0)=='1'}"> 
tadaaaam 
</c:if> 

wenn somestring ist „11011“, aber es funktioniert nicht. Ich kann es mit

${somestring.charAt(0)} 

drucken und es ist "1" aber Vergleich oben schlägt fehl. Der folgende Vergleich:

worx (Bedingung ist wahr) in reinem Java.

Irgendwelche Ideen?

+0

Kann nicht auf Tomcat 7 reproduzieren. Vielleicht könnten Sie uns den tatsächlichen Code zeigen, der nicht funktioniert? – Affe

+0

Ich führe es auf Tomcat 7. Vielleicht haben Sie keine JSTL-Bibliothek zu Ihrem Projekt hinzugefügt –

Antwort

8

EL scheint Probleme mit Char zu haben. Hier ist der einzige Weg, wie ich es zum Laufen bringen könnte.

<c:if test="${somestring.charAt(0) == '1'.charAt(0)}" > 
    tadaaaam 
</c:if> 
+0

Danke, es funktioniert so :) Ich wusste nicht, dass '1' String in diesem Fall ist. –

7

Das Verhalten ist genau wie erwartet und wie von der EL-Spezifikation gefordert. Wenn Sie Version 2.2 der EL-Spezifikation verwenden, müssen Sie Abschnitt 1.8.2 lesen, der die Regeln für den Operator "==" enthält.

Die Operanden sind in diesem Fall die eine somestring.charAt(0)char und '1' ist, die eine String (NOT a char) ist, da Strings, indem entweder in EL einfache oder doppelte Anführungszeichen abgegrenzt werden können.

Wenn wir Character == String haben, dann gilt das sechste Geschoss von 1.8.2 und beide werden zu Long-Werten gezwungen. Das Zeichen wird auf 49 (der ASCII-Code für 1) gezwungen und 1 wird zu 1 erzwungen. Diese sind nicht gleich, daher das Ergebnis, das Sie sehen.

Ich schätze, dass dies nicht das ist, was Sie erwarten, aber es ist das Verhalten, das von der Spezifikation erforderlich ist und durch die Tatsache ausgelöst wird, dass einfache Anführungszeichen in EL Zeichenfolgen nicht chars.

+0

Vielen Dank für Ihre Antwort. '1' ist in der Tat als String. Ich habe mich geirrt zu denken, dass es ein Charakter ist, ich muss mehr Spezifikation lesen :) –