[JSF] Campos readonly perdem valor ao ocorrerem erros de validacao

3 respostas
Marcel_Horner

Senhores,

Quando realizo um submit de uma pagina na qual existe algum erro de validacao JSF todos os campos readonly perdem o valor informado.

O mesmo nao ocorre caso a pagina jah tenha sido carregada com esses valores.

Eu nao sei se isso eh algum problema de configuracao ou se eh o comportamento do JSF.

Alguem jah passou por essa situacao?
Como posso resolver este problema?

Grato,
Marcel.

3 Respostas

D

Poderia explicar melhor, sou expert nos bugs do JSF!!!

Pelo que entendi, vc ta perdendo o valores de um campo readonly. Tudo bem. Se o campo é readonly, como vc conseguiu inserir o valor?

O outro caso faz sentido, seu mgrBean está populando as informações hardcode!!!

Cara, se o campo não for readonly e vc setou e valor na página e processou com um CommandLink ou CommandButton, verifique se o immediate está setado com true.

Marcel_Horner

O campo read-only eh populado atraves de uma LOV (list of values).

Por exemplo: existe um cadastro de cidades onde sao informados o codigo e o nome da cidade. Existe tambem um cadastro de colaboradores onde eh preciso informar a cidade de nascimento do colaborador. Este cadastro tem dois campos com informacoes referentes a cidade. Um editavel destinado ao codigo e outro, readonly, destinado ao nome.

A cidade pode ser informada de duas formas. Uma delas eh digitar diretamente o codigo da cidade, neste caso o nome sera preenchido no campo readoly via DWR. Outra forma seria abrir a LOV e encontrar a cidade desejada na lista, entao ao clicar sobre o registro da cidade desejada os valores do codigo e nome seriam setados para os respectivos campos via javascript.

Os cadastros estao funcionando corretamente conforme o cenario descrito acima. Porem no backing bean os campos readonly possuem valor null e não o valor da tela.

O CommandButton nao eh immediate nao.

Marcel_Horner

Senhores,

Deixo aqui registrado para a posteridade o que encontrei sobre o problema descrito e a solucao adotada. Pelo que encontrei na net, JSF realmente nao recupera do lado do server os valores de campos disabled (ateh ai tudo bem pq eh o comportamento html padrao) e nem readonly (ai eh que ferrou a nossa vida):
“…for security considerations, the JSF engine doesn’t take over disabled
or readOnly attributes to the server, it was a bug that we did…”
(http://mail-archives.apache.org/mod_mbox/myfaces-users/200603.mbox/<[email removido]>)

Pra mim o bug esta no que eles julgam ser a correcao do mesmo, mas fazer o que…

Uma possivel solucao sugerida no forum da Sun seria incluir um campo hidden para passar o valor ao server enquanto que o readonly seria apenas para exibicao.
(http://forum.java.sun.com/thread.jspa?threadID=601263&messageID=4096722 e http://forum.java.sun.com/thread.jspa?threadID=706342&tstart=60).
Eu nao gosto desta abordagem porque eu teria que duplicar os sets e cleans dos campos readonly (um para o proprio campo e outro para o hidden).

Outra coisa que descobri eh que caso o campo nao seja readonly e depois o mesmo seja modificado para reaonly via javascript seus valores sao recuperados pelo servidor. Espero que nao descubram esse “bug” pois foi com base nele que solucionei o problema.

Como a solucao sugerida no forum da Sun jah eh Pog resolvi adotar outro mais pratico, criei a funcao javascript abaixo e adicionei ao body de todas as minhas telas o onload=“javascript:setReadonly()”.

function setReadonly() { for (i=0; i<document.forms.length; i++) { for (j=0; j<document.forms[i].elements.length; j++) { // "input-readonly" eh o estilo css utilizados em todos os campos read-only if (document.forms[i].elements[j].className == 'input-readonly') { document.forms[i].elements[j].readOnly = true; } } } }

Abraco,
Marcel.

Criado 30 de março de 2007
Ultima resposta 3 de abr. de 2007
Respostas 3
Participantes 2