ui的动态渲染:包含在包含的facelet中使用ui:repeat时的工作

时间:2014-07-14 13:50:46

标签: jsf jsf-2 primefaces

你好,

我将ui:include置于h:panelGroup内并在需要时动态呈现它。

通常的假设和理论是,当未呈现ui:include时,与包含页面关联的ManagedBean不应被初始化。

当我在包含的页面中使用ui:repeat时,不会发生这种情况。

以下是重复问题的示例:

page.1.xhtml

<h:body>
    <h:form>
        <p:outputLabel value="#{mBeanOne.beanOnetxt}"/><br/>
    </h:form>

    <h:panelGroup rendered="false" layout="block">
        <ui:include src="page2.xhtml"/>
    </h:panelGroup>
</h:body>

MBeanOne.java

@ManagedBean
@ViewScoped
public class MBeanOne implements Serializable{

    private String beanOnetxt;

    public MBeanOne() {
        System.out.println("MBeanOne - Constructor");
    }

    @PostConstruct
    public void init(){
        beanOnetxt = "This is Managed Bean 1";
        System.out.println("MBeanOne - Postconstruct");
    }
    //SETTERS and GETTERS
}

page2.xhtml

<h:body>
    <h:outputText value="#{mBeanTwo.beanTwotxt}"/><br/>

    <ui:repeat var="var" value="#{mBeanTwo.versionList}">
        <h:outputText value="#{var}"/><br/>
    </ui:repeat>
</h:body>

MBeanTwo.java

@ManagedBean
@ViewScoped
public class MBeanTwo implements Serializable{

    private String beanTwotxt;
    private List<String> versionList;

    public MBeanTwo() {
        System.out.println("MBeanTwo - Constructor");
    }

    @PostConstruct
    public void init(){
        beanTwotxt = "This is Managed Bean 2";

        versionList = new ArrayList<String>();
        versionList.add("Playground");
        versionList.add("Kestrel");
        versionList.add("Merlin");
        versionList.add("Tiger");

        System.out.println("MBeanTwo - Postconstruct");
    }
    //SETTER and GETTER
}

正如您在page1.xhtml中看到的那样,rendered="false"使用了h:paneGroup来封装ui:include,但是MBeanTwo在我加载时page1.xhtml正在初始化{{} 1}}。

如果我从ui:repeat移除page2.xhtml,则MBeanTwo未初始化。

这是JSF中的错误,如果有的话可以使用任何解决方法吗?

使用和测试的版本:
Primefaces 3.5
JSF 2.1.13和2.2.0-m05

1 个答案:

答案 0 :(得分:1)

<ui:include />篇与您的问题无关,可能是在同一视图中以相同行为完成的所有内容。

无论如何,在进行bean初始化之前,似乎<ui:repeat />标签没有检查其父项rendered属性。但是,永远不会评估mBeanTwo#getVersionList方法,只创建托管bean。如果在构造bean时执行数据访问,这可能会使您减速,但永远不应该破坏您的视图。我能够在Mojarra 2.1.x版本中重现这个问题,但他们已经修复了2.2.x最新的未成年人。

似乎是一个Mojarra实现错误,而不是预期的行为。

另见: