GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Comunicação entre managedBens no JSF 2


#1

Bom dia a todos,

Bom, tenho uma pagina xhtml que usa varios managedBeans, alguns deles utilizam do valueChangeListener para receber as listas com os valores, eu gostaria de saber como é possivel setar valores

Pois estou tentando desta maneira abaixo, mas não funciona

Parte do managedBean GravaObra

GravaCidade c = new GravaCidade();
            c.setCidadesMany(null);

Pagina XHTML

                        <tr>
                            <td>ID:</td>
                            <td><h:inputText id="obrIdLeitura" disabled="true" value="#{gravaObra.obr_id}"/></td>
                        </tr>
                        <tr>
                            <td>Nome da Obra:*</td>
                            <td><h:inputText id="obrNom" required="true"  value="#{gravaObra.obr_nom}"/></td>                            
                        </tr>
                        <tr>
                            <td colspan="3"><h:message  styleClass="mensagemErro" for="obrNom" /></td>
                        </tr>
                        <tr>
                            <td>
                                País:*
                            </td>
                            <td>
                        <h:selectOneMenu immediate="true" valueChangeListener="#{gravaCidade.mudaListaEstado}" onchange="submit()" id="cidPais" value="#{gravaCidade.pai_nom}">
                            <f:selectItem itemLabel="" itemValue="" />
                            <f:selectItems value="#{gravaCidade.paises}" var="u" itemLabel="#{u.pai_nom}" itemValue="#{u.pai_nom}" />
                        </h:selectOneMenu>
                        </td>
                        </tr>
                        <tr>
                            <td>Estado:*</td>
                            <td>
                        <h:selectOneMenu immediate="true" valueChangeListener="#{gravaCidade.mudaListaCidade}" onchange="submit()" id="somEstado" value="#{gravaCidade.est_id}" >
                            <f:selectItems  value="#{gravaCidade.estadosMany}" var="u" itemLabel="#{u.est_nom}" itemValue="#{u.est_id}" />
                        </h:selectOneMenu>
                        </td>                        
                        </tr>
                        <tr>
                            <td colspan="2"><h:message  styleClass="mensagemErro" for="somEstado" /></td>
                        </tr>
                        <tr>
                            <td>Cidade:*</td>
                            <td><h:selectOneMenu id="cidId" value="#{gravaObra.cid_id}" >
                                <f:selectItems  value="#{gravaCidade.cidadesMany}" var="u" itemLabel="#{u.cid_nom}" itemValue="#{u.cid_id}" />
                        </h:selectOneMenu></td>
                        </tr>
                        <tr>
                            <td colspan="3"><h:message  styleClass="mensagemErro" for="cidId" /></td>
                        </tr>
                        <tr>
                            <td>Inspetoria:*</td>
                            <td><h:selectOneMenu id="insId" required="true" value="#{gravaObra.ins_id}">
                            <f:selectItems value="#{gravaInspetoria.inspetorias}" var="u" itemLabel="#{u.ins_nome_religioso}" itemValue="#{u.ins_id}" />
                        </h:selectOneMenu></td>

#2

Olá fabiobh, você poderia postar o código do seu ManagedBean?


#3

Sim, ai esta a parte do codigo q estou tentando usar

public void editar() throws ClassNotFoundException {
        //a parte do id funciona
        String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
        Integer numero = null;
        Session sessao = CriadorDeSessaoNovo.getSession();
        //seleciona cidade baseada no id
        Criteria listagem_query = sessao.createCriteria(Obra.class).                
                add(Restrictions.eq("obr_id", new Integer(id))).
                addOrder(Order.asc("obr_nom"));
        listagem_query.uniqueResult();
        List<Obra> listaQuery = (listagem_query.list());
        for (Obra obra : listaQuery) {
            setCid_id(obra.getCidade().getCid_id());
            setIns_id(obra.getInspetoria().getIns_id());
            //setObr_atividades(obr_atividades);
            setObr_bairro(obra.getObr_bairro());
            setObr_caixa_postal(obra.getObr_caixa_postal());
            setObr_cep(obra.getObr_cep());
            setObr_cnpj(obra.getObr_cnpj());
            setObr_id(obra.getObr_id());
            setObr_logradouro(obra.getObr_logradouro());
            setObr_nom(obra.getObr_nom());
            setObr_nom_anteriores(obra.getObr_nom_anteriores());
            setObr_nom_fantasia(obra.getObr_nom_fantasia());
            setObr_nom_oficial(obra.getObr_nom_fantasia());
            setObr_nom_oficial(obra.getObr_nom_oficial());
            setObr_sede_inspetoria(obra.getObr_sede_inspetoria());
            //parte q estou tentando fazer funcionar
            GravaCidade c = new GravaCidade();
            c.setCidadesMany(null);
        }
        sessao.close();
    }

#4

Olá fabiobh! Me desculpa, mas não entendi exatamente o que você deseja fazer. Você possui um formulário e precisa adicionar o conteúdo do mesmo no banco?

No JSF há um recurso chamado PropertyActionListener, no qual eu menciono qual objeto eu desejo setar no ManagedBean. Veja um exemplo:

<h:commandLink value="Alterar">
	<f:setPropertyActionListener value="#{contato}" target="#{contatoBean.contato}"/>
</h:commandLink>

O atributo value diz ao JSF qual atributo eu desejo setar no contatoBean.contato. Isso exige que eu tenha um método setContato(Contato c) para receber esse contato sendo enviado. Essa é uma forma no JSF de setar atributos arbitrariamente.

Estou à disposição!!!


#5

O que vc fez foi passar um valor da pagina para o managedBean, o que eu queria fazer era o contrário, a partir do managedBean setar um valor na pagina.

Porém no meu caso não esta sendo simples, pois minha pagina html usa varios selectOneMenu, e cada um deles é carragado através de um managedBean diferente

<h:inputText id="obrIdLeitura" disabled="true" value="#{gravaObra.obr_id}"/>
<h:inputText id="obrNom" required="true"  value="#{gravaObra.obr_nom}"/>
<h:selectOneMenu immediate="true" valueChangeListener="#{gravaCidade.mudaListaEstado}" onchange="submit()" id="cidPais" value="#{gravaCidade.pai_nom}">
   <f:selectItem itemLabel="" itemValue="" />
   <f:selectItems value="#{gravaCidade.paises}" var="u" itemLabel="#{u.pai_nom}" itemValue="#{u.pai_nom}" />
</h:selectOneMenu>
<h:selectOneMenu immediate="true" valueChangeListener="#{gravaCidade.mudaListaCidade}" onchange="submit()" id="somEstado" value="#{gravaCidade.est_id}" >
   <f:selectItems  value="#{gravaCidade.estadosMany}" var="u" itemLabel="#{u.est_nom}" itemValue="#{u.est_id}" />
</h:selectOneMenu>
<h:selectOneMenu id="cidId" value="#{gravaObra.cid_id}" >
   <f:selectItems  value="#{gravaCidade.cidadesMany}" var="u" itemLabel="#{u.cid_nom}" itemValue="#{u.cid_id}" />
</h:selectOneMenu>
<h:selectOneMenu id="insId" required="true" value="#{gravaObra.ins_id}">
   <f:selectItems value="#{gravaInspetoria.inspetorias}" var="u" itemLabel="#{u.ins_nome_religioso}" itemValue="#{u.ins_id}" />
</h:selectOneMenu>

O que eu gostaria de fazer é atraves do managedBean q salva os dados desta pagina, ser possivel setar outros valores para as listas exibidas

ps: estou usando @ViewScoped


#6

Olá fabiobh!

Você deseja preencher uma lista com base nos valores que você inseriu nessa mesma página?


#7

Sim, era isso que eu estava tentando fazer, baseado no meu

valueChangeListener="#{gravaCidade.mudaListaEstado}"

Eu mudo as listas
Por exemplo, na hora que a pessoas seleciona o Pais Brasil(tem cerca de uns 10 paises pra escolher) no selectOneMenu o valueChangeListener passa um evento pro managedBean e trata ele devolvendo somente os Estados referentes aquele pais, até ai tudo bem.
O problema é na hora que chamo a pesquisa, a pesquisa exibe varias informações de uma obra cadastrada no sistema, com seu pais e estado, com isso o usuario tem como clicar em um commandButton dentro das linhas do resultado e este por si ira exibir as informações pertinentes a uma obra
Nessa hora é q ocorre o problema, pois ja tenho que setar o valor da lista que ira preencher o selectOneMenu junto com o valor q sera atribuido a ele, porém não consigo setar a lista sendo q ela vem de um outro managedBean

pagina xhtml

<rich:dataTable id="items" styleClass="pesquisar"
                                    value="#{pesquisaTudo.suaListaPesquisa}" 
                                    var="x">
                        <h:column >     
                            <h:form>
                                <h:commandButton value="Editar" action="#{gravaObra.editar}">
                                    <f:param name="id" value="#{x.obr_id}" />
                                </h:commandButton>
                            </h:form>                                
                        </h:column>

parte do managedBean Obra

public void editar() throws ClassNotFoundException {
        String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
        //System.out.println("consegui aparecer: " + id);
        Integer numero = null;
        Session sessao = CriadorDeSessaoNovo.getSession();
        //seleciona cidade baseada no id
        Criteria listagem_query = sessao.createCriteria(Obra.class).                
                add(Restrictions.eq("obr_id", new Integer(id))).
                addOrder(Order.asc("obr_nom"));
        listagem_query.uniqueResult();
        List<Obra> listaQuery = (listagem_query.list());
        for (Obra obra : listaQuery) {
            setCid_id(obra.getCidade().getCid_id());
            setIns_id(obra.getInspetoria().getIns_id());
            //setObr_atividades(obr_atividades);
            setObr_bairro(obra.getObr_bairro());
            setObr_caixa_postal(obra.getObr_caixa_postal());
            setObr_cep(obra.getObr_cep());
            setObr_cnpj(obra.getObr_cnpj());
            setObr_id(obra.getObr_id());
            setObr_logradouro(obra.getObr_logradouro());
            setObr_nom(obra.getObr_nom());
            setObr_nom_anteriores(obra.getObr_nom_anteriores());
            setObr_nom_fantasia(obra.getObr_nom_fantasia());
            setObr_nom_oficial(obra.getObr_nom_fantasia());
            setObr_nom_oficial(obra.getObr_nom_oficial());
            setObr_sede_inspetoria(obra.getObr_sede_inspetoria());
            GravaCidade c = new GravaCidade();
            c.setCidadesMany(null);
            //setObr_tipo_ensino(obr_tipo_ensino);
            //setObr_tipo_social(obr_tipo_social);            
        }
        sessao.close();
    }

Repare que o managedBean que é responsavel por exibir a lista é diferente do managedBean que esta fazendo a pesquisa
Espero que eu tenha conseguido explicar , t+


#8