使用f:event postAddToView在PageLoad之后调用JSF ManageBean

时间:2010-08-18 01:29:59

标签: java javascript http jsf-2

我正在使用JSF 2.0编写应用程序。

对于其中一个页面,页面的某个部分需要很长时间才能显示。

为了改善用户体验,我想首先加载页面,然后在第一次加载后成功加载页面后自动执行Ajax回调到JSF管理bean对象。

我正在考虑使用类型为postAddView的f:event。

<h:outputText id="dummyId">
    <f:event type="postAddToView" listener="#{mngBean.doSomething}" />
</h:outputText>

然而,在第一次显示页面之前,似乎仍然正在处理 f:event postAddToView

我探索的其他选项是创建一个隐藏按钮并获取javascript来触发它。它工作但我只是想知道是否有一个很好的JSF组件/事件可以做到这一点而不是使用java脚本。

感谢您的帮助。

<h:commandButton id="dmyButton" 

值= “#{mngBean.getSomething}”  的ActionListener = “#{mngBean.doSomething}”  style =“display:none”  类型= “提交” &GT;

Java脚本

<script language="JavaScript">
 $(document).ready(function() {
  if (document.getElementById('form:dmyButton').value == 'true') {
   document.getElementById('form:dmyButton').click();
  }

 });
</script>

提前感谢您的所有帮助

2 个答案:

答案 0 :(得分:3)

我认为PreRenderViewEvent就是你想要的。

http://javaserverfaces.java.net/nonav/docs/2.0/javadocs/javax/faces/event/PreRenderViewEvent.html

虽然文档没有显示,但preRenderViewEvent确实可以使用f:event。我现在要修复文档。

答案 1 :(得分:0)

处理PostAddToViewEvent“在恢复视图阶段,在a之后 组件已添加到视图中。“(根据 Java Server Faces 2.0 - 完整参考),这意味着它确实处于生命周期的早期阶段(还原视图是第一个生命周期阶段)。

在这种情况下,我不认为任何PhaseListener会帮助你,因为它们都在服务器端运行,而不是在客户端运行。

但是,<f:ajax>可以应用于<h:body>event="load"。我试过了,但它没有真正起作用,<f:ajax>包裹<h:body>没有发生任何事情,反过来我遇到Unable to attach <f:ajax> to non-ClientBehaviorHolder parent错误。