【问题标题】:Trigger <a4j:ajax> request on page load在页面加载时触发 <a4j:ajax> 请求
【发布时间】:2014-02-24 01:32:44
【问题描述】:

我有一个页面在加载时必须触发 AJAX 请求。单击页面上的按钮时,我设法执行了请求。但是我还没有设法在页面加载时自动触发它。要使用的参数来自另一个页面,通过 f:viewParam。

我已经尝试使用加载事件,根据thread,它似乎可用于 f:ajax 和 HTMLGraphicImage 或 HTMLBody,但它不适用于 a4j:ajax(或者我可能遗漏了一些东西)。

Tag Exception
<a4j:ajax> loadevent is not supported for the HtmlGraphicImage

为了简单起见,我没有发布 bean,因为这部分现在可以按我的意愿工作。我的问题是关于触发 a4j:ajax 标签。如果您认为也需要 bean,请告诉我。

我认为有一种方法可以通过 PrimeFaces 来实现。我不确定我是否会被允许将此库添加到项目中,所以如果有任何解决方案,请发布其他解决方案。

这里是 JSF 页面。这个尝试使用图像加载事件来触发 AJAX。也有使用 HTMLBody 的尝试,但它被标记为 ui:remove:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:c="http://java.sun.com/jstl/core"
    xmlns:a4j="http://richfaces.org/a4j">

<ui:composition template="layouts/template.jsf">
    <ui:define name="body">

        <f:metadata>
            <f:viewParam name="recordCode"
                value="#{recordDetailBean.record.recordCode}" />
        </f:metadata>

        <h:graphicImage value="/images/transparent.gif">
            <a4j:ajax event="load"
                action="#{recordDetailBean.createDummyDelay}"
                status="loadingRecordDetail" render="recordDetail" />
        </h:graphicImage>

        <ui:remove>
            <a4j:ajax event="load"
                action="#{recordDetailBean.createDummyDelay}"
                status="loadingRecordDetail" render="recordDetail" />
        </ui:remove>

        <rich:popupPanel id="loadRecord" style="text-align:center"
            autosized="true" modal="true" width="200">
            <h:graphicImage value="/images/ajax-loader.gif" />
            <br />
            <h:outputText value="#{msg.loadingRecord}" />
        </rich:popupPanel>

        <a4j:status name="loadingRecordDetail">
            <f:facet name="start">
                <rich:componentControl event="start" operation="show"
                    target="loadRecord" />
            </f:facet>
            <f:facet name="stop">
                <rich:componentControl event="stop" operation="hide"
                    target="loadRecord" />
            </f:facet>
        </a4j:status>

        <h:form>

            <a4j:commandButton value="Do something"
                action="#{recordDetailBean.createDummyDelay}"
                status="loadingRecordDetail" render="recordDetail" />

            <a4j:outputPanel id="recordDetail">
                <h:outputText value="#{recordDetailBean.dummyDelay}" />
            </a4j:outputPanel>
        </h:form>

    </ui:define>
</ui:composition>
</html>

提前致谢。

【问题讨论】:

  • 在 primefaces 中,我们有 p:remoteCommand(相当于 Richfaces 中的 a4j:jsFunction)和 autoRun 属性。如果它设置为 true,那么它将在 onload 时执行。不确定richfaces中的相似属性
  • 我很快会询问我的经理关于将 PrimeFaces 添加到项目中的问题,但如果有的话,我也想知道另一种方法。感谢您的帮助,Srikanth。
  • 试试这样 callOnload(); 并用 name="callOnload" 声明 a4j:jsFunction 以及您要执行的相应操作。希望这可以达到您的目的
  • Srikanth,我尝试了您的方法,但无法正常工作。我可能错过了什么。无论如何感谢您的帮助!

标签: ajax jsf richfaces


【解决方案1】:

再看我的问题,我想我应该问我想链接两个页面,传递一个参数并在页面渲染之前调用托管 bean 的方法。

这是我最终使用的方法。它可能显示在其他线程中,因此可能会作为重复项关闭。我还遵循了answer by BalusC 中关于f:metadata 的指导方针。不幸的是,在切换到其他页面之前,我无法让“加载”h:popupPanel 出现。如果有人可以提供一种方法来做到这一点,我会提出另一个问题:

首页链接:

<h:link value="#{rSearch.recordCode}" outcome="recordDetail">
   <f:param name="recordCode" value="#{rSearch.recordCode}" />
</h:link>

被调用页面上的元数据:

<ui:define name="metadata">
   <f:metadata>
      <f:viewParam name="recordCode" value="#{RecordDetailBean.theRecord.recordCode}" />
      <f:event type="preRenderView" listener="#{RecordDetailBean.populateRecord}" />
   </f:metadata>
</ui:define>

populateRecord 方法中,我使用DAO 和存储在RecordDetailBean.theRecord.recordCode 中的参数在页面呈现之前检索我需要的所有信息。

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 2019-07-17
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2013-12-02
    • 1970-01-01
    相关资源
    最近更新 更多