Using af:poll to refresh and push data in page and databound table in ADF

Sharing is Caring

Poll component delivers the poll event to the server at fixed intervals, we use the poll in ADF as an alternative of ADS (Active Data Service), this is a very simple example of pushing data to the page at some fixed interval.
Basically af:poll component pushes data to UI from the server.

  • This example contains a page with an af:table bound to Department VO, and I have used a poll component to refresh table periodically.

 

    • And defined pollListener on af:poll component that sends a request to the server in every 4 sec, and table get refreshed

af:poll

 

    • Another approach to actively push data is ADS, but af:poll is still in use, to refresh table I have written in the poll listener

AppModuleAMImpl am = (AppModuleAMImpl)resolvElDC("AppModuleAMDataControl");

ViewObject vo = am.getDepartment1();
vo.executeQuery();
i = i + 1;
        this.refreshInfo = "Data Reloaded-" + i+" Total Row-->"+vo.getRowCount();
AdfFacesContext.getCurrentInstance().addPartialTarget(refrshMsgBind);

 

    • See the jspx page source code-

<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:f="http://java.sun.com/jsf/core"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
    <jsp:directive.page contentType="text/html;charset=UTF-8"/>
    <f:view>
        <af:document title="activePushing.jspx" id="d1">
            <af:messages id="m1"/>
            <af:form id="f1">
                <af:panelBox id="pb1" showDisclosure="false" text="Active Data Pushing">
                    <f:facet name="toolbar">
                        <af:activeOutputText value="#{ActiveDataPushing.refreshInfo}" id="aot1"
                                             inlineStyle="font-weight:bold;color:red;"
                                             binding="#{ActiveDataPushing.refrshMsgBind}"/>
                    </f:facet>
                    <af:table value="#{bindings.Department1.collectionModel}" var="row"
                              rows="#{bindings.Department1.rangeSize}"
                              emptyText="#{bindings.Department1.viewable ? 'No data to display.' : 'Access Denied.'}"
                              fetchSize="#{bindings.Department1.rangeSize}" rowBandingInterval="1"
                              selectedRowKeys="#{bindings.Department1.collectionModel.selectedRow}"
                              selectionListener="#{bindings.Department1.collectionModel.makeCurrent}"
                              rowSelection="single" id="t1" styleClass="AFStretchWidth" contentDelivery="immediate">
                        <af:column sortProperty="#{bindings.Department1.hints.DepartmentId.name}" sortable="true"
                                   headerText="#{bindings.Department1.hints.DepartmentId.label}" id="c1" width="103">
                            <af:inputText value="#{row.bindings.DepartmentId.inputValue}"
                                          label="#{bindings.Department1.hints.DepartmentId.label}"
                                          required="#{bindings.Department1.hints.DepartmentId.mandatory}"
                                          columns="#{bindings.Department1.hints.DepartmentId.displayWidth}"
                                          maximumLength="#{bindings.Department1.hints.DepartmentId.precision}"
                                          shortDesc="#{bindings.Department1.hints.DepartmentId.tooltip}" id="it1"
                                          readOnly="true">
                                <f:validator binding="#{row.bindings.DepartmentId.validator}"/>
                                <af:convertNumber groupingUsed="false"
                                                  pattern="#{bindings.Department1.hints.DepartmentId.format}"/>
                            </af:inputText>
                        </af:column>
                        <af:column sortProperty="#{bindings.Department1.hints.DepartmentName.name}" sortable="true"
                                   headerText="#{bindings.Department1.hints.DepartmentName.label}" id="c2" width="107">
                            <af:inputText value="#{row.bindings.DepartmentName.inputValue}"
                                          label="#{bindings.Department1.hints.DepartmentName.label}"
                                          required="#{bindings.Department1.hints.DepartmentName.mandatory}"
                                          columns="#{bindings.Department1.hints.DepartmentName.displayWidth}"
                                          maximumLength="#{bindings.Department1.hints.DepartmentName.precision}"
                                          shortDesc="#{bindings.Department1.hints.DepartmentName.tooltip}" id="it2"
                                          readOnly="true">
                                <f:validator binding="#{row.bindings.DepartmentName.validator}"/>
                            </af:inputText>
                        </af:column>
                        <af:column sortProperty="#{bindings.Department1.hints.ManagerId.name}" sortable="true"
                                   headerText="#{bindings.Department1.hints.ManagerId.label}" id="c3" width="105">
                            <af:inputText value="#{row.bindings.ManagerId.inputValue}"
                                          label="#{bindings.Department1.hints.ManagerId.label}"
                                          required="#{bindings.Department1.hints.ManagerId.mandatory}"
                                          columns="#{bindings.Department1.hints.ManagerId.displayWidth}"
                                          maximumLength="#{bindings.Department1.hints.ManagerId.precision}"
                                          shortDesc="#{bindings.Department1.hints.ManagerId.tooltip}" id="it3"
                                          readOnly="true">
                                <f:validator binding="#{row.bindings.ManagerId.validator}"/>
                                <af:convertNumber groupingUsed="false"
                                                  pattern="#{bindings.Department1.hints.ManagerId.format}"/>
                            </af:inputText>
                        </af:column>
                        <af:column sortProperty="#{bindings.Department1.hints.LocationId.name}" sortable="true"
                                   headerText="#{bindings.Department1.hints.LocationId.label}" id="c4" width="105">
                            <af:inputText value="#{row.bindings.LocationId.inputValue}"
                                          label="#{bindings.Department1.hints.LocationId.label}"
                                          required="#{bindings.Department1.hints.LocationId.mandatory}"
                                          columns="#{bindings.Department1.hints.LocationId.displayWidth}"
                                          maximumLength="#{bindings.Department1.hints.LocationId.precision}"
                                          shortDesc="#{bindings.Department1.hints.LocationId.tooltip}" id="it4"
                                          readOnly="true">
                                <f:validator binding="#{row.bindings.LocationId.validator}"/>
                                <af:convertNumber groupingUsed="false"
                                                  pattern="#{bindings.Department1.hints.LocationId.format}"/>
                            </af:inputText>
                        </af:column>
                    </af:table>
                    <af:poll id="p1" pollListener="#{ActiveDataPushing.pollListenerActive}" interval="4000"
                             timeout="5000"/>
                </af:panelBox>
            </af:form>
        </af:document>
    </f:view>
</jsp:root>

 

  • Run your application, and do changes from Database and see updated UI at every 4 sec. 🙂

Reloading- 26th times-

Reloading- 33rd times-

Reloading- 40th times-

 

Cheers 🙂 Happy Learning

Related Posts

An Oracle ACE, Blogger, Reviewer, Technical Lead working on Oracle ADF

Leave a Reply

Your email address will not be published. Required fields are marked *