2008-09-18 17 views
14

Widziałem jakiś kod jak poniżej w JSPatrybut testu w JSTL <c:if> tagu

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

Mój błąd jest nad „=”, który pojawia się w wartości atrybutu test. Rozumiem, że wszystko, co zawiera <%= %>, jest drukowane na wyjściu, ale z pewnością wartość przypisana do testu musi być wartością logiczną, więc dlaczego to działa?

Za punkty bonusowe, czy istnieje sposób zmiany wartości atrybutu powyżej, tak aby nie zawierał kodu skryptu? Przypuszczalnie oznacza to użycie EL.

Cheers, Don

+0

<%= => pobiera drukowane na wyjściu pojawia się tylko wtedy, gdy na zewnątrz znacznika JSP, a poniżej odpowiedź powiedział. Jednak * nie * jest obliczane na łańcuch znaków, ale jest konwertowane na typ oczekiwany przez atrybut. Atrybut 'test' tagu' 'ma typ' boolean', więc każde wyrażenie zwracane przez skryptlet będzie przekształcane na 'boolean'. – mksios

+0

Chociaż interesujące jest to, że po połączeniu ciągu znaków i skryptletu w atrybucie znacznika JSP, silnik zostaje pomieszany i interpretuje całą wartość jako ciąg znaków. Oznacza to, że '' nie uruchomi skryptletu, ale zamiast tego zmusi ciąg 'abc <%= true %>' do wartości logicznej przez 'Boolean.valueOf()', która zwraca 'false'. http://stackoverflow.com/questions/8168821/comparing-string-and-boolean-in-expression-language – mksios

Odpowiedz

16

Wszystko, czego szuka atrybut test w celu ustalenia, czy coś jest prawdą, jest ciągiem "true" (wielkość liter jest rozróżniana). Na przykład poniższy kod wyświetli komunikat "Hello world!"

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

Kod w <%= %> zwraca wartość logiczną, więc będzie albo wydrukować ciąg „true” lub „false”, który jest dokładnie to, co tag <c:if> szuka.

+0

Ściśle mówiąc, czy kod w ramach <%= %> nie zwraca wartości logicznej, lecz zwraca łańcuch? –

+0

@Don, request.isUserInRole() (który jest tym z <%= and %>) zwraca wartość boolowską. Mam nadzieję, że właśnie o to prosiliście. –

+1

W rzeczywistości moduł obsługi znaczników dla '' odbiera wartość dla atrybutu 'test' za pomocą metody ustawiającej, która oczekuje wartości logicznej. Program obsługi nie szuka łańcucha "true". Zamiast tego, powód, dla którego twój przykład działa z 'test =" true "', polega na tym, że EL wymusza ciąg 'true' na wartość logiczną przed ustawieniem atrybutu. Przymus jest wykonywany zgodnie z tymi zasadami: http://stackoverflow.com/questions/8168821/comparing-string-and-boolean-in-expression-language – mksios

2

Atrybuty w bibliotekach znaczników JSP w ogóle mogą być statyczne lub rozwiązane w momencie żądania. Jeśli zostaną rozwiązane w czasie żądania, strona JSP rozwiąże ich wartość w czasie wykonywania i przekaże dane wyjściowe do tagu. Oznacza to, że możesz umieścić praktycznie dowolny kod JSP w atrybucie, a znacznik będzie zachowywał się odpowiednio do tego, jaki wynik zostanie wygenerowany.

Jeśli spojrzysz na dokumentację taglib jstl, zobaczysz, które atrybuty są czasem reestacji, a które nie. http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

0

<% =%> sam zostanie wysłany na wyjście, w kontekście JSTL zostanie ocenione na sznurkiem

4

Wyrażenie pomiędzy <% =%> oceniano przed c : jeśli znacznik jest oceniany. Przypuśćmy, że | request.isUserInRole | zwraca | true |, Twój przykład zostanie oceniony na tym pierwszym:

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

, a następnie zostanie wykonany znacznik c: if.

11

Można również użyć coś jak

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

Jeśli zagnieżdżasz cytaty w JSTL, będziesz musiał użyć pojedyncze cytaty dla najbardziej wewnętrznych (w tym przypadku, wokół ''TestValue''). – hotshot309