avancado.xml 4.95 KB
<?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&lt;Bookmark&gt; dataModel;

	@Override
	@SuppressWarnings(&quot;unchecked&quot;)
	public DataModel&lt;Bookmark&gt; getDataModel() {
		if (dataModel == null) {
			dataModel = new LazyDataModelImpl();
		}
		return dataModel;
	}
	
	private class LazyDataModelImpl extends LazyDataModel&lt;Bookmark&gt; {

		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&lt;Bookmark&gt; load(int first, int pageSize, String sortField, 
				boolean sortOrder, Map&lt;String, String&gt; 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">&lt;p:dataTable id=&quot;list&quot; height=&quot;300&quot; var=&quot;bean&quot; value=&quot;#{bookmarkListMB.dataModel}&quot;
	lazy=&quot;true&quot; paginator=&quot;true&quot; rows=&quot;#{bookmarkListMB.pageSize}&quot;
	pageLinks=&quot;#{bookmarkListMB.maxPageLinks}&quot;&gt;</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">
				&lt;rich:datascroller for=&quot;table&quot;
					maxPages=&quot;#{bookmarkListMB.maxPages}&quot; page=&quot;#{bookmarkListMB.currentPage}&quot;
					reRender=&quot;table&quot; scrollerListener=&quot;#{bookmarkListMB.updatePage}&quot; /&gt;
				&lt;rich:dataTable width=&quot;100%&quot; value=&quot;#{bookmarkListMB.lazyModel}&quot;
					rows=&quot;#{bookmarkListMB.pageSize}&quot;
					var=&quot;element&quot; rowKeyVar=&quot;row&quot; id=&quot;table&quot;&gt;
			</programlisting>
    </tip>
  </section>
</chapter>