Execute managebean method from javascript onload event Execute managebean method from javascript onload event javascript javascript

Execute managebean method from javascript onload event


In theory the following should do it.

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

with

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

However, this is not supported for some reason. I've ever posted an issue report about that.

The following works, but it's in essence a hack.

<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>

If you happen to use PrimeFaces, then you can use its <p:remoteCommand> with autoRun set to true.

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

Or if you're using OmniFaces, then you can use its <o:commandScript>

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

The <h:outputScript target="body"> renders the <script> in the end of the <body>. The upcoming OmniFaces 2.2 will remove this need by new autorun attribute.

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


in jsf2.0 you can use the f:ajax tag in almost any other jsf tag e.g

<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>

In this example the someMethod is excuted in the javasript onClick event for the "myComponent" selectOneRadio

Not sure if this is what you are after ....


I solved it by using the Metadata-Functions, as I could not use @PostContruct (FacesMessages are enqueued and not displayed when thrown in postconstruct mehtod... see last comment)

<f:metadata><f:viewAction action="#{bean.initProducts}" /></f:metadata><h:body><ui:composition template="/templates/commonTemplate.xhtml">    <ui:define name="body">        <h:panelGroup>            <h:dataTable id="table"                value="#{bean.getProducts}" var="product"              <!-- Table Stuff-->            </h:dataTable>        </h:panelGroup>    </ui:define></ui:composition>

I am very new to JSF so ... I DO NOT know very much about JSF's lifecycle phases, but this solution worked for me.