2008-09-18 29 views
14

vi algo de código como el siguiente en un JSPatributo test en JSTL <c:if> etiqueta

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

Mi confusión es el "=" que aparece en el valor del atributo test. Según tengo entendido, cualquier cosa incluida en <%= %> se imprime en la salida, pero seguramente el valor asignado para la prueba debe ser booleano, entonces, ¿por qué funciona esto?

Para puntos de bonificación, ¿hay alguna forma de cambiar el valor de atributo anterior para que no use el código scriptlet? Presumiblemente, eso significa usar EL en su lugar.

Saludos, Don

+0

<%= => que se imprime a la salida sólo si aparece fuera de una etiqueta JSP, como a continuación una respuesta dijo. Sin embargo, * no * se evalúa a una cadena sino que se convierte al tipo que el atributo espera. El atributo 'test' de la etiqueta' 'es de tipo' boolean', por lo que cualquier expresión que devuelva scriptlet será forzada a 'boolean'. – mksios

+0

Aunque es interesante ver que si mezcla string y scriptlet dentro de un atributo de etiqueta JSP, el motor se confunde e interpreta todo el valor como una cadena. Es decir, '' no ejecutará el scriptlet sino que coaccionará la cadena 'abc <%= true %>' a un booleano vía 'Boolean.valueOf()' que devuelve 'false'. http://stackoverflow.com/questions/8168821/comparing-string-and-boolean-in-expression-language – mksios

Respuesta

16

Todo lo que el atributo test busca para determinar si algo es verdadero es la cadena "verdadera" (caso no sensible). Por ejemplo, el siguiente código imprimirá "Hello world!"

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

El código dentro del <%= %> devuelve un valor lógico, por lo que o bien imprimir la cadena "verdadero" o "falso", que es exactamente lo que se ve la etiqueta de <c:if>.

+0

Estrictamente hablando, ¿no devuelve el código dentro de <%= %> un String, en lugar de un booleano? –

+0

@Don, request.isUserInRole() (que es el que está dentro de <%= and %>) devuelve un valor booleano. Espero que esto sea lo que estabas preguntando. –

+1

En realidad, el controlador de etiquetas para '' recibe el valor para el atributo 'test' a través de un método setter que espera un booleano. El controlador no busca la cadena "verdadera". En cambio, la razón por la que su ejemplo funciona con 'test =" true "' es porque EL coacciona la cadena 'true' a un booleano antes de configurar el atributo. La coacción se realiza de acuerdo con estas reglas: http://stackoverflow.com/questions/8168821/comparing-string-and-boolean-in-expression-language – mksios

2

atributos en las bibliotecas de etiquetas JSP en general pueden ser estáticos o resueltos durante la petición. Si se resuelven en el momento de la solicitud, el JSP resolverá su valor en tiempo de ejecución y pasará la salida a la etiqueta. Esto significa que puede poner prácticamente cualquier código JSP en el atributo y la etiqueta se comportará de acuerdo con la salida que produzca.

Si mira los documentos de jstl taglib, puede ver qué atributos son de tiempo de publicación y cuáles no. http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

0

<% =%> por sí mismo será enviado a la salida, en el contexto de la JSTL será evaluado a una cadena

4

La expresión entre el <% =%> se evalúa antes de la c : si la etiqueta es evaluada. Entonces, supongamos que | request.isUserInRole | devoluciones | verdadero |, tu ejemplo serían evaluados a esta primera:

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

y luego el directorio c: si sería ejecutado etiqueta.

11

También puede usar algo como

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

Si está anidando comillas en el JSTL, tendrá que usar comillas simples para las más internas (en este caso, alrededor de ''testValue''). – hotshot309

Cuestiones relacionadas