以下代码的工作原理如何:
#{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属性(或 适当的子类)。“
答案 0 :(得分:18)
在构建视图树期间(即所有binding
属性时)和JSTL <c:xxx>
和JSF <f:xxx>
等标记处理程序的属性,它被放入默认的EL范围中 - 正在评估中)。在渲染视图树期间,它通过普通EL方式显示。在构建视图树之后,视图树的渲染发生,因此它以这种方式工作。并不是说这个代码是“逐行”运行的,正如您对源代码所期望的那样。
我不能指出你指定的单一参考,因为没有。您必须分别阅读EL spec和JSF 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}"/>
更自我记录。