e_java
Setembro 15, 2009, 10:48am
#1
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 ?
yorgan
Setembro 15, 2009, 11:08am
#3
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_java
Setembro 15, 2009, 11:13am
#4
yorgan, ai no meu jsp eu colocaria algo assim :
<ice:dataTable value="#{seuMenagedBean.contatos}"></ice:dataTable>
???
e_java
Setembro 15, 2009, 1:25pm
#5
Não rolou, não to sabendo como faço pra atualizar o dataTable depois de clicar.
Alguem pode me ajudar?
yorgan
Setembro 15, 2009, 1:55pm
#6
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>
yorgan
Setembro 15, 2009, 1:56pm
#7
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_java
Setembro 15, 2009, 2:39pm
#8
Obrigado cara, vou testar!!!
e_java
Setembro 15, 2009, 2:49pm
#9
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
Setembro 15, 2009, 3:20pm
#10
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_java
Setembro 15, 2009, 3:37pm
#11
Esta sim. O que ocorre é que ao clicar no botão ele não atualiza o datatable
yorgan
Setembro 15, 2009, 3:41pm
#12
Certo, mas ele passa no método? A contagem está maior do que ZERO?
e_java
Setembro 15, 2009, 3:45pm
#13
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
Setembro 15, 2009, 3:47pm
#14
Então pode postar o MB inteiro?
e_java
Setembro 15, 2009, 3:50pm
#15
@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
Setembro 15, 2009, 3:56pm
#16
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_java
Setembro 15, 2009, 4:20pm
#17
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
Setembro 15, 2009, 4:24pm
#18
Então poste o faces-config.xml e o JSP inteiro.
[]´s
Daniel
e_java
Setembro 15, 2009, 4:30pm
#19
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
Setembro 15, 2009, 4:33pm
#20
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