Ответ 1
Подводя итог на понятном языке: ${expression}
делает только get, а #{expression}
может выполнять как get, так и . Это связано с тем, что ${expression}
оценивается только один раз (немедленный), а #{expression}
оценивается при каждом доступе (отложен).
В JSF на JSP 2.0 или Facelets 1.x, когда вы помещаете что-то вроде этого в качестве первого выражения страницы
${bean.property}
где bean
- управляемый запрос с помощью bean, вы ничего не увидите. Но если bean
- это управляемый сеансом bean, который уже был создан ранее, вы увидите напечатанное значение свойства. Это также относится к тому, что ранее созданный bean с расширенным запросом создавался #{bean.xxx}
на той же странице.
Если вы вместо этого выполняете первое выражение страницы
#{bean.property}
тогда EL проверит, если bean
равно null, и если да, то он будет установить (создать) новый. Если свойство задано во время построения bean, то вы увидите, что свойство отображается этим выражением.
Это все, что необходимо, чтобы получить среди прочих JSF UIInput
компоненты, такие как <h:inputText>
для работы. Когда вы отправляете форму, #{expression}
будет установить значения в bean.