DataTable JSF

20 respostas
E

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 ?

20 Respostas

E

Alguem pode me ajudar?

yorgan

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

E

yorgan, ai no meu jsp eu colocaria algo assim :

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

???

E

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

Alguem pode me ajudar?

yorgan

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  que saber os atributos, para poder colocar #{contato.nome} ou o que for
</ice:dataTable>
yorgan

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

E

Obrigado cara, vou testar!!!

E

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 ?

yorgan

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?

E

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

yorgan

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

E

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

yorgan

Então pode postar o MB inteiro?

E
@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;
	}
	
	
}
yorgan

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;
	}
	
	
}
E

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

yorgan

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

[]´s

Daniel

E

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

yorgan

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

E

Cara consegui, no jsp mudei pra isso:

<h:commandButton value="buscar" actionListener="#{contatoHandler.busca}"></h:commandButton>

e no bean:

public String busca(ActionEvent event){
		this.contatos = gerenciadorContato.findByKey(this.nome);
		return null;
	}

muito obrigado cara pela força, valeu mesmo

Criado 15 de setembro de 2009
Ultima resposta 15 de set. de 2009
Respostas 20
Participantes 2