¿Cuáles son las diferencias entre $ {} y # {}?


80

Estoy programando en JSF2 y NetBeans crea muchas páginas #{}que contienen una expresión. ¡Sin embargo, a veces en la web encontré ${}lo mismo!

¿Hay alguna diferencia? ¿Qué son?

Respuestas:


91
  • #{}son para expresiones diferidas (se resuelven dependiendo del ciclo de vida de la página) y se pueden usar para leer o escribir desde o hacia un bean o para realizar una llamada a un método .
  • ${}son expresiones de resolución inmediata , tan pronto como se encuentran se resuelven. Son de solo lectura.

Puede leer más aquí: http://docs.oracle.com/javaee/6/tutorial/doc/bnahr.html


12

Una búsqueda en Google de "Java Server Faces dollar pound" dio el siguiente resultado, de las preguntas frecuentes sobre el lenguaje de expresión JBoss :

¿Por qué algunas expresiones comienzan con libra y otras comienzan con el signo de dólar?

Para la especificación EL en sí, no hay diferencia. Depende de la tecnología que utilice el EL decidir qué significa. Tanto para JSP como para JSF, las expresiones que comienzan con un signo de almohadilla significan una evaluación diferida y un signo de dólar significa una evaluación inmediata . Todo esto tiene que ver con cuándo se evaluará realmente la expresión durante el procesamiento de la solicitud. El signo de almohadilla se usa en componentes JSF porque queremos que la expresión sea evaluada por el ciclo de vida JSF y no por el motor JSP o Facelets.


1
@ jean hominal: gracias por su respuesta ... mientras escribía, intenté buscar usando $ y # y no funcionó ... sin embargo, ¡no sabía que llamaba # "libra"! ¡Gracias también por esta información!
Filippo1980

9

¡Buena pregunta! Lo enfrenté una vez y, como tú, tuve muchos problemas para encontrar la respuesta ... hasta que me topé con esta documentación :

Una característica clave del EL unificado es su soporte para la evaluación inmediata y diferida de expresiones. La evaluación inmediata significa que el motor JSP evalúa la expresión y devuelve el resultado inmediatamente cuando la página se representa por primera vez. La evaluación diferida significa que la tecnología que utiliza el lenguaje de expresión puede emplear su propia maquinaria para evaluar la expresión en algún momento posterior durante el ciclo de vida de la página, cuando sea apropiado hacerlo. Las expresiones que se evalúan inmediatamente usan la sintaxis $ {}, que se introdujo con el lenguaje de expresiones JSP 2.0. Las expresiones cuya evaluación se aplaza utilizan la sintaxis # {}, que fue introducida con la tecnología JavaServer Faces.



5

La documentación de Java ofrece la siguiente explicación:

$ {customer.name}
# {customer.name}

El primero usa sintaxis de evaluación inmediata, mientras que el segundo usa sintaxis de evaluación diferida. La primera expresión accede a la propiedad del nombre, obtiene su valor, agrega el valor a la respuesta y se representa en la página. Lo mismo puede suceder con la segunda expresión. Sin embargo, el controlador de etiquetas puede aplazar la evaluación de esta expresión para un momento posterior en el ciclo de vida de la página, si la tecnología que utiliza esta etiqueta lo permite.

En el caso de la tecnología JavaServer Faces, la expresión de la última etiqueta se evalúa inmediatamente durante una solicitud inicial de la página. En este caso, esta expresión actúa como una expresión rvalue. Durante una solicitud de devolución de datos, esta expresión se puede utilizar para establecer el valor de la propiedad del nombre con la entrada del usuario. En este caso, la expresión actúa como una expresión de valor l.

Leer más aquí: expresiones de valor

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.