带有 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 视图已经在 JSF 生命周期的“恢复视图”阶段重新构建。关于如何克服这个问题的任何想法?
更新
看来我的假设是错误的。造成这种情况的原因似乎有所不同。 #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 中的自定义输入文本组件问题