我正在使用facelet模板,并且我认为ui:define和JSF生命周期遇到了问题。我的template.xhtml在标题中包含一个固定菜单,简化了它具有如下链接:

<h:commandLink value="Click Me">
    <f:ajax update="#{myBean.listener}" render="contentpanel"/>
</h:commandLink>


template.xhtml还包含ui:insert语句:

<ui:insert name="content">
    <h:outputLabel value="content placeholder"/>
</ui:insert>


现在我有一个content.xhtml看起来像:

<ui:composition template="template.xhtml">
    <ui:define name="content">
        <h:panelGroup id="contentpanel"/>
    </ui:define>
</ui:composition>


这么多的介绍。当我单击命令链接“ Click Me”时,我正在呼叫我的监听器。该侦听器在backingbean中设置一个引用,以根据我单击的链接动态加载内容。

第一次按下命令链接时,不会完成此渲染。好吧,基本上看起来像是先进行重新渲染,然后再调用侦听器,而不是相反。因此,当我第一次单击时,似乎什么都没有发生。当我第二次单击时,会看到为第一次单击设置的内容。当我第三次单击时,我看到第二次单击的内容。

我认为这是因为ui:define视图已经在JSF生命周期的“还原视图”阶段中进行了重建。关于如何克服这一点的任何想法?

更新

似乎我的假设是错误的。造成这种情况的原因似乎有所不同。 #{myBean.listener}具有一个@SessionScoped @ManagedProperty,在单击CommandLink后会对其进行更新。内容面板实际上是通过#{myBean.data}加载数据的。此@RequestScoped没有正确重新加载数据。我通过将#{myBean.data}方法直接传递给getData() bean来解决它。

可能会有些混乱。但是我的结论是:确实可以部分渲染通过facelet模板(@SessionScoped)加载的组件

最佳答案

似乎我的假设是错误的。造成这种情况的原因似乎有所不同。 #{myBean.listener}具有一个@SessionScoped @ManagedProperty,在单击CommandLink之后会对其进行更新。内容面板实际上是通过@RequestScoped的#{myBean.data}加载数据的。 #{myBean.data}无法正确重新加载数据。我通过将getData()方法直接传递给@SessionScoped bean解决了它。

可能会有些混乱。但是我的结论是:它确实可以部分渲染通过facelet模板加载的组件(ui:define / ui:insert)

关于java - 带有ui:define的JSF2.0部分渲染,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4589087/

10-11 22:11
查看更多