【问题标题】:JSF <ui:repeat> <c:forEach> composite UINamingContainerJSF <ui:repeat> <c:forEach> 复合 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

我很难找到有关使用复合材料构建和渲染时间的文档。

【问题讨论】:

    标签: jsf jsf-2 facelets custom-component


    【解决方案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);
        }
    
    }
    

    另见:

    【讨论】:

    • 自定义组件中没有局部变量,明白了!谢谢。
    • 您可能有,但它们不会保存在 JSF 视图状态中。它们只会是“通常的 Java 方式”范围内的组件实例。在每个还原/构建视图期间都会创建组件实例。
    猜你喜欢
    • 2011-03-30
    • 2012-11-14
    • 2013-06-29
    • 2011-04-02
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    相关资源
    最近更新 更多