<a4j:support reRender=""> Não estão funcionando.

151 views
Skip to first unread message

Euclides Filizola

unread,
Sep 17, 2010, 9:31:54 AM9/17/10
to jav...@googlegroups.com, jav...@googlegroups.com, disc...@cejug.dev.java.net
Bom dia pessoal,

estou há 1 dia nesse problema de renderizar um componente e teste de n formas. Gostaria que o olho clínico de alguém pudesse apontar algum erro.

Aqui está o meu problema:

http://www.guj.com.br/posts/list/218579.java


Sérgio Fantin

unread,
Sep 17, 2010, 9:55:22 AM9/17/10
to jav...@googlegroups.com
Primeiro de tudo... coloque um breakpoint no método setExterno e veja se pára lá.

Mude seu código:

<h:selectBooleanCheckbox id="id_externo" value="#{movimentacaoMBean.externo}">
     <a4j:support reRender="painel_orgao_externo" action="doDummy" event="onclick" /> 
</h:selectBooleanCheckbox> 

<a4j:outputPanel id="painel_orgao_externo" ajaxRendered="true">
 
    <h:outputLabel value="Orgao externo" id="lb_orgaoexterno" /> 
    <h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" > 
               <f:selectItem itemLabel="" /> 
        <f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" /> 
        </h:selectOneMenu> 

</a4j:outputPanel>

Crie este método no seu mb:

public void doDummy(){
    // do nothing...
}

Coloque o resultado aqui.

Abraços...

2010/9/17 Euclides Filizola <euclides...@gmail.com>


--
Você recebeu esta mensagem por que é membro do Google Group "Javasf".
http://groups.google.com/group/javasf
 
Conheça também:
- Grupo Java Brazil em http://groups.google.com/group/thejavabrazil



--
Sérgio Fantin
http://serjaum.wordpress.com

Euclides Filizola

unread,
Sep 17, 2010, 9:56:58 AM9/17/10
to jav...@googlegroups.com
já foi colocado e foi explico no guj. mas vou te explicar aqui,

ele realmente não entra no método quando eu debbugo.

Carlos Eduardo Rodrigues Diógenes

unread,
Sep 17, 2010, 9:45:16 AM9/17/10
to jav...@googlegroups.com
Usa o a4j:outputPanel como descrito aqui:
http://livedemo.exadel.com/richfaces-demo/richfaces/outputPanel.jsf;jsessionid=D5A7DCF78741A50C6A6C1455EE7FDA5A?c=outputPanel&tab=usage

Nesse exemplo ele mostra exatamente o teu problema. Tu deve estar
fazendo do jeito que não funciona.

Em 17 de setembro de 2010 10:31, Euclides Filizola
<euclides...@gmail.com> escreveu:

Dionatan Moura

unread,
Sep 17, 2010, 9:59:42 AM9/17/10
to jav...@googlegroups.com
Já tive alguns problemas estranhos assim com check box.

Tu poderia testar o teu código com h:selectOneRadio ao invés do h:selectBooleanCheckbox?

Espero que funcione...
- Dionatan.

2010/9/17 Euclides Filizola <euclides...@gmail.com>

Euclides Filizola

unread,
Sep 17, 2010, 10:24:45 AM9/17/10
to jav...@googlegroups.com
Não funcionou não mano.

Alexandre Silveira

unread,
Sep 17, 2010, 10:53:11 AM9/17/10
to jav...@googlegroups.com
Cara, é o famoso problema de rendered dinamico..

Pensa comigo.. ao montar a página, o valor de #{movimentacaoMBean.externo} é false, certo?

Portanto, o bloco <a4j:outputPanel id="painel_orgao_externo" ajaxRendered="true"> não existe no tue viewRoot.

Como então o a4j:support vai reRenderizar um cara que não existe?

Adiciona um outro outputPanel por fora desse que tu já tens e define um Id pra ele e manda dar reRender nele.

Esse assunto já foi discutido umas 200 vezes na lista.. é um dos erros primários em JSF :)

2010/9/17 Euclides Filizola <euclides...@gmail.com>



--
_________________________________
Alexandre Silveira Neto
Analista e Desenvolvedor de Sistemas
Técnico de TI
E-Mail/MSN: alexandre at ftlan.com


Sérgio Fantin

