【问题标题】:How to bind JSF component to backing bean property如何将 JSF 组件绑定到支持 bean 属性
【发布时间】: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

【问题讨论】:

    标签: java jsf jakarta-ee binding primefaces


    【解决方案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}"
    • 我找到了你对另一个问题的答案:stackoverflow.com/a/2456652/657792
    • 如果您遇到问题,请随时提出新问题。这是题外话。
    • @BalusC 这就是说每当我们使用binding时,如果我们手动刷新页面(f5),绑定组件的内容会因为你上面的解释而变得乱七八糟?
    猜你喜欢
    • 2016-03-03
    • 2011-06-29
    • 2011-07-24
    • 2011-12-31
    • 2012-06-19
    • 2015-02-26
    • 2012-07-16
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多