Привязка компонента JSF без свойства компонента - PullRequest
12 голосов
/ 17 ноября 2011

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

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

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

Спасибо

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

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

1 Ответ

18 голосов
/ 17 ноября 2011

Он был помещен в область видимости 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}"/>

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

См. также:

...