dúvidas no JSF, sobre a utilização de combobox

8 respostas
icarometal

boa noite… galera tenho uma dúvida que me tira o sono…

eu tenho uma tela em JSP, e seus inputs, mapeados no respectivo bean…

pois bem, nela tenho um rich:combobox…
(já tentei usar um h:oneselectmenu mas não funfou mesmo assim…)

o que acontece é o seguinte: eu tenho que atualizar alguns dados na tela, de acordo com a opção escolhida dentro deste combo. o valor deste combo, está ligado à uma propriedade do bean, que possui seus respectivos get/set.

assim que eu clico no combo, através da tag a4j:support, eu chamo uma função do bean, que conecta ao meu DAO, faz as buscas, no banco, e retorna os valores para a tela.

pois bem, para fazer isto eu preciso passar como parametro o valor que está escolhido no combo (e que teoricamente, deveria ser setado, assim que eu faço uma escolha no mesmo, já que meu bean possui o atributo necessario linkado ao componente)

só que quando eu chamo a função que busca do meu bean, o atributo ainda está null! então minha busca no banco de dados retorna um objeto vazio, que por estar vazio não atualiza a tela corretamente ¬¬.

aí vem a seginte questão:
em um outro momento, (por exemplo, quando eu altero o valor dentro de um input, e mando gravar no banco) se verifico novamente aquele antigo atributo, ele já está setado corretamente, inclusive dando update, no campo correto no meu banco de dados…

existe uma maneira de forçar, que assim que eu escolha no combo um valor, a minha propriedade já receba o valor do mesmo??

deve ter ficado meio confuso… mas quem puder ajudar…

deem uma olhadinha e me ajudem por favor!

sou novato no forum e iniciante em Java, e tenho que fazer este programa para segunda feira… :frowning:
:oops:

meu JSP está desta forma:

<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<html>
<head>
<title>Cadastro de parâmetros</title></head>
<body>
<f:view>
<h:form>
	<a4j:loadScript src="js/jquery.js" />
<center>
  <ui:composition xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich">
            
    <rich:panel style="padding:0;width:75%;" headerClass="outpanelHeader">
        <f:facet name="header">
            <rich:spacer height="4" />
        </f:facet>
        <h2 align="center"><h:outputText value="Configuração de parâmetros" /></h2>       
            <rich:panel bodyClass="inpanelBody">
                <f:facet name="header">
                    <h:outputText value="Selecione o parâmetro a ser alterado" /> 
                </f:facet>                        
                       <a4j:region>
                       <rich:comboBox id="chave" selectFirstOnUpdate="false"
                        defaultLabel="escolha o parâmetro" value="#{parametroBean.chave}">
                           <f:selectItems value="#{parametroBean.listaParametro}" />
                             <a4j:support event="onchange" actionListener="#{parametroBean.buscarParametro}"
                           reRender="desc,antecedencia" immediate="true" />
                       </rich:comboBox>
                       
                       <br>
                       <h:outputText id="desc" value="#{parametroBean.descricao}" /><br>
                       <rich:inplaceInput id="antecedencia" defaultLabel="clique aqui para alterar o parâmetro" 
                      showControls="true" value="#{parametroBean.valor}"> 
                      <rich:jQuery selector="#antecedencia" query="mask(99)" timing="onload" />
                       <a4j:support event="onchange" actionListener="#{parametroBean.altParametro}"
                           reRender="desc,antecedencia"/>
                      </rich:inplaceInput>
                      <br><br>                     
                    </a4j:region>                              
            </rich:panel>  
    </rich:panel>
</ui:composition>
</center> 
</h:form>  
</f:view>
</body>
</html>

e minha Bean está da seguinte forma:

package fronteira;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;

import controle.ParametroCtr;
import entidade.Parametro;

public class ParametroBean extends Parametro{
	public List<SelectItem> listaParametro;
	public ParametroBean() {
		super();
		  listaParametro = new ArrayList<SelectItem>();		  
		}
	
	public String altParametro(){
	  String retorno = new String();
	  ParametroCtr param = new ParametroCtr();
	  Parametro parametro = new Parametro();
	  parametro.setChave(this.getChave());
	  parametro.setValor(this.getValor());
	  
	  if (param.alteraParamentro(parametro)){
		  retorno = "sucesso";
	  } else
		  retorno = "erro";
	  return retorno;
	}
	
	public String buscarParametro(){
	  String retorno = new String();
	  ParametroCtr param = new ParametroCtr();
	  Parametro parametro = new Parametro();
	  Parametro resposta = new Parametro();
	  parametro.setChave(this.getChave());	 
	  resposta = param.buscaParametro(parametro);
	  if (!resposta.getDescricao().equals("")){
		  this.setDescricao(resposta.getDescricao());
		  this.setValor(resposta.getValor());
		  retorno = "sucesso";
	  } else
		  retorno = "erro";
	  return retorno;	  	
	}

	public List<SelectItem> getListaParametro() {
		ParametroCtr par = new ParametroCtr();
		listaParametro = par.listaParametros();
		return listaParametro;
	}

	public void setListaParametro(List<SelectItem> listaParametro) {
		this.listaParametro = listaParametro;
	}	
}

a classe Parametros de onde a Bean é extendida, contém os atributos:

private  Integer codigo;

private  Date dataInclusao;

private  Date dataAlteracao ;

private  String chave;

private  String valor;

private  String descricao;

com seus respectivos Get’s/set’s…

por favor pessoal… semana santa, mas quem tiver em casa me ajuda!!!

:wink:

agradeço!

8 Respostas

thiago.limma

icarometal:
boa noite… galera tenho uma dúvida que me tira o sono…

eu tenho uma tela em JSP, e seus inputs, mapeados no respectivo bean…

pois bem, nela tenho um rich:combobox…
(já tentei usar um h:oneselectmenu mas não funfou mesmo assim…)

o que acontece é o seguinte: eu tenho que atualizar alguns dados na tela, de acordo com a opção escolhida dentro deste combo. o valor deste combo, está ligado à uma propriedade do bean, que possui seus respectivos get/set.

assim que eu clico no combo, através da tag a4j:support, eu chamo uma função do bean, que conecta ao meu DAO, faz as buscas, no banco, e retorna os valores para a tela.

pois bem, para fazer isto eu preciso passar como parametro o valor que está escolhido no combo (e que teoricamente, deveria ser setado, assim que eu faço uma escolha no mesmo, já que meu bean possui o atributo necessario linkado ao componente)

só que quando eu chamo a função que busca do meu bean, o atributo ainda está null! então minha busca no banco de dados retorna um objeto vazio, que por estar vazio não atualiza a tela corretamente ¬¬.

aí vem a seginte questão:
em um outro momento, (por exemplo, quando eu altero o valor dentro de um input, e mando gravar no banco) se verifico novamente aquele antigo atributo, ele já está setado corretamente, inclusive dando update, no campo correto no meu banco de dados…

existe uma maneira de forçar, que assim que eu escolha no combo um valor, a minha propriedade já receba o valor do mesmo??

deve ter ficado meio confuso… mas quem puder ajudar…

deem uma olhadinha e me ajudem por favor!

sou novato no forum e iniciante em Java, e tenho que fazer este programa para segunda feira… :frowning:
:oops:

meu JSP está desta forma:

<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<html>
<head>
<title>Cadastro de parâmetros</title></head>
<body>
<f:view>
<h:form>
	<a4j:loadScript src="js/jquery.js" />
