如何将 JSF 组件绑定到支持 bean 属性

Posted

技术标签:

【中文标题】如何将 JSF 组件绑定到支持 bean 属性【英文标题】:How to bind JSF component to backing bean property 【发布时间】:2012-04-01 04:23:17 【问题描述】:

我在将 p:commandButton 绑定到支持 bean 中的属性时遇到问题。我试图简化我的代码以显示总体思路。

ExampleBean 是一个支持 bean

public class ExampleBean 

    public String title;        
    List<ExampleWrapper> list;

    // Getters and setters


ExampleWrapper 是一个 POJO

public class Wrapper 

    public String name;
    public String description;

    public CommandButton button;

    // Listener which changes button state

    // Getters and setters

index.xhtml 是一个主页:

<h:form>
    <h:outputText value="Title" />
    <p:inpurText value="#exampleBean.title"

    <ui:include src="list.xhtml">
        <ui:param name="bean" value="#exampleBean">
    </ui:include>
</h:form>

list.xhtml 是我想在几个地方重复使用的片段:

<ui:composition ...>
    <ui:repeat id="list" var="exampleWrapper" value="#bean.list">
        <h:outputText value="#exampleWrapper.name"/>
        <h:outputTextarea value="#exampleWrapper.description"/>
        <p:commandButton id="button" binding="#exampleWrapper.button" 
            value="Button" />
</ui:composition>

所以,我得到了例外: javax.el.PropertyNotFoundException: /list.xhtml ... binding="#exampleWrapper.button": Target Unreachable, identifier 'exampleWrapper' 解析为 null

没有binding 属性一切正常并显示正常

您能否解释一下为什么以及如何将按钮绑定到此 POJO 属性?任何帮助将不胜感激

我正在使用 JSF 2.0.2 和 Primefaces 3.0.1

【问题讨论】:

【参考方案1】:

JSF UI 组件的binding(和id)属性在视图构建时被解析。 #exampleWrapper 实例在视图构建期间可用。视图构建时间是 XHTML 文件被解析为 JSF 组件树的那一刻。 #exampleWrapper 仅在视图渲染期间可用。视图渲染时间是 JSF 组件树生成 HTML 输出的时刻。

基本上,组件树中只有 一个 &lt;p:commandButton&gt; 生成的 HTML 输出是 &lt;ui:repeat&gt; 迭代次数的数倍。您需要将其绑定到 #bean,或者使用 JSTL &lt;c:forEach&gt; 而不是 &lt;ui:repeat&gt;。 JSTL 标签在视图构建期间运行,&lt;c:forEach&gt; 将因此在物理上产生多个 JSF UI 组件。但是,在 JSF 2.x 中,通常不需要将组件绑定到支持 bean。无论您想到什么功能要求,您认为这是解决方案,它肯定可以以更好的方式解决。

【讨论】:

那么,如何从另一个监听器更改按钮状态? 使用为此提供的属性。例如。 rendered="#exampleWrapper.rendered"styleClass="#exampleWrapper.styleClass"disabled="#exampleWrapper.disabled" 我找到了你对另一个问题的答案:***.com/a/2456652/657792 如果您遇到问题,请随时提出新问题。这是题外话。 @BalusC 这就是说每当我们使用binding时,如果我们手动刷新页面(f5),绑定组件的内容会因为你上面的解释而变得乱七八糟?

以上是关于如何将 JSF 组件绑定到支持 bean 属性的主要内容,如果未能解决你的问题,请参考以下文章

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

JSF 组件绑定 - 一些混乱

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

JSF组件的动态值绑定

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

是否可以注释要在阶段调用的支持 bean 方法?