如何将 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 输出的时刻。
基本上,组件树中只有 一个 <p:commandButton>
生成的 HTML 输出是 <ui:repeat>
迭代次数的数倍。您需要将其绑定到 #bean
,或者使用 JSTL <c:forEach>
而不是 <ui:repeat>
。 JSTL 标签在视图构建期间运行,<c:forEach>
将因此在物理上产生多个 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() - 何时使用哪个?