带有 ui:define 的 JSF2.0 部分渲染

Posted

技术标签:

【中文标题】带有 ui:define 的 JSF2.0 部分渲染【英文标题】:JSF2.0 Partial Render with ui:define 【发布时间】:2011-06-03 02:39:12 【问题描述】:

我正在使用 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>

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

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

我认为这是因为 ui:define 视图已经在 J​​SF 生命周期的“恢复视图”阶段重新构建。关于如何克服这个问题的任何想法?

更新

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

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

【问题讨论】:

如果您已经回答了自己的问题,也许您可​​以将您的解决方案放入答案框中并接受它,以便其他人知道此问题已解决。添加解决它的代码可能对遇到相同问题的其他人有所帮助。 【参考方案1】:

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

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

【讨论】:

以上是关于带有 ui:define 的 JSF2.0 部分渲染的主要内容,如果未能解决你的问题,请参考以下文章

Managed Bean中的EJB3.0 @EJB注释JSF2 Websphere 7是不可能的?

带有 Eclipse 和 Tomcat 的 JSF 2.0 教程 [关闭]

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

JSF 页面元素无法从具有动作属性的支持 bean 触发方法。(JSF2.0 + primefaces)

如何在 JSF 2.0 中使用表单重新呈现页面的一部分?

JSF 2.0 部分状态保存似乎不起作用