JSF <ui:repeat> <c:foreach>复合UINamingContainer </c:foreach> </ui:repeat>

时间:2014-01-15 14:51:41

标签: jsf jsf-2 facelets custom-component

基本上,我想迭代一个属性列表来呈现组件列表。 我正在使用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;
    }
}

结果如下:

        
  • test:test:test
  •     
  • 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 个答案:

答案 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);
    }

}

另见: