This page (revision-4) was last changed on 30-Apr-2015 13:23 by Dieter Käppel

This page was created on 05-Jan-2014 14:44 by Dieter Käppel

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
4 30-Apr-2015 13:23 5 KB Dieter Käppel to previous
3 30-Apr-2015 13:23 5 KB Dieter Käppel to previous | to last
2 30-Apr-2015 13:17 3 KB Dieter Käppel to previous | to last
1 05-Jan-2014 14:44 1 KB Dieter Käppel to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 10 added 56 lines
!!!Dynamische Daten
Viele Web-Oberflächen einschließlich [Primefaces] oder [Richfaces] liefern Listen, Trees und andere Darstellungen, die ein dynamisches Befüllen erlauben. Es werden von der Datenbank immer nur die gerade benötigte Anzahl von Datensätzen geholt. Durch Steuerelemente wie Pager oder Tree-Expansion werden dann Elemente nachgeladen.
Wieso werden solche Elemente nicht öfters eingesetzt? Die Hemmschwelle sitzt im Anbinden der Datenbank. [JPA Support] enthält Interfaces und Implementierungen, um den wiederholten Code zu kapseln.
!!Dynamic List
Das Interface DynamicList<T> ist die Grundlage für die Anbindung von dynamischen Daten. In [JPA Support] werden dabei die Implementierung mitgeliefert: HibernateDynamicList und RevisionDynamicList:
* __HibernateDynamicList:__ Die wohl meist gebrauchte Implementierung. Diese nimmt im Konstruktor eine DetachedCriteria und eine Class als zugehörigen Ergebnistyp.
* __RevisionDynamicList:__ Nur für die Verwendung von Envers sinnvoll. Nimmt Class, Serializable id und List<Number> revisions als Parameter. Damit können Revisionen aufgelistet werden, die Envers transparent anlegt.
!!Dynamic List Wrapper
In einigen Fällen reicht das einfache Durchreichen der Datensätze nicht aus. Dafür gibt es die Klasse DynamicListWrapper. Diese Klasse nimmt eine andere DynamicList als Parameter und wrappt jedes Ergebnis-Element in eine neue Klasse, indem die Methode list(...) überschrieben wird:
{{{
@Override
public List<ProcessStats> list(int first, Integer pageSize, String sortField, Boolean sortOrder,
Map<String, Object> filters) {
Processor processor = Context.getContext().getBean(Processor.class);
List<ProcessStats> list = new ArrayList<>();
for (Process process : getWrapped().list(first, pageSize, sortField, sortOrder, filters)) {
long transactionCount = processor.getTransactionCount(user, process, false);
ProcessStats stats = new ProcessStats(process, transactionCount);
list.add(stats);
}
return list;
}
}}}
!!!Frontend
Wie kommen die Daten nun ins Frontend? Bei Primefaces kann dies so aussehen:
{{{
<p:dataTable value="#{processList.list}" var="process" lazy="true">
<p:column>
<h:outputText value="#{process.value}"/>
</p:column>
</p:dataTable>
}}}
Die dazugehörige Bean:
{{{
private PrimefacesDataModel<Process> list;
public PrimefacesDataModel<Process> getList() {
if (list == null) {
DetachedCriteria criteria = DetachedCriteria.forClass(Process.class);
list = new PrimefacesDataModel<>(new HibernateDynamicList<>(criteria, Process.class));
}
return list;
}
}}}
Die HibernateDynamicList kann natürlich auch an anderer Stelle verwendet werden, als diese direkt in PrimefacesDataModel oder RichfacesDataModel zu kapseln.