unread,
Sep 17, 2010, 11:06:07 AM9/17/10
to jav...@googlegroups.com
Alexandre,

bom lembrete, mas só pra constar...

você pensou no código do colega(<h:panelGroup id="painel_orgao_externo" rendered="#{movimentacaoMBean.externo}"), mas colou o código que sugeri. Nele não há rendered dinâmico. Certo? :)

Abraços...


2010/9/17 Alexandre Silveira <alexand...@gmail.com>

Alexandre Silveira

unread,
Sep 17, 2010, 11:59:27 AM9/17/10
to jav...@googlegroups.com
Correto Sérgio, não me liguei que era o teu código, mas se aplica da mesma forma

No código dele "<h:panelGroup id="painel_orgao_externo" rendered="#{movimentacaoMBean.externo}">" deve se tornar :

<a4j:outputPanel id="painel_orgao_externo" rendered="#{movimentacaoMBean.externo}"

<h:panelGroup rendered="#{movimentacaoMBean.externo}"

......

:)

2010/9/17 Sérgio Fantin <sergio.l...@gmail.com>

Euclides Filizola

unread,
Sep 17, 2010, 12:27:18 PM9/17/10
to jav...@googlegroups.com
Boa tarde Alexandre,

mais uma vez eu pedi para que lesse o post. Eu já fiz do jeito que dissestes ae,

e vou explicar mais uma vez a parte em que não funciona:

ele não chega a executar o método que está dentro da action, eu o fiz debbugando e não funciona.

detalhe: ele não mostra erro do ajax, ele não mostra erro de view, ele não renderiza... ele n da nenhum sinal de erro...

e eu sei q ele não pode "Re"-renderizar algo que ainda não foi "pintado" .

Ellison Alves

unread,
Sep 17, 2010, 12:46:01 PM9/17/10
to jav...@googlegroups.com
Cara, tua thread no GUJ ta grande hein !!! hahahahaha
Tipo, eu sei que ta lá....mas tbm tem várias tentativas...
vc pode mostrar o teu cenário atual aqui ?

O que e onde vc quer renderizar ?

