基本上,我想迭代一个属性列表来呈现组件列表。 我正在使用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>
Bellow 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;
}
}
结果如下:
在Tomcat 8上测试: jsf-myfaces:2.1.13 jsf-mojarra:2.2.4
我很难找到有关使用复合材料构建和渲染时间的文档。
答案 0 :(得分:1)
你没有照顾组件的状态。
使用继承的StateHelper
方法提供的getStateHelper()
。
@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);
}
}