没有 bean 属性的 JSF 组件绑定
Posted
技术标签:
【中文标题】没有 bean 属性的 JSF 组件绑定【英文标题】:JSF component binding without bean property 【发布时间】:2011-12-31 09:12:28 【问题描述】:以下代码究竟是如何工作的:
#aaa.id
<h:inputText id="txt1" binding="#aaa"/>
我的意思是,通常组件绑定通过在 bean 中指定一个属性(UIComponent 类型)来工作。在这里,没有 bean 也没有属性,但名称“aaa”被正确绑定(显示组件 id - “txt1”)。它是如何工作的/在哪里指定的?
谢谢
更新:The JSF2.0 Spec [pdf](第 3.1.5 章)说:
“组件绑定是一种特殊的值表达式,可用于帮助将组件实例“连接”到 JavaBean 的相应属性... 指定的 ValueExpression 必须指向 UIComponent 类型的读写 JavaBeans 属性(或 适当的子类)。”
【问题讨论】:
【参考方案1】:在构建视图树的过程中,它被置于默认的 EL 范围内(此时所有 binding
属性 - 以及标签处理程序的属性,如 JSTL <c:xxx>
和 JSF <f:xxx>
- 正在被评估)。在视图树的渲染过程中,它通过普通的 EL 方式显示。视图树的渲染发生在视图树构建之后,因此它以这种方式工作。这段代码并不是像你对源代码所期望的那样“逐行”运行。
我不能指出一个单独的参考,因为它没有被指定。您必须分别阅读 EL spec 和 JSF spec 并执行 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"/>
这更能自我记录。
另见:
How does the 'binding' attribute work in JSF? When and how should it be used?【讨论】:
感谢 BalusC 的回复。我确实在您的代码中多次看到它。渲染自然清晰,我的意思是名称如何界定。我已经用 JSF Spec 的摘录更新了这篇文章,其中明确指出给定的 ValueExpression 必须是 Bean 属性。 您也可以将 EL 解释为“一个大的虚拟 javabean”。在binding
上,JSF 将检查属性是否已经存在,如果存在,则从中获取组件(必须确实是正确子类的实例),如果不存在,则自动创建组件并放入其中。请注意,属性类型可以是Object
或组件实例的任何其他超类。
好的,我喜欢这个解释。所以结论是,“绑定”属性是一种在 EL 范围内保存某事(在本例中为组件)的方式。很有趣。
只是提到它,因为我必须(部分)自己意识到它:例如#components.aaa 是一个不好的例子。更好的是 #components[myAbsolutelyUniqueId] - 唯一,因为如果你有 2 个 panelGrids 或数据表,相同的 Id 将在两者中有效,因为 jsf 为其添加前缀。它也将以不同的形式有效。
h:inputText with binding="#var" 在输入数值时抛出异常。数字有限制吗?可以使用哪种类型的对象?以上是关于没有 bean 属性的 JSF 组件绑定的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JSF 中正确使用组件绑定? (会话范围 bean 中的请求范围组件)