2008-09-18 7 views
14

Ich sah einige Code wie folgt in einer JSPTest Attribut in JSTL <c:if> Tag

<c:if test="<%=request.isUserInRole(RoleEnum.USER.getCode())%>"> 
    <li>user</li> 
</c:if> 

Meine Verwirrung ist über die „=“, die in dem Wert des test Attribut erscheint. Mein Verständnis war, dass alles, was in <%= %> enthalten ist, auf die Ausgabe gedruckt wird, aber sicherlich muss der Wert, der dem Test zugewiesen wird, ein Boolescher Wert sein. Warum funktioniert das?

Gibt es für Bonuspunkte eine Möglichkeit, den Attributwert darüber zu ändern, so dass kein Skriptcode verwendet wird? Vermutlich heißt das, stattdessen EL zu verwenden.

Cheers, Don

+0

<%= => wird gedruckt mit dem Ausgang nur verwenden, wenn es außerhalb eines JSP-Tag erscheint, als eine Antwort, sagte unten. Es wird jedoch * nicht * zu einer Zeichenkette ausgewertet, sondern zu dem Typ konvertiert, den das Attribut erwartet. Das Attribut 'test' des' '-Tags hat den Typ' boolean', also wird jeder Ausdruck, den das Scriptlet zurückgibt, zu einem 'boolean' gezwungen. – mksios

+0

Obwohl es interessant zu sehen ist, dass wenn Sie Zeichenfolge und Scriptlet innerhalb eines JSP-Tag-Attributs mischen, die Engine verwirrt wird und den gesamten Wert als Zeichenfolge interpretiert. Das heißt, 'führt das Scriptlet nicht aus, sondern erzwingt stattdessen den String' abc <%= true %> 'über' Boolean.valueOf() 'in einen booleschen Wert, der' false' zurückgibt. http://StackOverflow.com/Questions/8168821/Comparing-String-and-Boolean-in-Expression-Sprache – mksios

Antwort

16

Alles, was das Attribut test sucht, um festzustellen, ob etwas wahr ist, ist die Zeichenfolge "true" (Groß-/Kleinschreibung beachten). Der folgende Code wird beispielsweise "Hello world!"

<c:if test="true">Hello world!</c:if> 

Der Code innerhalb der <%= %> gibt einen boolean, so wird es entweder die Zeichenfolge „wahr“ oder „falsch“, das ist genau das drucken, was der <c:if> Tag sucht.

+0

Streng genommen, gibt der Code innerhalb <%= %> einen String, anstatt einen booleschen? –

+0

@Don, request.isUserInRole() (das ist der in <%= and %>) gibt einen booleschen Wert zurück. Hoffe, das ist, was du gefragt hast. –

+1

Tatsächlich erhält der Tag-Handler für '' den Wert für das 'test'-Attribut über eine Setter-Methode, die einen booleschen Wert erwartet. Der Handler sucht nicht nach der Zeichenfolge "true". Der Grund, warum Ihr Beispiel mit 'test =" true "' arbeitet, ist, dass EL die Zeichenkette 'true' vor dem Setzen des Attributs auf einen booleschen Wert setzt. Der Zwang wird nach diesen Regeln ausgeführt: http://stackoverflow.com/questions/8168821/comaring-string-and-boolean-in-expression-language – mksios

2

Attribute in JSP-Tag-Bibliotheken im Allgemeinen kann entweder statisch oder auf Wunsch Zeit gelöst werden. Wenn sie zum Zeitpunkt der Anforderung aufgelöst werden, löst die JSP ihren Wert zur Laufzeit auf und übergibt die Ausgabe an das Tag. Dies bedeutet, dass Sie so ziemlich jeden beliebigen JSP-Code in das Attribut einfügen können, und das Tag wird sich entsprechend der Ausgabe verhalten, die erzeugt wird.

Wenn Sie sich die jstl taglib docs ansehen, können Sie sehen, welche Attribute die beste Zeit sind und welche nicht. http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

0

<% =%> allein wird an den Ausgang, wird der JSTL im Kontext gesendet werden, um es einer Schnur

4

Der Ausdruck zwischen der <% =% bewertet werden> vor dem c ausgewertet wird : Wenn das Tag ausgewertet wird. Angenommen, dass | request.isUserInRole |

<c:if test="true"> 
    <li>user</li> 
</c:if> 

und dann das c: Rückkehr | | wahr, würde Ihr Beispiel dieser ersten ausgewertet werden, wenn Tag ausgeführt werden würde.

11

Sie können auch so etwas wie

<c:if test="${ testObject.testPropert == "testValue" }">...</c:if> 
+7

Wenn Sie Zitate in der JSTL verschachteln, müssen Sie verwenden einfache Anführungszeichen für die innersten (in diesem Fall um "testValue"). – hotshot309