<center>
  <ui:composition xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich">
            
    <rich:panel style="padding:0;width:75%;" headerClass="outpanelHeader">
        <f:facet name="header">
            <rich:spacer height="4" />
        </f:facet>
        <h2 align="center"><h:outputText value="Configuração de parâmetros" /></h2>       
            <rich:panel bodyClass="inpanelBody">
                <f:facet name="header">
                    <h:outputText value="Selecione o parâmetro a ser alterado" /> 
                </f:facet>                        
                       <a4j:region>
                       <rich:comboBox id="chave" selectFirstOnUpdate="false"
                        defaultLabel="escolha o parâmetro" value="#{parametroBean.chave}">
                           <f:selectItems value="#{parametroBean.listaParametro}" />
                             <a4j:support event="onchange" actionListener="#{parametroBean.buscarParametro}"
                           reRender="desc,antecedencia" immediate="true" />
                       </rich:comboBox>
                       
                       <br>
                       <h:outputText id="desc" value="#{parametroBean.descricao}" /><br>
                       <rich:inplaceInput id="antecedencia" defaultLabel="clique aqui para alterar o parâmetro" 
                      showControls="true" value="#{parametroBean.valor}"> 
                      <rich:jQuery selector="#antecedencia" query="mask(99)" timing="onload" />
                       <a4j:support event="onchange" actionListener="#{parametroBean.altParametro}"
                           reRender="desc,antecedencia"/>
                      </rich:inplaceInput>
                      <br><br>                     
                    </a4j:region>                              
            </rich:panel>  
    </rich:panel>
</ui:composition>
</center> 
</h:form>  
</f:view>
</body>
</html>

e minha Bean está da seguinte forma:

package fronteira;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;

import controle.ParametroCtr;
import entidade.Parametro;

public class ParametroBean extends Parametro{
	public List<SelectItem> listaParametro;
	public ParametroBean() {
		super();
		  listaParametro = new ArrayList<SelectItem>();		  
		}
	
	public String altParametro(){
	  String retorno = new String();
	  ParametroCtr param = new ParametroCtr();
	  Parametro parametro = new Parametro();
	  parametro.setChave(this.getChave());
	  parametro.setValor(this.getValor());
	  
	  if (param.alteraParamentro(parametro)){
		  retorno = "sucesso";
	  } else
		  retorno = "erro";
	  return retorno;
	}
	
	public String buscarParametro(){
	  String retorno = new String();
	  ParametroCtr param = new ParametroCtr();
	  Parametro parametro = new Parametro();
	  Parametro resposta = new Parametro();
	  parametro.setChave(this.getChave());	 
	  resposta = param.buscaParametro(parametro);
	  if (!resposta.getDescricao().equals("")){
		  this.setDescricao(resposta.getDescricao());
		  this.setValor(resposta.getValor());
		  retorno = "sucesso";
	  } else
		  retorno = "erro";
	  return retorno;	  	
	}

	public List<SelectItem> getListaParametro() {
		ParametroCtr par = new ParametroCtr();
		listaParametro = par.listaParametros();
		return listaParametro;
	}

	public void setListaParametro(List<SelectItem> listaParametro) {
		this.listaParametro = listaParametro;
	}	
}

a classe Parametros de onde a Bean é extendida, contém os atributos:

private  Integer codigo;

private  Date dataInclusao;

private  Date dataAlteracao ;

private  String chave;

private  String valor;

private  String descricao;

com seus respectivos Get’s/set’s…

por favor pessoal… semana santa, mas quem tiver em casa me ajuda!!!

:wink:

agradeço!

Os dados que preenchem o combo vem do banco, certo?

Bom, recentemente usei comboBox em uma aplicação e não tive problema algum. Usei h:selectOneMenu

Código:

<h:selectOneMenu id="listaDeJustificativas" value="#{registroPontoPojo.registroPonto.justificativa.idJustificativa}" style="width:180px" 
                            rendered="#{consultarFrequenciaBean.isMesCorrente}">
                
		<f:selectItems id="idSelectJustificavivas" value="#{consultarFrequenciaBean.listaJustificativas}"/>
