从 javascript onload 事件执行 managebean 方法

IT技术 java javascript jsf jsf-2
2021-02-06 16:10:16

如何发出<h:dataTable>从 javascript更新 a 的 ajax 请求我目前正在使用加载初始数据,@Postconstruct但这显着延迟了初始页面加载。

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

3个回答

理论上下面应该这样做。

<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>autoRunset 一起使用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>
理论它应该工作。不起作用。但是隐藏的按钮就像魅力一样
2021-03-14 16:10:16
primefaces 的事情做到了这一点,即使是重定向(只需从操作方法中返回您想要的页面)
2021-03-18 16:10:16
@BalusC 我无法打开问题报告超链接。那个问题解决了吗?
2021-03-27 16:10:16

在 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 执行

不确定这是否是您所追求的......

谢谢,我希望在页面加载后自动发出请求
2021-03-14 16:10:16
但这不是异步的
2021-03-22 16:10:16
也许 PreRenderViewEvent 可能会解决您的问题<f:view .......> <f:event type="preRenderView" listener="#{someBean.download}"/> </f:view>
2021-04-08 16:10:16

我通过使用元数据函数解决了这个问题,因为我不能使用 @PostContruct (FacesMessages 被排队并且在 postconstruct mehtod 中抛出时不显示......最后一条评论)

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

我对 JSF 很陌生,所以......我不太了解 JSF 的生命周期阶段,但这个解决方案对我有用。

这不会在 JavaScript onload 事件期间运行。这远在网页从服务器发送到客户端之前运行。OP 明确要求在 JavaScript onload 事件期间运行 bean 方法。OP 不要求在 JSF 呈现响应阶段之前运行 bean 方法。
2021-03-18 16:10:16