Связывание компонента JSF без свойства bean

Как работает следующий код:

#{aaa.id}
<h:inputText id="txt1" binding="#{aaa}"/>

Я имею в виду, что обычно связывание компонентов работает, задавая свойство (типа UIComponent) в bean. Здесь нет bean или свойства, но, тем не менее, имя "aaa" правильно привязывается (отображение идентификатора компонента - "txt1" ). Как это работает/где указано?

Спасибо

UPDATE: спецификация JSF2.0 (глава 3.1.5) гласит: "Связывание компонентов - это специальное выражение выражения, которое может использоваться для облегчения" подключения "экземпляра компонента к соответствующее свойство JavaBean... Указанное ValueExpression должно указывать на свойство JavaBeans чтения-записи типа UIComponent (или соответствующий подкласс).

Ответ 1

Он был помещен в область EL по умолчанию при создании дерева представлений (когда все атрибуты binding - и атрибуты обработчиков тегов, таких как JSTL <c:xxx> и JSF <f:xxx>) оцениваются). Это проявляется обычными EL средствами при рендеринге дерева представлений. Оказание дерева просмотров происходит после построения дерева представлений, поэтому оно работает именно так. Это не значит, что этот код работает "по строкам", как вы ожидали от источника.

Я не могу указать вам одну ссылку, где она указана, поскольку ее нет. Вам нужно будет прочитать как EL spec и JSF spec отдельно и сделать 1 + 1 = 2.

Кстати, чтобы избежать путаницы среди новых разработчиков и избежать столкновений с существующими переменными в областях EL, вы можете использовать java.util.HashMap в области запроса, которая в faces-config.xml была объявлена ​​следующим образом:

<managed-bean>
    <description>Holder of all component bindings.</description>
    <managed-bean-name>components</managed-bean-name>
    <managed-bean-class>java.util.HashMap</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

и используется следующим образом

#{components.aaa.id}
<h:inputText id="txt1" binding="#{components.aaa}"/>

который более самодокументирован.

См. также: