de resumir en un lenguaje claro: ${expression}
hace solamente obtener, mientras #{expression}
puede hacer ambas cosas obtener y conjunto. Esto se debe a que el ${expression}
se evalúa solo una vez (inmediato), mientras que el #{expression}
se evalúa en cada acceso (diferido).
En JSF en JSP 2.0 o Facelets 1.x, cuando se pone algo así como la primera expresión de la página
${bean.property}
donde bean
es una petición en ámbito bean gestionado, verá nada . Pero si bean
es un bean administrado con ámbito de sesión y ya se ha creado antes, verá el valor de la propiedad que se imprime. Esto también se aplica si el bean administrado con ámbito de solicitud se crea antes en #{bean.xxx}
en la misma página.
Si en lugar de hacerlo como primera expresión de la página
#{bean.property}
entonces EL comprobará si bean
es nulo y si es así, entonces será establecer (crear) una nueva. Si la propiedad se establece durante la construcción del bean, verá que esta expresión muestra la propiedad.
Todo esto es obligatorio para obtener entre otros componentes JSF UIInput
como <h:inputText>
para funcionar. Cuando envíe el formulario, #{expression}
establecerá los valores en el bean.