Archive for the ‘JavaScript’ Category

Problema do rendered dinâmico com JSF

Wednesday, December 1st, 2010

Desde o surgimento dos conjuntos de componentes Ajax passou-se a aproveitar melhor as features do JSF e destes componentes para trazer ao usuário uma UI mais rica e na medida do possível mais leve. Graças a estes componentes ficou mais fácil desenvolver estes tipos de UI quase que transparentemente da mesma forma convencional (sem Ajax) que estávamos acostumados a escrever nossas páginas.

Entre tantos benefícios dessa abordagem apareceram alguns problemas que também não estávamos acostumados a lidar, como saber o que enviar e repintar antes de uma requisição Ajax, ou saber limpar um formulário adequadamente quando necessário ou mesmo repintar determinados componentes de exibição dinâmica.

Pegando este último problema como tema deste post, o que eu tenho notado é que ainda hoje em dia ele é um dos problemas mais comuns de acontecer e ao mesmo tempo um dos mais discutidos em fóruns e listas de discussão. Sendo, nada mais justo do que explana-lo aqui no blog e facilitar a vida de muitos, assim como a minha.

Problema

Este problema, que muitos ainda desconhecem, é comumente conhecido como “problema do rendered dinâmico” (bem, ao menos é como eu o chamo!) e só acontece quando trabalhamos com JSF e Ajax - independente do conjunto de componentes - mais especificamente após tentarmos repintar (ou rerenderizar, como você queira chamar) um componente com o atributo rendered dinâmico, como este:


    

Este componente poderia ser repintado após algum evento Ajax disparado pelo usuário na tela, como por exemplo ao selecionar o tipo de cadastro entre pessoa física ou jurídica, algo similar a isto:


    
    
    

Aparentemente não há qualquer problema com os trechos de código acima, principalmente se o componente iniciar visível para o usuário (ou seja, a EL ${myBean.pessoaFisica} do rendered estiver sendo avaliada para true).

Após mudar para o tipo pessoa jurídica é disparado um evento Ajax, o componente é repintado e desaparece da tela, como era de se esperar, claro. Contudo se você alterar a opção para o tipo pessoa física o componente não reaparecerá para o usuário. E é aí onde está o problema!

Se você for esperto, após alguns minutos analisando o problema, notará que a requisição Ajax foi disparada pelo componente tipoDePessoa (Firebug, plugin para Firefox, pode te ajudar aqui), o estado do managed bean foi alterado e o ciclo de vida do Faces foi processado sem qualquer erro.

E a partir daí, depois de refazer e analisar todos os passos básicos e sensatos, perde-se inúmeras horas tentando descobrir onde está de fato o problema neste simples cenário. A primeira vista parece ser um bug do JSF ou do conjunto de componentes, mas na verdade não é.

Solução

Sendo direto e sem rodeios: você não pode rerenderizar um componente na qual possua o atributo rendered dinâmico, ou seja, o componente não pode possuir EL para definir seu estado de visibilidade para o usuário.

Para resolver isso, repinte o componente parent do componente que possui o rendered dinâmico. Lembrando que este componente parent não pode ter o atributo rendered dinâmico, ou seja, ele sempre precisa ser renderizado.

Componentes como a4j:outputPanel ou mesmo h:panelGroup são excelentes componentes para servirem como componente parent. Sabendo disto, o código apropriado seria algo como:


    
        
    

E o componente responsável pelo evento Ajax deve repintar, no caso acima, o a4j:outputPanel (componente parent sem rendered dinâmico) e não mais o h:panelGroup.

Entendendo o problema

Para quem ainda não sabe, o atributo rendered (que por padrão é true) dos componentes é responsável por tornar o componente visível ou não para o usuário, ou seja, sempre que este atributo for true o componente poderá gerar código XHTML para ser exibido na página. Caso ele seja false, normalmente, nenhum código XHTML é gerado. Vale lembrar que mesmo o rendered sendo false o componente ainda existe na árvore de componentes no lado servidor.

Não é interessante tentar rerenderizar um componente com rendered dinâmico pois quando o atributo rendered é avaliado para false o componente (código XHTML na verdade) não aparece na árvore DOM da página. Sendo, após repintar este mesmo componente (agora com rendered avaliado para true) o código JavaScript do Richfaces responsável por atualizar o bloco de código onde se encontraria o componente na árvore DOM não consegue achar a posição exata para repintar na página (para injetar o novo código XHTML), já que o código XHTML do componente não existe mais. Então, no final, o Javascript do Richfaces acaba simplesmente não fazendo nada.

Por isso, quando você repinta um componente parent qualquer (que sempre tem o atributo rendered avaliado para true) o Richfaces consegue encontrar a posição exata deste componente na página e injetar o novo código XHTML, e como o componente com rendered dinâmico é um nó (filho) do componente parent ele também é repintado.

Concluindo

O problema é simples e a solução mais simples ainda! Nada como ler a documentação do seu conjunto de componentes favorito para entender e evitar este problema. Vale salientar que este problema ocorre com praticamente todos os conjuntos de componentes Ajax.

Acho que para um assunto simples como este eu falei mais do que devia. Espero que tenha ficado claro ou ao menos tenha dado uma luz para quem está enfrentando essa dor de cabeça. Caso queria saber mais sobre o assunto você poderá consultar a documentação do Richfaces, mais especificamente os tópicos 5.5 e 5.6.1.

Enfim, estou feliz por ter tirado mais um post antigo da minha lista de drafts! Atualmente minha rotina diária não tem me permitido investir o tempo que eu gostaria para blogar, mas cá estamos nós novamente, certo? :-)

CEJUG completa 7 anos

Thursday, September 10th, 2009

Como o tempo passa rápido. Lembro-me de quando ainda era um mero estagiário, por volta do início de 2005, e havia acabado de entrar para o grupo de discussão do CEJUG.

No início era só mais um “observer” entre tantos, apenas lia as threads que ali rolavam e por poucas vezes postei algo ou até mesmo respondi alguma dúvida. Na época meu conhecimento ainda era muito limitado, e minha timidez e baixa-estima não me permitiam colaborar com o grupo.

Aos poucos fui (re)conhencendo certos nomes, membros que postavam e ajudavam bastante com o grupo. Ficava claro quem realmente tinha alguma estima pelo grupo. Ficava claro quem realmente eram os verdadeiros formadores de opinião no grupo e mais ainda, porque eles realmente tinham o respeito merecido na lista.

Graças aos poucos eventos da época e a estas pessoas eu, sem perceber, me envolvi com o grupo. Passei a participar ativamente da lista, a fazer questão de ir aos eventos e principalmente divulga-los em outras listas de discussão, instituições e empresas.

Estava mais que óbvio que o grupo, CEJUG, se tornara algo importante no meu dia-a-dia, e principalmente era importante para o nosso mercado de trabalho, aqui em Fortaleza. Cada dia mais eu passei a me dedicar de alguma maneira para grupo, e foi daí que, depois de algum tempo, tive a oportunidade e o privilégio de ajudar o grupo de uma forma mais direta: minha primeira palestra no CEJUG.

Houveram muitos altos e baixos no grupo, tenho o orgulho de dizer que participei da maioria deles. Fiz muitos amigos, e até mesmo alguns poucos “inimigos”. Mas tudo que houve agregou valor a minha vida profissional e como pessoa.

Café com Tapioca

Café com Tapioca

Hoje, depois de quase 5 anos caminhando junto com o grupo, eu tenho o prazer de anunciar que no dia 19 de Setembro irá ocorrer o Café com Tapioca do 7º Aniversário do CEJUG.

Assim como nos eventos de aniversário anteriores, este será um grande evento para o nosso mercado e trará grandes nomes nacionais e locais. Alias, o número de palestras, e o próprio evento em si, está bem maior que nos anos anteriores.

Teremos 7 palestras sobre vários assuntos técnicos, desde TDD, JME, frameworks web, até metodologias ágeis. Todos os assuntos estão diretamente relacionados ao atual cenário do nosso mercado. Vale ressaltar que as palestras serão ministradas por Paulo Silveira, Rodrigo Yoshima, Jeveaux, Bruno Pereira, Tarso Bessa, eu, Régis Melo e Victor Oliveira.

Com toda certeza este será um evento que marcará, com Java, o ano de 2009 no Ceará. Um dia inteiro de palestras, networking com grandes profissionais, brindes (quem não gosta!) e muita troca de informações sobre a plataforma Java. Vale muito a pena sair de casa neste sábado, dia 19 de Setembro, e investir seu tempo neste evento.

Espero encontrar todos lá, se não a maioria dos profissionais e estudantes membros dos CEJUG no evento. Até o dia 19.