DataTable JSF

Bom dia a todos.

Todas as vezes que eu usei o dataTable do jsf eu sempre mostrei todo o conteudo da tabela, agora to precisando mostrar o resultado de uma consulta que usa como parametro um campo do meu jsp. Ex:

tenho um campo “Palavra chave” e um botão. Ao clicar no botão deve aparecer no dataTable os registros selecionados apartir da palavra digitada no campo.
Eu tava tentando fazer algo assim:

        <h:inputText id="palavraChave"/>    

ai tenho um botao “Buscar”, ao clicar nele o devera aparecer um datatable com os registros que correspondentes a palavra que foi digitada. Tentei colocar no Handler algo assim:

public void findByKey(ActionEvent evt){ UIComponent link = evt.getComponent(); UIParameter p = (UIParameter) link.findComponent("palavraChave"); String id = p.getValue().toString(); List<Contato> retorno = contatoService.findByKey(id);// essa linha me retorna a consulta que eu quero }
mas ai não sei como mostrar o resultado na datatable.

Algeum pode me ajudar ?

Alguem pode me ajudar?

Olha, o problema é que você não está colocando os valores da variável retorno em lugar nenhum.
Tente algo assim:


public SeuManagedBean {
      
      private List<Contato> contatos;

      public SeuManagedBean() {
             contatos = new ArrayList<Contato>();
      }

      public void findByKey(ActionEvent evt){ 
            UIComponent link = evt.getComponent();
            UIParameter p = (UIParameter) link.findComponent("palavraChave"); 
            String id = p.getValue().toString();
            contatos = contatoService.findByKey(id);// essa linha me retorna a consulta que eu quero 
      }

 
      //Get/Set contatos

}

Acredito que isso resolva o seu problema.

[]´s

Daniel

yorgan, ai no meu jsp eu colocaria algo assim :

<ice:dataTable value="#{seuMenagedBean.contatos}"></ice:dataTable>

???

Não rolou, não to sabendo como faço pra atualizar o dataTable depois de clicar.

Alguem pode me ajudar?

Eu não utilizo IceFaces, mas acredito que você tenha esquecido de iterar os registros da lista. Talvez você deva fazer algo +/- assim:

<ice:dataTable value="#{seuMenagedBean.contatos}" var="contato">
       <h:outputtext value="#{contato}" /><br/> //Teria só que saber os atributos, para poder colocar #{contato.nome} ou o que for
</ice:dataTable> 

E se por acaso ainda não tiver dado certo, poste aqui o código do Bean e o código da JSP.

[]s

Daniel

Obrigado cara, vou testar!!!

no jsp tenho isso:

	<h:inputText id="chave" value="#{contatoHandler.nome}"/>
	<h:commandButton action="#{contatoHandler.busca}" value="buscar"></h:commandButton>
	
	<h:dataTable value="#{contatoHandler.contatos}" var="cont">
		<h:column>
			<f:facet name="header">
				<h:outputText value="nome"/>
			</f:facet>
			<h:outputText value="#{cont.nome}"/>
		</h:column>
	</h:dataTable>

no bean eu tenho esse metodo:


private String nome;
List<Contato> contatos;

//getters anda setters

public void busca(){
		this.contatos = gerenciadorContato.findByKey(this.nome);
	}

nesse gerenciadorContato eu tenho esse :

public List<Contato> findByKey(String key){
		
		return this.dao.listByKe(key);
		
	}

no dao eu tenho isso:

public List<Contato> listByKe(String key) {
		List<Contato> lista = session.find("aqui viria um sql que usaria a variavel 'key'");
		return lista;
	}

o que que ta faltando ?

Já experimentou debugar para ver se os resultados estão vindo?
Ou pelo menos coloque um System.out para ver quantos registros vieram.

      public void busca(){  
            this.contatos = gerenciadorContato.findByKey(this.nome); 
            System.out.println(this.contatos.size());
      } 

Você pode tentar mudar o método de pesquisa para algo assim:

      public String busca(){  
            this.contatos = gerenciadorContato.findByKey(this.nome);  
            System.out.println(this.contatos.size());
            return null;
      } 

[]s

Ah, seu MB está como Session?

Esta sim. O que ocorre é que ao clicar no botão ele não atualiza o datatable

Certo, mas ele passa no método? A contagem está maior do que ZERO?

se coloco um syso com o size da lista ele mostra exatamente o numero que tinha que mostrar, só não atualiza o dataTable.

Então pode postar o MB inteiro?


@Controller
public class ContatoHandler {
	@Autowired
	GerenciadorContato gerenciadorContato;
	List<Contato> contatos;
	public String nome;
	
	public void busca(){
		this.contatos = gerenciadorContato.findByKey(this.nome);
	}
	
	public GerenciadorContato getGerenciadorContato() {
		return gerenciadorContato;
	}

	public void setGerenciadorContato(GerenciadorContato gerenciadorContato) {
		this.gerenciadorContato = gerenciadorContato;
	}

	public List<Contato> getContatos() {
		this.contatos = gerenciadorContato.findByKey(this.nome);
		return contatos;
	}

	public void setContatos(List<Contato> contatos) {
		this.contatos = contatos;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
	
}

Tente assim:

JSP:

        <h:inputText id="chave" value="#{contatoHandler.nome}"/>
	<h:commandButton action="#{contatoHandler.busca}" value="buscar"></h:commandButton>
	
	<h:dataTable value="#{contatoHandler.contatos}" var="cont">
		<h:column>
			<f:facet name="header">
				<h:outputText value="nome"/>
			</f:facet>
			<h:outputText value="#{cont.nome}"/>
		</h:column>
	</h:dataTable>

Bean


@Controller
public class ContatoHandler {
	
	@Autowired
	private GerenciadorContato gerenciadorContato;
	private List<Contato> contatos;
	private String nome;
	
	public String busca(){
		this.contatos = gerenciadorContato.findByKey(this.nome);
		return null;
	}
	
	public GerenciadorContato getGerenciadorContato() {
		return gerenciadorContato;
	}

	public void setGerenciadorContato(GerenciadorContato gerenciadorContato) {
		this.gerenciadorContato = gerenciadorContato;
	}

	public List<Contato> getContatos() {
		return contatos;
	}

	public void setContatos(List<Contato> contatos) {
		this.contatos = contatos;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
	
}

alterei o metodo no bean ficou assim:

	public String busca(){
		this.contatos = gerenciadorContato.findByKey(this.nome);
		System.out.println("nome: " + this.nome);
		return null;
	}

e esse syso não aparece no console

Então poste o faces-config.xml e o JSP inteiro.

[]´s

Daniel

JSP


<?xml version="1.0" encoding="ISO-8859-1" ?>
<jsp:root version="1.2" 
  xmlns:jsp="http://java.sun.com/JSP/Page"
   xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ice="http://www.icesoft.com/icefaces/component">
<jsp:directive.page contentType="text/html;charset=ISO-8859-1" pageEncoding="ISO-8859-1"/>
<f:view>
  <ice:outputDeclaration doctypeRoot="HTML" doctypePublic="-//W3C//DTD HTML 4.01 Transitional//EN" doctypeSystem="http://www.w3.org/TR/html4/loose.dtd"/>
  <html>
    <head>
     <title><ice:outputText value="ICEfaces, Ajax for Java EE" /></title>
     <ice:outputStyle href="./xmlhttp/css/xp/xp.css" />
    </head>
    <body>
	<h:inputText id="chave" value="#{contatoHandler.nome}"/>
	<h:commandButton action="#{contatoHandler.testa}" value="buscar" actionListener="#{contatoHandler.testa}"></h:commandButton>
	
	<h:dataTable value="#{contatoHandler.contatos}" var="cont">
		<h:column>
			<f:facet name="header">
				<h:outputText value="nome"/>
			</f:facet>
			<h:outputText value="#{cont.nome}"/>
		</h:column>
	</h:dataTable>
    </body>
  </html>
</f:view>
</jsp:root>

O que ta ocorrendo é que quando clico na verdade ele não passa pelo metodo no Bean, no faces config não tem muita coisa porque quem ta gerenciando meus beans é o Spring

Olha, pelo visto você esqueceu de abrir a tag <h:form>.
Sem ela a JSP não irá chamar o MB.

Tente a JSP assim:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<jsp:root version="1.2" 
  xmlns:jsp="http://java.sun.com/JSP/Page"
   xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ice="http://www.icesoft.com/icefaces/component">
<jsp:directive.page contentType="text/html;charset=ISO-8859-1" pageEncoding="ISO-8859-1"/>
<f:view>
  <ice:outputDeclaration doctypeRoot="HTML" doctypePublic="-//W3C//DTD HTML 4.01 Transitional//EN" doctypeSystem="http://www.w3.org/TR/html4/loose.dtd"/>
  <html>
    <head>
     <title><ice:outputText value="ICEfaces, Ajax for Java EE" /></title>
     <ice:outputStyle href="./xmlhttp/css/xp/xp.css" />
    </head>
    <body>
    <h:form>
	<h:inputText id="chave" value="#{contatoHandler.nome}"/>
	<h:commandButton action="#{contatoHandler.testa}" value="buscar" actionListener="#{contatoHandler.testa}"></h:commandButton>
	
	<h:dataTable value="#{contatoHandler.contatos}" var="cont">
		<h:column>
			<f:facet name="header">
				<h:outputText value="nome"/>
			</f:facet>
			<h:outputText value="#{cont.nome}"/>
		</h:column>
	</h:dataTable>
    </h:form>
    </body>
  </html>
</f:view>
</jsp:root>

[]´s