JSF: Como filtrar uma h:dataTable?

Salve Galera,
Como faço para filtrar uma h:dataTable ?
Consegui trazer todos os dados e paginar minha dataTable, mas gostaria de ter dois campos(input) na tela: valorParaPesquisa e criterioDePesquisa e um botão de pesquisar que chamasse um método do meu backingBean e me filtrasse a lista original.

Isto é possível ?

ummm é só você criar um método que manipule esta lista aí no seu backing bean.

:okok:

Marcos,
apesar da sua dica não estou conseguindo.

Vamos aos códigos:

 [ FacesConfig ]
 [code]
<managed-bean>
    <managed-bean-name>funcaoList</managed-bean-name>
    <managed-bean-class>br.com.simcaweb.web.FuncaoList</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
    	<property-name>rowsPerPage</property-name>
      	<value>5</value>
    </managed-property>
    <managed-property>
        <property-name>funcaoManager</property-name>
        <value>#{funcaoManager}</value>
    </managed-property>
</managed-bean>
 [/code]

[ BackingBean ]     
[code]

package br.com.simcaweb.web;

import java.util.List;

import javax.faces.component.UIData;
import javax.faces.event.ActionEvent;

import br.com.simcaweb.service.FuncaoManager;

public class FuncaoList {

private FuncaoManager mgr = null;
private int rowsPerPage = 5;
private UIData historyDataTable;
private String valorPesquisado = "";
private String criterioPesquisa = "";

public UIData getHistoryDataTable(){
	return historyDataTable;
}
public void setHistoryDataTable(UIData historyDataTable){
	this.historyDataTable = historyDataTable;
}
public int getRowsPerPage(){
	return rowsPerPage;
}
public void setRowsPerPage(int rowsPerPage){
	this.rowsPerPage = rowsPerPage;
}
public boolean getShowNext(){
	return (historyDataTable.getFirst() + rowsPerPage) < getFuncoes().size();
}
public boolean getShowPrevious(){
    return (historyDataTable.getFirst() - rowsPerPage) >= 0;
}
public void next(ActionEvent actionEvent){
    int newFirst = historyDataTable.getFirst() + rowsPerPage;
    if (newFirst < getFuncoes().size()){
    	historyDataTable.setFirst(newFirst);
    }
}
public void previous(ActionEvent actionEvent){
	int newFirst = historyDataTable.getFirst() - rowsPerPage;
    if (newFirst >= 0){
    	historyDataTable.setFirst(newFirst);
    }
}
public void first(ActionEvent actionEvent){
	historyDataTable.setFirst(0);		
}
public void last(ActionEvent actionEvent){
	
	int newFirst = historyDataTable.getRowCount() - rowsPerPage;
    if (newFirst >= 0){
    	historyDataTable.setFirst(newFirst);
    }
}
public String getValorPesquisado() {
	return valorPesquisado;
}
public void setValorPesquisado(String valorPesquisado) {
	this.valorPesquisado = valorPesquisado;
}
public String getCriterioPesquisa() {
	return criterioPesquisa;
}
public void setCriterioPesquisa(String criterioPesquisa) {
	this.criterioPesquisa = criterioPesquisa;
}
public void setFuncaoManager(FuncaoManager funcaoManager){
    this.mgr = funcaoManager;
}    
public List getFuncoes() {
    return mgr.getFuncoes();
}
public List getFuncoes(String a, String b){
	return null;    	
}
public List getFuncoesByCriteria(){
	
	System.out.println(getValorPesquisado() + "-" + getCriterioPesquisa());
	getFuncoes(valorPesquisado, criterioPesquisa);
	return null;
}

}

[/code]

[ JSP ]

[code]

<%@ include file="/taglibs.jsp"%>

<f:view>
<f:loadBundle var=“messages” basename=“messages”/>
<title><fmt:message key=“index.title”/>-<fmt:message key=“funcaoList.title”/></title>
<h2><fmt:message key=“funcaoList.title”/></h2>
<h:form id=“funcaoList”>
<fieldset>
<legend><fmt:message key=“field.pesquisa”/>:</legend>
<h:outputLabel for=“valorPesquisado” value="#{messages[‘field.valor’]}"/>:
<h:inputText value="#{funcaoList.valorPesquisado}" id=“valorPesquisado” required=“false” size=“40”/>
<select id=“criterioPesquisa” value="#{funcaoList.criterioPesquisa}">
<option>exatamente</option>
<option>começando por</option>
<option>terminando por</option>
</select>
<h:commandButton accesskey=“P” value="#{messages[‘button.pesquisar’]}" action="#{funcaoList.getFuncoesByCriteria}" id=“find” immediate=“true” styleClass=“button”/>
</fieldset>
<hr/>
<div align=“center”>
<h:commandButton accesskey=“I” value="#{messages[‘button.incluir’]}" action=“add” id=“add” immediate=“true” styleClass=“button”/>
<h:commandButton accesskey=“r” value="#{messages[‘button.imprimir’]}" action="#{funcaoForm.print}" id=“print” immediate=“true” styleClass=“button”/>
<h:commandButton accesskey=“A” value="#{messages[‘button.atualizar’]}" action="#{funcaoForm.requery}" id=“requery” immediate=“true” styleClass=“button”/>
</div>
<hr/>
<h:dataTable var=“funcao” value="#{funcaoList.funcoes}" binding="#{funcaoList.historyDataTable}" rows="#{funcaoList.rowsPerPage}" id=“funcaoList” styleClass=“list” rowClasses=“odd,even”>
<h:column>
<f:facet name=“header”><h:outputText value="#{messages[‘field.id’]}"/></f:facet>
<h:commandLink action="#{funcaoForm.edit}" value="#{funcao.id}">
<f:param name=“id” value="#{funcao.id}"/>
</h:commandLink>
</h:column>
<h:column>
<f:facet name=“header”><h:outputText value="#{messages[‘field.descricao’]}"/></f:facet>
<h:outputText value="#{funcao.descricao}"/>
</h:column>
<f:facet name=“footer”>
<h:panelGroup>
<h:commandLink actionListener="#{funcaoList.first}" style=“padding-right: 5px;”>
<h:outputText value="#{messages[‘button.primeiro’]}"/>
</h:commandLink>
<h:commandLink actionListener="#{funcaoList.previous}" rendered="#{funcaoList.showPrevious}" style=“padding-right: 5px;”>
<h:outputText value="#{messages[‘button.anterior’]}"/>
</h:commandLink>
<h:commandLink actionListener="#{funcaoList.next}" rendered="#{funcaoList.showNext}" style=“padding-right: 5px;”>
<h:outputText value="#{messages[‘button.proximo’]}"/>
</h:commandLink>
<h:commandLink actionListener="#{funcaoList.last}">
<h:outputText value="#{messages[‘button.ultimo’]}"/>
</h:commandLink>
</h:panelGroup>
</f:facet>
</h:dataTable>
</h:form>
</f:view>

[/code]
Inclusive eu não to conseguindo ler os campos para pesquisa que eu seto na tela.

E ai galera,
Alguma luz ?

Opa,

Acho que o teu problema está em não ter criado uma variável para armazenar suas funções… aí sempre que você executa o método e faz as operações, mas quando vai carregar, chama o metódo getFuncoes e ele simplemente, retorna na ordem default.

:okok: