没有 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 &lt;c:xxx&gt; 和 JSF &lt;f:xxx&gt; - 正在被评估)。在视图树的渲染过程中,它通过普通的 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 组件绑定 - 一些混乱

如何在 JSF 中正确使用组件绑定? (会话范围 bean 中的请求范围组件)

JSF组件的动态值绑定

组件绑定与 findComponent() - 何时使用哪个?

在同一个组件中使用 JSF 绑定 + 验证器显示消息两次

<p:gmap 组件的绑定不起作用 - Primefaces 3.4.1