Olá pessoal, tenho o seguinte problema:
Utilizo um DataTable igual em várias páginas .xhtml do meu projeto, porém, a única coisa que altera nestes DataTable é o nome da lista que eu passo por parâmetro.
Obs: Todos os DataTable são do mesmo tipo.
Por exemplo: Todos os DataTable são uma listagem de CachorroBean mas o nome das listas podem alterar, como: listaCachorros, cachorrosList, cachorrosMortos e etc.
O que eu queria fazer?:
Eu queria ao invés de ficar copiando código de uma página para outra, criar um único .xhtml com essa listagem, então onde eu for utilizar esta DataTable eu apenas faço um include da página .xhtml onde a mesma está e juntamente com o include eu passo como parâmetro a lista. E na minha nova página dinâmica .html que eu faço o include, eu consiga pegar este parâmetro para colocar na DataTable.
Não sei se é possível, mas se for, espero a colaboração de todos.
Desde já, meu muito obrigado!
Talvez isso te ajude.
dataTableReport.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:form id="htmFormReport">
<p:dataTable id="tbl" var="item" value="#{data}" emptyMessage="A consulta não retornou valores!"
paginator="true" rows="10" paginatorPosition="bottom"
rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'even-row' : 'odd-row'}" rowIndexVar="rowIx" >
<c:forEach var="column" items="#{columns}">
<p:column sortBy="#{item[column.property]}" filterBy="#{item[column.property]}" style="text-align:#{column.tipo == '4'?'right':'left'};" >
<f:facet name="header">
<h:outputLabel value="#{column.header}#{column.tipo == '4'?' ':''} "/>
</f:facet>
<h:outputLabel value="${util.getDateToString( item[column.property], 'dd/MM/yyyy HH:mm')}"/>
</p:column>
</c:forEach>
</p:dataTable>
</h:form>
</html>
Utilização
<ui:include src="/WEB-INF/component/dataTableReport.xhtml">
<ui:param value="#{report.data}" name="data"/>
<ui:param value="#{report.columns}" name="columns"/>
</ui:include>
Edit:
Esqueci de mencionar nesse exemplo as colunas são dinamicas.
[quote=AmauriSpPoa]Talvez isso te ajude.
dataTableReport.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:form id="htmFormReport">
<p:dataTable id="tbl" var="item" value="#{data}" emptyMessage="A consulta não retornou valores!"
paginator="true" rows="10" paginatorPosition="bottom"
rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'even-row' : 'odd-row'}" rowIndexVar="rowIx" >
<c:forEach var="column" items="#{columns}">
<p:column sortBy="#{item[column.property]}" filterBy="#{item[column.property]}" style="text-align:#{column.tipo == '4'?'right':'left'};" >
<f:facet name="header">
<h:outputLabel value="#{column.header}#{column.tipo == '4'?' ':''} "/>
</f:facet>
<h:outputLabel value="${util.getDateToString( item[column.property], 'dd/MM/yyyy HH:mm')}"/>
</p:column>
</c:forEach>
</p:dataTable>
</h:form>
</html>
Utilização
<ui:include src="/WEB-INF/component/dataTableReport.xhtml">
<ui:param value="#{report.data}" name="data"/>
<ui:param value="#{report.columns}" name="columns"/>
</ui:include>
Edit:
Esqueci de mencionar nesse exemplo as colunas são dinamicas.[/quote]
Muito bom meu jovem! Era isso mesmo que eu precisava. Vou fazer meus testes e logo te retorno com meu resultado obtido!
Apesar de ter passado esse exemplo, acho que a melhor forma de fazer o que você precisa é Composite Component, segue links:
http://www.mkyong.com/jsf2/composite-components-in-jsf-2-0/
http://docs.oracle.com/javaee/6/tutorial/doc/gkhxa.html