从javascript onload事件执行managebean方法

我怎样才能做一个Ajax请求,从JavaScript更新<h:dataTable> ? 我目前正在使用@Postconstruct加载初始数据,但这是显着延迟初始页面加载。

我正在考虑使用<body> HTML标签的onload事件来触发请求并更新数据表。

理论上讲 ,以下几点应该做到。

 <h:body> <f:ajax event="load" listener="#{bean.onload}" /> </h:body> 

 public void onload(AjaxBehaviourEvent event) { // ... } 

但是,由于某种原因,这不被支持。 我曾经发布过关于这个问题的报告 。

以下的作品,但实质上是一个黑客。

 <h:head> <title>JSF 2.0 onload hack</title> <script> window.onload = function() { document.getElementById('hidden:link').onclick(); } </script> </h:head> <h:body> <h:form id="hidden" style="display:none"> <h:commandLink id="link"> <f:ajax event="click" listener="#{bean.onload}" /> </h:commandLink> </h:form> </h:body> 

如果你碰巧使用PrimeFaces,那么你可以在autoRun设置为true使用它的<p:remoteCommand>

 <h:body> <h:form> <p:remoteCommand name="onload" action="#{bean.onload}" autoRun="true" /> </h:form> </h:body> 

或者如果您使用的是OmniFaces,那么您可以使用它的<o:commandScript>

 <h:body> <h:form> <o:commandScript name="onload" action="#{bean.onload}" /> <h:outputScript target="body">onload()</h:outputScript> </h:form> </h:body> 

<h:outputScript target="body"><script>呈现在<body> 。 即将推出的OmniFaces 2.2将通过新的autorun属性消除这种需求。

 <h:body> <h:form> <o:commandScript name="onload" action="#{bean.onload}" autorun="true" /> </h:form> </h:body> 

在jsf2.0中,你可以在任何其他的jsf标签中使用f:ajax标签

 <h:selectOneRadio id="myComponent" value="#{someBean.inputMethod}"> <f:selectItem itemValue="#{someBean.A}" itemLabel="A" /> <f:selectItem itemValue="#{someBean.B}" itemLabel="B" /> <f:ajax event="click" action=#{someBean.someMethod} /> </h:selectOneRadio> 

在这个例子中,someMethod在javasript的onClick事件中被执行,用于“myComponent”selectOneRadio

不知道这是你之后….