</h:selectOneMenu>

Tente mudar para essa propriedade e coloque breackpoints para ver se o atributo está acessando get/set.

Veja se vc está passando a chave corretamente para o DAO…

Enfim, dê um pente fino no código para anallisar se o fluxo está todo correto.

Abraços

thiago.limma

dá uma olhada também nos espaços no fim de cada componente.

Como nesse aqui:

<f:selectItems value="#{parametroBean.listaParametro}" />

No fim do SelectItems tem um espaço antes do fechamento dele

icarometal

fera, já fiz todos os ajustes, mas continuo com o problema…
na verdade, acho que você não consegiu entender o que eu estava tentando dizer…

meu problema na verdade, é que meu combo está sendo preenchido corretamente e tal, meu problema, é quando vou enviar os dados ao DAO, quando mando gravar, parece que os dados do bean não foram atualizados de acordo com os dados da tela saca?

:shock: estranho isso…

se puder me ajudar serei grato!

thiago.limma

icarometal:
fera, já fiz todos os ajustes, mas continuo com o problema…
na verdade, acho que você não consegiu entender o que eu estava tentando dizer…

meu problema na verdade, é que meu combo está sendo preenchido corretamente e tal, meu problema, é quando vou enviar os dados ao DAO, quando mando gravar, parece que os dados do bean não foram atualizados de acordo com os dados da tela saca?

:shock: estranho isso…

se puder me ajudar serei grato!


Vc fez o debug no eclipse? Viu se seus métodos get estão pegando o que vc seta na tela? Coloque break point nos métodos e veja o que acontece… Vc sabe debugar no eclipse?

Abs

thiago.limma

Outra coisa… seu bean está definido no web.xml?

icarometal

Thiago,

sim, eu sei debugar no eclipse… e também meu bean está definido no web.xml, e mapeado no faces-config.xml…

debugando, o bean, não pega o valor que é setado na tela não… porém quando eu seto um valor para os atributos do bean, dentr do mesmo, ele repassa os valores para a tela!

:shock:

[]'s

fabio.massa

Fala icarometal blz?, ja conseguiu resolver seu problema?
Bom não sei se é esse o caso, mas notei um pequeno problema na linha:

&lt;a4j:support event="onchange" actionListener="#{parametroBean.buscarParametro}"  /&gt;

Seu método buscarParametro está definido no actionListener do a4j:support, portanto no seu managed-bean não deve retornar nada (void) e deve receber uma classe do faces (ActionEvent) ± assim:

public void buscarParametro(ActionEvent event) {..}

Da forma que está esse método nem é acionado.

Abraços,

bland

Outra coisa muito importante de ser dita…

O rich:combobox não é exatamente um combobox, mas uma versão melhorada do suggestionBox, ou seja, ele não irá funcionar da maneira que quer que ele funcione. Esse componente seria melhor utilizado em uma tela de pesquisa, onde o usuário digita o que deseja pesquisar e o componente mostra as melhores opções de pesquisa.

Para resolver o seu problema é melhor que você utilize o h:selectOneMenu. Assim, você consegue fazer uma sincronização com o seu Managed-Bean da melhor forma, e ainda mais, passando o objeto inteiro para o seu bean, sem ter que ficar passando ID pra lá e ID pra cá.

Para passar o Objeto inteiro, dá uma pesquisada por converters. E para achar um material em português bem interessante, dá uma pesquisada em converters e rponte.com.br. É um post criado pelo Rafael Ponte em seu blog. Agiliza e muito o desenvolvimento de aplicações que precisam estar mantendo essa sincronização ativa.

Ah, e outra dica, você está usando Facelets? Se não, que tal começar por aqui: Utilizando AJAX com JSF de Maneira Eficiente.

Bons estudos e boa sorte.

Criado 9 de abril de 2009
Ultima resposta 13 de abr. de 2009
Respostas 8
Participantes 4