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的主要内容,如果未能解决你的问题,请参考以下文章

使用 ui:repeat 输出 ResultSet

有条件地渲染 tr,使用 ui:repeat 构建表

JSF 2 - ui:repeat 中的自定义输入文本组件问题

使用 JSF ui:repeat 循环执行带状态的逻辑

如何使用 <f:ajax render> 重新渲染 <ui:repeat>

在 <ui:repeat> 中指定元素的条件渲染? <c:if> 似乎不起作用