avancado.xml
4.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" []>
<chapter id="avancado">
<title>Utilizando opções avançadas</title>
<section>
<title>Implementando paginação dos dados</title>
<para>... introduzir mecanismo e <emphasis>lazy
loading</emphasis></para>
<note>
<para>explicar interface <literal>Pagination</literal> (unidade
básica de paginação) e contexto de paginação <literal>
PaginationContext</literal>, disponível através de injeção</para>
</note>
<note>
<para>o exemplo em questão é específico para o PrimeFaces se for
utilizar outra implementação, tal como RichFaces, ... código será
semelhante</para>
</note>
<para>No pacote <literal>
br.gov.frameworkdemoiselle.sample.view</literal> altere a classe
<literal>BookmarkListMB</literal> incluindo nela as linhas de
código a seguir:</para>
<programlisting role="JAVA"> private DataModel<Bookmark> dataModel;
@Override
@SuppressWarnings("unchecked")
public DataModel<Bookmark> getDataModel() {
if (dataModel == null) {
dataModel = new LazyDataModelImpl();
}
return dataModel;
}
private class LazyDataModelImpl extends LazyDataModel<Bookmark> {
private static final long serialVersionUID = 1L;
private boolean loaded = false;
@Override
public int getRowCount() {
if (!loaded) {
getPagination();
handleResultList();
loaded = true;
}
return getPagination().getTotalResults();
}
@Override
public List<Bookmark> load(int first, int pageSize, String sortField,
boolean sortOrder, Map<String, String> filters) {
Pagination pagination = getPagination();
pagination.setPageSize(pageSize);
pagination.setFirstResult(first);
return handleResultList();
}
}</programlisting>
<para>A interface <literal>DataModel</literal> pertence à
especificação JSF, enquanto que a classe abstrata <literal>
LazyDataModel</literal> é uma implementação da primeira fornecida
pelo framework <emphasis>PrimeFaces</emphasis>.</para>
<para>No diretório <filename>/src/main/webapp/</filename>, altere o
arquivo <filename>bookmark_list.xhtml</filename> substituindo
apenas a tag <literal>p:dataTable</literal> com o conteúdo
seguinte:</para>
<programlisting role="XML"><p:dataTable id="list" height="300" var="bean" value="#{bookmarkListMB.dataModel}"
lazy="true" paginator="true" rows="#{bookmarkListMB.pageSize}"
pageLinks="#{bookmarkListMB.maxPageLinks}"></programlisting>
<para>...</para>
<para>No diretório <filename>/src/main/resources/</filename>,
altere o arquivo <filename>demoiselle.properties</filename>
incluindo as linhas a seguir:</para>
<programlisting>frameworkdemoiselle.pagination.default.page.size = 5
frameworkdemoiselle.pagination.max.page.links = 3</programlisting>
<para>...</para>
<figure>
<title>Paginação de dados na aplicação Bookmark</title>
<mediaobject><imageobject role="fo"><imagedata align="center"
fileref="images/apppage.png" scalefit="1"/></imageobject>
<imageobject role="html"><imagedata align="center"
fileref="images/apppage.png"/></imageobject><textobject><phrase>Aplicação
Bookmark em funcionamento</phrase></textobject></mediaobject>
</figure>
<para>...</para>
<programlisting>INFO [STDOUT] Hibernate: select top ? count(bookmark0_.id) as col_0_0_ from Bookmark bookmark0_
INFO [STDOUT] Hibernate: select top ? bookmark0_.id as id4_, bookmark0_.description as descript2_4_, bookmark0_.link as link4_ from Bookmark bookmark0_
INFO [STDOUT] Hibernate: select limit ? ? bookmark0_.id as id4_, bookmark0_.description as descript2_4_, bookmark0_.link as link4_ from Bookmark bookmark0_</programlisting>
<tip>
<para>// todo: explicar superficialmente como implementar no
RF...</para>
<programlisting role="JAVA">
import org.richfaces.component.UIDatascroller;
import org.richfaces.event.DataScrollerEvent;
// evento específico do RichFaces
public void updatePage(DataScrollerEvent e) {
int index = ((UIDatascroller) e.getComponent()).getPage();
Page pagina = new Page(getRows(), index);
recarregarLista(pagina);
}
</programlisting>
<programlisting role="XML">
<rich:datascroller for="table"
maxPages="#{bookmarkListMB.maxPages}" page="#{bookmarkListMB.currentPage}"
reRender="table" scrollerListener="#{bookmarkListMB.updatePage}" />
<rich:dataTable width="100%" value="#{bookmarkListMB.lazyModel}"
rows="#{bookmarkListMB.pageSize}"
var="element" rowKeyVar="row" id="table">
</programlisting>
</tip>
</section>
</chapter>