[TENTANDO AJUDAR LOGO]

    1. <h:selectBooleanCheckbox  id="id_externo" value="#{movimentacaoMBean.externo}" >  
    1.                 <a4j:support reRender="painel_orgao_externo" event="onclick" />  
    2.                 </h:selectBooleanCheckbox>  
    3.               
    4.               
    1.                 <h:panelGroup id="painel_orgao_externo" rendered="#{movimentacaoMBean.externo}">  
    1.                 <h:outputLabel value="Orgao externo" id="lb_orgaoexterno" />  
    2.                 <h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" >  
    3.                       <f:selectItem itemLabel="" />  
    4.                         <f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" />  
    5.                     </h:selectOneMenu>  
    1.                 </h:panelGroup>  

    Julgando pelo teu cenário no GUJ.
    Vc deveria ter um actionListener no seu a4j:support para preencher o selectOneMenu que segue.

    Mas em vez de vc dar reRender no painelGroup...tenta dar um reRender no form e vejamos o que acontece.

    Coloca mais infos aqui tbm...abraço
    Ellison Alves de Souza

    Alexandre Silveira

    unread,
    Sep 17, 2010, 12:44:25 PM9/17/10
    to jav...@googlegroups.com
    tem muita página lá! hehe

    Esse conjunto está dentro de um form correto?

    Se tu montar uma página bem simples, soh com um form, e esse conjunto de componentes, não funciona?

    Outra coisa, quando tu falas que ele naõ entra na action, de qual action tu te referes?

    A partir do teu código original, fiz umas alterações que acredito que deveria funcionar.. segue:

    <a4j:form>

        <h:selectBooleanCheckbox  id="id_externo" value="#{movimentacaoMBean.externo}" > 
            <a4j:support reRender="painel_orgao_externo" event="onclick" ajaxSingle="true" /> 
        </h:selectBooleanCheckbox> 
       
        <a4j:outputPanel id="painel_orgao_externo">             
            #{movimentacaoMBean.externo}
            <h:panelGroup rendered="#{movimentacaoMBean.externo}"> 
                <h:outputLabel value="Orgao externo" id="lb_orgaoexterno" /> 
                <h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" > 
                    <f:selectItem itemLabel="" /> 
                    <f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" /> 
                </h:selectOneMenu> 
            </h:panelGroup>
        </a4j:outputPanel>
    </a4j:form>

    E no managedBean

    private boolean externo;

    public void setExterno(boolean externo) {
        this.externo = externo;
    }

    public boolean isExterno() {
        return this.externo;
    }

    Dessa forma, ao clicar no checkbox, somente o valor de "externo" será mudado no mbean, isso está assegurado pelo ajaxSingle.
    Ao reRenderizar o paninel_orgao_externo, o valor de externo deve ser true. Para visualizar melhor, adicionei o valor do externo dentro do painel,
    para que fique visível qual o seu valor corrente ali dentro.

    Talvez tu já tenha experimentado dessa forma, mas acredito estar correta.

    Abraço e boa sorte.

    2010/9/17 Euclides Filizola <euclides...@gmail.com>

    Euclides Filizola

    unread,
    Sep 17, 2010, 1:01:00 PM9/17/10
    to jav...@googlegroups.com
    vou explicar o cenario atual: eu retirei tudo, vou colocar só oq eu quero renderizar, ou seja, o panelGroup de id "painel_orgao_externo". Beleza ?

    Ele precisa ser acionado por um checkbox, n importa como ele vai está, mas ele precisa inicialmente está "apagado", ou seja, eu preciso q ele não apareça de início quando for carregada a página, e só ser renderizado quando for clicado o botão "externo". O que está acontecendo atualmente é o seguinte: ao tentar renderizar um panel filho que já foi pintado, dentro de um panel pai, ele simplesmente não joga nenhum erro. Eu tentei mostrar o erro da seguinte forma:

    1. <a4j:outputPanel ajaxRendered="true">    
    2.             <h:messages showDetail="true"/>    
    3.         </a4j:outputPanel>

    mas ele não mostra erro. Eu tentei debbugar então, e oq ocorre: ele não passa pelo método chamado, ou seja, ele não está me dando nenhum sinal de vida.

    Aqui está o último codigo, enxuto, coloquei só oq está me dando dor de cabeça:

    1. <h:panelGroup id="painel_orgao_pai" >  
    2.             <h:outputLabel value="Externo"/>  
    1.             <h:selectBooleanCheckbox  id="id_externo" value="#{movimentacaoMBean.externo}" >  
    1.             <a4j:support reRender="painel_orgao_pai" event="onclick"  
    2.             ajaxSingle="true"  action="#{movimentacaoMBean.showExterno}"/>  
    3.             </h:selectBooleanCheckbox>  
    4.             <br />  
    1.       
    2.                <h:panelGroup id="painel_orgao_externo"  rendered="#{movimentacaoMBean.externo}">  
    3.                   <h:outputLabel value="Orgao externo" id="lb_orgaoexterno"/>  
    4.                     <h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" >  
    1.                       <f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" />  
    2.                   </h:selectOneMenu>  
    3.             </h:panelGroup>  
    1.     </h:panelGroup> 

    e aqui está parte q interessa do MB.

    1. public void showExterno() {    
    2.          System.out.println("is externo: " + externo);    
    3.      } 


    tem esse simples método apenas para verificar se estava passando por lá ,e ao tentar debbugar, ele realmente não passa pelo método.

    antes que me perguntem, ele está dentro de form normalmente.


    • <ui:composition template="/pages/layout.xhtml">  
    •     <ui:define name="conteudo">  
    •         <f:loadBundle basename="patrimonio.util.lb" var="lb" />  
    •           
    •          <a4j:outputPanel ajaxRendered="true">      
    •              <h:messages showDetail="true"/>      
    •          </a4j:outputPanel>   
    •            
    •            
    •         <h:form id="movimentacao_patrimonio"



    vou postar aqui pra vocês ele bem curto, o menos de parametros possíveis.

    m

    Ellison Alves

    unread,
    Sep 17, 2010, 1:27:14 PM9/17/10
    to jav...@googlegroups.com
    Opa, blz...valeu...agora melhorou ! =D
    Vamos as observações...
    ajaxSingle vai fazer apenas o seu componente que está fazendo a requisição ser processado no servidor.
    No a4j:support talvez seja melhor utilizar um actionListener
    o método showExterno tem que fazer o seguinte... isExterno = true;

    Possíveis problemas...
    1 - Sua aplicação pode ta passando por uma validação e não está sendo mostrada por conta do ajaxRendered="true"

    Tente essas coisas...

    1 - coloque seus selectOne dentro de um <a4j:region></a4j:region>
    2 - coloque um actionListener no seu a4j:support
    3 - No método showExterno ... isExterno = true, listaDeOrgsExternos = service.listaDeOrgsFromDao();
    4 - No fim do método coloca um System.out.println(); com os valores das operações que vc fez... e observe as respostas.
    5 - tire o ajaxRendered="true" do seu h:messages...desta forma acho q ele ta processando só ajax, não me lembro muito bem.
    6 - Use o firebug para conferir os IDs de seus components, para ter certeza de que estão certos.

    Mande seu progresso =D

    Abraço

    Ellison Alves

    unread,
    Sep 17, 2010, 1:29:50 PM9/17/10
    to jav...@googlegroups.com
    Ahhh acabei esquecendo...
    Mas tenho qse certeza que o problema é validação no ciclo de vida...
    no teu selectOne .... coloca immediate=true

    Alexandre Silveira

    unread,
    Sep 17, 2010, 1:31:49 PM9/17/10
    to jav...@googlegroups.com
    Ellison, se ele colocar immediate true, o valor (true) não será passado para o servidor.. Como não é um campo required, o ajaxSingle já permite que apenas ele seja enviado ao servidor, não tem como estar caindo na validação.

    Coloca o um a4j:messages dentro do teu form, e muda ele pra a4j tbm

    a4j:form

    a4j:messages

    o resto q tu ja tinha

    e manda bala pra ver se ta caindo na validação



    2010/9/17 Ellison Alves <elliso...@gmail.com>

    Ellison Alves

    unread,
    Sep 17, 2010, 1:41:35 PM9/17/10
    to jav...@googlegroups.com
    é verdade Alexandre....valeuu... esse erro é tão comum q a resposta foi até default rsrsrssrs

    Euclides Filizola

    unread,
    Sep 17, 2010, 1:50:14 PM9/17/10
    to jav...@googlegroups.com
    Agradecendo a ajuda de todos, até que enfim funcionou. Mas lembre-se, só funcionou porque é um a4j:form, se não for, ou seja, se for h:form, não funfa de jeito nenhum. estou utilizando o eclipse Helios.

    aqui está o código que funcionou:


    <a4j:form id="form_ajax">

           
             <a4j:outputPanel ajaxRendered="true">   
                 <h:messages showDetail="true"/>   
             </a4j:outputPanel>
           
             <h:panelGroup id="painel_orgao_pai" > 
                 <h:outputLabel value="Externo"/> 
                 <h:selectBooleanCheckbox  id="id_externo" value="#{movimentacaoMBean.externo}" > 
                 <a4j:support reRender="form_ajax" event="onclick" 
                   action="#{movimentacaoMBean.setaTrue}"/> 
                 </h:selectBooleanCheckbox> 
                 <br /> 
          
                    <h:panelGroup id="painel_orgao_externo"  rendered="#{movimentacaoMBean.externo}"> 
                       <h:outputLabel value="Orgao externo" id="lb_orgaoexterno"/> 
                         <h:selectOneMenu value="#{movimentacaoMBean.orgaoExterno.cdOrgao}" id="codOrgao" > 
                           <f:selectItems value="#{movimentacaoMBean.listaDeOrgsExternos}" /> 
                       </h:selectOneMenu> 
                 </h:panelGroup> 
         </h:panelGroup>
           
            </a4j:form>

    Em 17 de setembro de 2010 14:31, Alexandre Silveira <alexand...@gmail.com> escreveu:

    Ellison Alves

    unread,
    Sep 17, 2010, 1:58:59 PM9/17/10
    to jav...@googlegroups.com
    Aeee Congratulations!! hehehe =D
    com o h:form vc tentou com o outputPanel fora do form ?

    Desta forma está funcionando...pq o a4:form vai processar uma chamada assincrona... e o ajaxRendered="true" vai exibir pq opa...aconteceu uma chamada assincrona...

    Sei lá...se vc tiver um tempo...talvez seja interessante entender melhor o pq disso para não passar pelo perrengue novamente.

    Dionatan Moura

    unread,
    Sep 17, 2010, 2:16:31 PM9/17/10
    to jav...@googlegroups.com
    Não esqueça de postar a solução no GUJ :)

    Ramon Melo

    unread,
    Sep 17, 2010, 12:57:45 PM9/17/10
    to jav...@googlegroups.com
    Você ta usando o Eclipse Helios ne? Tive esse mesmo problema com ele.. 

    Em 17 de setembro de 2010 13:46, Ellison Alves <elliso...@gmail.com> escreveu:

    Dionatan Moura

    unread,
    Sep 17, 2010, 1:24:43 PM9/17/10
    to jav...@googlegroups.com
    Outra tentativa seria usar o valuechangelistener do JSF colocando o submit() no onclick do selectBooleanCheckbox. Sem usar ajax.

    2010/9/17 Euclides Filizola <euclides...@gmail.com>

    Ygor Gasparin

    unread,
    Sep 17, 2010, 12:41:55 PM9/17/10
    to javasf: JavaServer Faces Group
    Da uma olhada no FacesConfig
    Creio que tu fez o mapeamento errado do MB.
    Respondi com mais detalhes no forum do GUJ

    Rafael Ponte

    unread,
    Sep 18, 2010, 4:22:51 PM9/18/10
    to jav...@googlegroups.com
    Alexandre,

    Você está certo sobre o problema do rendered dinâmico. Contudo o componente existe na viewRoot independente do valor do rendered, ou seja, o componente existe na árvore de componentes porém não existe na árvore DOM da página :-)

    2010/9/17 Alexandre Silveira <alexand...@gmail.com>



    --
    Rafael Ponte
    http://www.rponte.com.br

    Rafael Ponte

    unread,
    Sep 18, 2010, 4:28:47 PM9/18/10
    to jav...@googlegroups.com
    Euclides,

    Inicialmente você estava caindo no problema do rendered-dinâmico, mas agora que você está repintando um componente pai (a4j:form) o problema não deveria ocorrer mais.

    Mas já que você resolveu o problema eu só queria atentar ao fato de que para componentes do tipo input normalmente se utiliza onchange e não onclick, é meio estranho tratar o evento onclick em um checkbox, seja via javascript ou faces. Talvez o problema seja isso (ou não) :-)

    Utilizar h:form ou a4j:form não deveria influênciar em nada se você não utiliza qualquer feature especifica do a4j:form.

    2010/9/17 Euclides Filizola <euclides...@gmail.com>



    --
    Rafael Ponte
    http://www.rponte.com.br

    Euclides Filizola

    unread,
    Sep 19, 2010, 8:52:41 AM9/19/10
    to jav...@googlegroups.com
    Bom dia,

    Rafael agradeço a sua atenção e vou me atentar aos detalhes de todos. Só uma pergunta rafael,

    com o h:form, você saberia me dizer qual seria a solução? Pois de todas postadas, tanto aqui neste grupo, como no guj, ninguém solucionou.
    Euclides Filizola ® - Java Developer.


    SCJP 6.0 - Coming Soon.
    #£n¢0d£r#

    "A própria idéia  de reconfigurar uma máquina para que ela faça uma quantidade aparentemente infinita de tarefas é forte e fascinante"

    Rafael Ponte

    unread,
    Sep 19, 2010, 10:40:38 AM9/19/10
    to jav...@googlegroups.com
    Euclides,

    Depois de uma thread tão grande acredito que somente olhando o código de perto e fazendo alguns testes. Mas inicialmente quando olhei para o código achei que o problema fosse o rendered dinâmico (não está repintando o componente) ou mesmo problema de escopo conversacional (não está executando o método no managed bean).

    Mas enfim, como disse, só olhando o código de perto mesmo. No mais, se usar h:form está resolvendo então continue utilizando ele.

    2010/9/19 Euclides Filizola <euclides...@gmail.com>

    Euclides Filizola

    unread,
    Sep 19, 2010, 10:51:50 AM9/19/10
    to jav...@googlegroups.com
    não está resolvendo o h:form, pelo contrário, só está funcionando com o <a4j:form>. Por isso eu te perguntei se você teria uma solução adequada, entendes?

    Alexandre Silveira

    unread,
    Sep 19, 2010, 12:38:18 PM9/19/10
    to jav...@googlegroups.com
    Perfeito, Rafael.

    Obrigado pela correção.

    2010/9/18 Rafael Ponte <rpo...@gmail.com>
    Reply all
    Reply to author
    Forward
    0 new messages