JSF <ui:repeat> <c:forEach> 复合 UINamingContainer
Posted
技术标签:
【中文标题】JSF <ui:repeat> <c:forEach> 复合 UINamingContainer【英文标题】:JSF <ui:repeat> <c:forEach> composite UINamingContainer 【发布时间】:2014-02-04 02:38:34 【问题描述】:基本上,我想遍历属性列表以呈现组件列表。 我正在使用 UIComponent 的组件类型,因为我需要为每个组件设置一个单独的范围。该组件有效,但我不知道如何从列表中为其提供参数。
这是一个简单的测试:
<ul>
<li>
<h:outputText value="test"/>
<h:outputLabel value=" : "/>
<bf:testA service="test"/>
<h:outputLabel value=" : "/>
<bf:testB service="test"/>
</li>
<c:forEach items='#serviceList.val' var="serviceval">
<li>
<h:outputText value="#serviceval"/>
<h:outputLabel value=" : "/>
<bf:testA service="#serviceval"/>
<h:outputLabel value=" : "/>
<bf:testB service="#serviceval"/>
</li>
</c:forEach>
<ui:repeat value="#serviceList.val" var="serviceval">
<li>
<h:outputText value="#serviceval"/>
<h:outputLabel value=" : "/>
<bf:testA service="#serviceval"/>
<h:outputLabel value=" : "/>
<bf:testB service="#serviceval"/>
</li>
</ui:repeat>
</ul>
下面的 testA 有效:
<c:interface>
<c:attribute name="service" />
</c:interface>
<c:implementation>
<h:outputText value="#cc.attrs.service"/>
</c:implementation>
而 testB 没有:
<c:interface componentType="testBComponent">
<c:attribute name="service" />
</c:interface>
<c:implementation>
<h:outputText value="#cc.attrs.service"/>
</c:implementation>
我需要 testB,因为它使用组件类型。
我的 TestBComponent 只是这个测试的一个简单 POJO:
@FacesComponent(value="testBComponent")
public class TestBComponent extends UINamingContainer
private String service;
public TestBComponent()
service = "Failed";
public String getService()
return service;
public void setService(String service)
this.service = service;
结果如下:
测试:测试:测试 test1:test1:失败 test2 : test2 : 失败 test3:test3:失败 test1:test1:失败 test2 : test2 : 失败 test3:test3:失败在 Tomcat 8 上测试: jsf-myfaces:2.1.13 jsf-mojarra:2.2.4
我很难找到有关使用复合材料构建和渲染时间的文档。
【问题讨论】:
【参考方案1】:你没有处理组件的状态。
使用继承的getStateHelper()
方法可用的StateHelper
。
@FacesComponent(value="testBComponent")
public class TestBComponent extends UINamingContainer
public TestBComponent()
setService("Failed");
public String getService()
return (String) getStateHelper().eval("service");
public void setService(String service)
getStateHelper().put("service", service);
另见:
How to save state when extending UIComponentBase How to prevent multiple composite components reset themselves on a JSF page?【讨论】:
自定义组件中没有局部变量,明白了!谢谢。 您可能有,但它们不会保存在 JSF 视图状态中。它们只会是“通常的 Java 方式”范围内的组件实例。在每个还原/构建视图期间都会创建组件实例。以上是关于JSF <ui:repeat> <c:forEach> 复合 UINamingContainer的主要内容,如果未能解决你的问题,请参考以下文章
JSF 2 - ui:repeat 中的自定义输入文本组件问题