Привязка компонента 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}"/>
который более самодокументирован.