Automatischer Web-Seiten Refresh mit ADFFaces 11g – Active Data Service

Mit Active Data Service stellt das ADFFaces Framework (11g) nun einen Mechanismus  bereit auf Datenänderungen im Backend zur reagieren und einen automaitschen Seiten-Refresh durchzuführen. Trotz dass die Funktion auf AJAX basiert, ist es dabei nicht notwendig JavaScript zu implementieren.

Einzig muss der JSF-Datenlieferant einer ADFFaces-Komponente – hier im Beispiel af:table – das Interface ActiveDataModel implementieren.

public class MyTableData extends CollectionModel implements ActiveDataModel {

….

Zu Beginn ruft der DataUpdateManager (ADF-Class)  die Methode  startActiveData() des ActiveDataModel und übergibt u.a. die ADF-Komponente, die auf Änderungs-Events horcht. 

    public synchronized void startActiveData(Collection<Object> rowKeys,
int startChangeCount,
ActiveDataListener listener) {

Zur Deregistrierung ruft ADF die Methode stopActiveData(...) auf. Im Normalfall wird man hier den Listener wieder aus seiner lokalen ListenerListe entferenen und bei Änderungen keinen Event mehr senden.

Informiert werden die ADFKomponenten über Events, wenn sich im Backend etwas geändert hat.
Dazu werden im Backend meist asynchrone Mechanismen wie Queues (MDB, JMS, AQ …), Threads, oder typische asynchrone Protokoll wie Mails/Chat verwendet.

Eine Benachrichtigung wird gewöhnlich in der Callback-Routine (z.B. onMessage  bei MDB) wie folgt aussehen:       

  List<ActiveDataEntry> myList = new ArrayList();
        myList.add(newEntry);
        ActiveDataUpdateEvent event =
            new MyActiveDataUpdateEvent(this, count, myList);
        for (ActiveDataListener listener : registeredActiveDataListeners) {
                registeredActiveDataListeners.dataChanged(event);
        }

 

Um ADF noch mittzuteilen welche Werte sich tatsächlich geändert haben und somit in dem UI refreshed werden sollen (AJAX), muss das Interface ActiveDataEntry für alle Rückgabewerte implementiert werden. Gewöhnlich wir man hier ein ActiveDataEntryWrapper implementieren und über Methoden  wie z.B. getChangeTyp() mitteilen, um welche Art von Änderungen es sich handelt. 

In der JSF-Seite ist an der Komponente lediglich die datenliefernde MannagedBean mit dem Interface ActiveDataModel einzutragen:


<af:table value="#{MyTableDataBean}" var="row">
<af:column sortable="false" headerText="Message Body"
align="start">
<af:outputText value="#{row.body}"/>
</af:column>
<af:column sortable="false" headerText="Message Form"
align="start">
<af:outputText value="#{row.form}"/>
</af:column>
</af:table>

 

Ein gutes Beispiel (Download) dazu habe ich unter http://www.oracle.com/technology/pub/articles/jellema-googletalk.html gefunden.

 

 

 

Advertisements

~ von bmaier - 2. Mai 2008.

Kommentar verfassen

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

 
%d Bloggern gefällt das: