Привязка компонента JSF без свойства компонента

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

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

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

Спасибо

ОБНОВЛЕНИЕ: спецификация JSF2.0 [pdf] (глава 3.1.5) гласит:

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

1 ответ

Решение

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

Я не могу указать вам одну ссылку, где она была указана, поскольку ее нет. Вы должны прочитать спецификации EL и спецификации JSF по отдельности и сделать 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}"/>

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

Смотрите также:

Другие вопросы по тегам