没有bean属性的JSF组件绑定

时间:2011-11-17 13:58:56

标签: jsf-2 el

以下代码的工作原理如何:

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

我的意思是,通常组件绑定通过在bean中指定属性(类型为UIComponent)来工作。这里没有bean也没有属性但是名称“aaa”被正确绑定(显示组件id - “txt1”)。它是如何工作的/指定的位置?

由于

更新:The JSF2.0 Spec [pdf](第3.1.5章)说:

  

“组件绑定是一种特殊的值表达式,可用于促进将组件实例”连接“到a   JavaBean的相应属性...指定的ValueExpression必须指向UIComponent类型的读写JavaBeans属性(或   适当的子类)。“

1 个答案:

答案 0 :(得分:18)

在构建视图树期间(即所有binding属性时)和JSTL <c:xxx>和JSF <f:xxx>等标记处理程序的属性,它被放入默认的EL范围中 - 正在评估中)。在渲染视图树期间,它通过普通EL方式显示。在构建视图树之后,视图树的渲染发生,因此它以这种方式工作。并不是说这个代码是“逐行”运行的,正如您对源代码所期望的那样。

我不能指出你指定的单一参考,因为没有。您必须分别阅读EL specJSF spec并执行1 + 1 = 2。

顺便说一句,为了避免新开发人员之间的混淆并避免与EL范围中的现有变量冲突,您可以在faces-config.xml中声明如下的请求范围中使用java.util.HashMap

<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}"/>

更自我记录。

另见: