在页面加载时触发<a4j:ajax>请求</a4j:ajax>

时间:2014-01-31 11:11:54

标签: ajax jsf richfaces

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

我已经尝试使用一个加载事件,它似乎可以用于f:ajax和HTMLGraphicImage或HTMLBody,因为它thread但它不能用于a4j:ajax(或者我可能会遗漏某些东西) )。

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

为了简单起见,我没有发布bean,因为这部分现在按照我想要的方式工作。我的问题是关于触发a4j:ajax标签。如果您认为还需要豆子,请告诉我。

我认为有一种方法可以通过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>

提前致谢。

1 个答案:

答案 0 :(得分:2)

再次看我的问题我想我应该问我想要链接两个页面传递一个参数并调用在页面渲染之前调用的托管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中存储的参数来检索呈现页面之前所需的所有信息。