Подтвердить что ты не робот

Выполнить метод managebean из javascript onload event

Как я могу сделать запрос ajax, который обновляет <h:dataTable> из javascript? В настоящее время я загружаю исходные данные с помощью @Postconstruct, но это значительно задерживает загрузку начальной страницы.

Я думаю об использовании события onload тега <body> HTML, чтобы запустить запрос и обновить данные.

4b9b3361

Ответ 1

В теории это должно быть сделано.

<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, вы можете использовать <p:remoteCommand> с autoRun установлен на true.

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

Ответ 2

в jsf2.0 вы можете использовать тег f: ajax почти в любом другом теге jsf, например,

<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

Не уверен, что это то, что вы после....