没有bean属性的JSF组件绑定

jar*_*jpa 12 el jsf-2

以下代码如何工作:

#{aaa.id}
<h:inputText id="txt1" binding="#{aaa}"/>
Run Code Online (Sandbox Code Playgroud)

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

谢谢

更新:JSF2.0规范[pdf](第3.1.5章)说:

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

Bal*_*usC 18

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

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

顺便说一句,为了避免新开发人员之间的混淆并避免与EL范围中的现有变量发生冲突,您可以java.util.HashMap在请求范围中使用a ,该范围在以下方面声明如下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>
Run Code Online (Sandbox Code Playgroud)

并按如下方式使用

#{components.aaa.id}
<h:inputText id="txt1" binding="#{components.aaa}"/>
Run Code Online (Sandbox Code Playgroud)

这更像是自我记录.

也可以看看: