CheckBox no Struts com iterate

Bom, o título resume bem o cenário.
Tecnologia anciã (velha e ultrapassada, não sábia).

Seguinte, tenho no meu ActionForm a porcaria de uma coleção de objetos (objetos, não Object e nem Strings, ok?).
No JSP é feita uma iteração nessa porcaria de coleção e exibidos esses valores, juntamente com um CheckBox (cada objeto meu tem um atributo booleano indicando se foi selecionado).

Enfim, já tentei de tudo, até magia negra, mas a m* da b* do struts não faz submit no valor dos checkbox nem a pau.

Fiz centenas de milhares de tentativas, tentei gambiarras inimagináveis (momentos de desespero, sabe como é).

Notei que o CheckBox simplesmente por conter o atributo Checked ele já se mantem checado, independente do que ele contenha.
E quando está checado geralmente o valor compreendido é “on”.

De qualquer modo, tentei mesclas de tudo quanto é coisa.
Mudei o atributo booleano para string, não funciona.

O mais próximo que cheguei foi isso aqui:

http://www.coderanch.com/t/57314/Struts/Struts-html-checkbox
(vejam último post).

Mas ainda assim, se eu iterar pelo array de strings como vou preencher o resto da tabela?

Nossa, tinha uns 3 anos que não mexia com struts (e não trabalhei com ele muito antes tbm).

Alguém sabe pra que santo tenho que fazer promessa pra porcaria do struts funcionar checkboxes com iterate?

Obrigado =)

O escopo do form é request ou session?

Eu pergunto pq eu lembro que quando o escopo é session, vc tem que “limpar” o array com os objetos selecionados, pq quando o checkbox não está selecionado ele não é enviado na requisição, mas isso só faz diferença se for no escopo de sessão, já que no de request o objeto vai ser reconstruído e não terá “lixo” dentro dele.

É Request.
Sem chance de muda-lo pra Session.

Mais uma observação: o struts não ta considerando submit de nenhum atributo dos objetos da coleção, a forma como eles foram setados pra popular o iterate é exatamente a forma como os estou obtendo de novo.
Explicando: substitui o checkbox por um html:text e alterei seu conteudo (que apontava para um atributo do tipo String no objeto da coleção).
Ao efetuar o submit esse atributo estava com o valor original de quando foi montada a tela, desconsiderando a alteração em tela.

De boa, esse treco ta de sacanagem.

Bom, então pode ser esse o problema, pois quando faz o submit os objetos da lista não estão mais lá… Vc tem que criá-los quando faz o submit de novo e utilizar propriedades indexadas. Por exemplo, se a lista tinha tamanho 5 quando entrou na página pela primeira vez e vc selecionar o segundo item o struts vai tentar setar a propriedade bean[2].setPropriedade, só que se a lista tiver tamanho 0 então o objeto com o índice 2 não existe.

Dá uma olhada aqui:

http://www.coderanch.com/how-to/java/IndexedProperties

ou aqui

Acho que vai ajudar a resolver o seu problema.

Até mais!

Mas a lista não volta vazia.
Ela volta completamente populada, com todos os objetos populados.

Mas com os valores antigos! Como se não houvesse alterações na view.
Compreende?

Entendi… Mas como os objetos já estão populados se o escopo é de request? Vc guarda eles em algum campo hidden? Você cria novamente eles?

Então, não cara, não guardo.
Até tinha um campo hidden pra guardar o id, mas removi pra fazer um teste.

Ta muito bizarro isso, já está fugindo da compreensão humana.

Bom, aí acho que o Sérgio Mallandro está fazendo uma pegadinha do Mallandro… Não sei também o que pode ser… Se os dados estão populados eles ou são criados, vem na requisição ou já estavam na sessão… Só sei que já fiz várias telas utilizando o esquema que passei no link com o form no escopo de request e funcionava…
Bom, tenho que sair… espero que encontre a solução
Até mais!

Bom, vlw pela força cara.
Vou dar uma estudada nesses links que você me passou.

Mas agora vou me focar em outro ponto, to nisso a tanto tempo que já estou esgotado com essa porcaria rsrs.
Fora que a visão já está completamente viciada…

Anyway, baita trabalho de corno esse struts eim?
Achava o JSF um pouco trabalhoso, mas o que o struts faz não é brincadeira!
Ao menos com JSF eu passava tranquilamente por essa tarefa, infelizmente esse projeto tem que ser nisso =/.

Abraços.

cara tive um problema parecido agora pouco com JSF … talvez ajude.

Então pessoALL, olha só.

Fiz mais alguns testes e nada ainda.
Mais um quinzilhão de pesquisas e cheguei num ponto que até faz sentido, mas não funciona.

Vou descrever o que há.
Bom, no meu ActionForm tenho uma List de objectos e um array de strings pra indicar quais estão selecionados, de acordo com dicas que encontrei por toda a internet (exageros a parte).

Dentro do iterate tenho a seguinte estrutura:

<logic:iterate property="minhaList" id="elemento" name="meuForm">
...
        <html:multibox name="meuForm" property="meuArrayString">
		<bean:write name="elemento" property="id"/>
	</html:multibox>
...
</logic:iterate>

Bom, se eu preencher alguns valores no array de Strings “meuArrayString” os respectivos CheckBoxes aparecem selecionados.

Porém, se eu fizer o submit nessa página, esse “meuArrayString” não é populado com os checkBoxes selecionados, conforme indicam as referências da internet e aqui mesmo no guj.

Fiz mais uma experiência forçando o form a ser de escopo request, configurando no struts-config.xml (onde se configura a Action). Feito isso o formulário inteiro não está sendo preenchido, o que me leva a crer que por algum motivo desconhecido o padrão adotado é de session.

Ao menos esse teste nos indica que não somente os CheckBoxes estão sendo “submetidos”, mas todos os atributos.

Alguma pista?

Obrigado!!

FUNCIONOOOU!

Só não me perguntem o que fiz. Gostaria muito de saber.