Renderizacao generica de campos na tela com Struts

8 respostas
H

Ola, esse eh meu primeiro post aqui. Seguinte, tenho uma necessidade de ter uma (na verdade varias) tela jsp em que os campos que devem aparecer na mesma sao dependentes do tipo de registro sendo manipulado (visualizado, editado, incluido). Ou seja, de uma forma geral, imagine que eu tenho um banco de dados com diversas tabelas que nao sei sobre a estrutura delas em meus pojos e eu preciso renderizar os campos das mesmas na tela para que o usuário possa manipular seus valores. Como poderia conseguir isso? Qualquer orientacao me serve para que eu abstraia melhor a solucao. Espero que algum de voces ja tenha passado por alguma situacao dessas e possa estar contribuindo com alguma solução.
Obrigado
Helio

8 Respostas

H

Puxa… Ou isso é muito trivial e eu to perguntando besteira, ou isso realmente deve consumir um pouco de neuronio e deve ficar dificil de me ajudar somente com alguma explicação. Peço ajuda aos bons que consultam esse forum, fico muito grato com a compreensao e ajuda que me for dada.

marcelo_mococa

vc conhece os objetos de negócio?
Intaum crie um ActionForm para representar estes objetos de negócio e Actions para receber as requisições.

DICA: estude o struts primeiro. este CRUD é simples de fazer. Procure pesquisar antes de postar dúvidas.

t+

H

Obrigado pela consideracao em postar alguma dica Marcelo.
Os objetos de negocio sao como eu disse, podem variar e eu tenho que mostra-los independente da estrutura de atributos deles.
Bom, se alguem tiver mais alguma dica ok.

marcelo_mococa

os objetos de negócio podem variar? tem certeza?

marcelo_mococa

uma idéia:

crie uma taglib que receba este objeto que pode ser qualquer coisa e com reflection vc cria a tela dentro da taglib.

é só uma idéia…
veja se você precisa mesmo disso, vai dar muito trabalho…rs

H

Os objetos variam da seguinte forma:
Eu tenho um repositorio de conteudo, onde neste repositorio a estrutura dos metadados pode ser diferente de documento para documento, entao minimamente eu posso ter duas estruturas para documentos:
Estrutura A: NomeDocumento
Estrutura B: AutorDocumento
Entao, quando eu for visualizar/manipular o documento salvo com a estrutura A eu tenho que mostrar o metadado NomeDocumento, e quando for visualizar/manipular o documento salvo com a estrutura B eu tenho que mostrar o metadado AutorDocumento.
Isso foi somente um simples exemplo para tentar te passar a ideia da minha necessidade.
Hoje o repositorio de conteudo tem essas duas estruturas, mas amanha outras estruturas podem ser acrescidas e outros documentos podem ser inseridos neste repositorio com estas outras estruturas e eu preciso que meu sistema mostre/manipule qualquer documento com qualquer estrutura.
Bem, eu criei um modelo de dados com a finalidade de ter as diferentes estruturas existentes, entao eu tenho para cada estrutura seus varios metadados (propriedades) e com suas caracteristicas (tipo de campo, obrigatorio, somenteleitura, etc), com isso quando eu tiver que mostrar um documento eu tenho que pegar o tipo de estrutura dele e com esse tipo de estrutura eu vou populando um map com os metadados daquela estrutura contidos no documento.
A minha duvida entao, para finalizar, seria como conseguir fazer com que esse meu map ja carregado com metadado/valor possa ser renderizado na tela tanto para leitura quanto para inclusao/edicao de um documento.
Seria isso Marcelo, o reflection vai me ajudar se eu tenho as classes predefinidas, vou usar ele em alguns casos no sistema. Achei que nao seria muito trivial mesmo. Obrigado pela sua dica, e se com essa minha breve explicacao vc conseguiu abstrair melhor e tiver outra dica eu to aceitando, valeu.

marcelo_mococa

um…

deixa ver se entendi…
você monta a estrutura da tua página em um map?
daí você precisa ler este map na tua jsp para montar a página?

se for isso, coloque o map na requisição ou sessão e faça assim para ler os dados:

${meuMap["minha_chave"]}

caso queira iterar sobre o map?

<c:forEach var='item' items='${map}'>
   Chave=${item.key} -  Valor=${item.value}
</c:forEach>

é isso mesmo?

H

Ok, para exemplificar vejamos uma ficha ja existente de um conteudo com seus valores:
tipoficha: categoria
nome: documentacao de sistema
criacao: 10/10/2006

Eu tenho um cadastro para o tipo de ficha da ficha acima, que é o seguinte:
Tabela TipoFIcha
nome: categoria
Tabela PropriedadesTipoFicha
propriedade: nome
tipocampo: string
propriedade: criacao
tipocampo: date

Quando eu carregar um objeto com a ficha de uma categoria eu vou ter em um map as suas propriedades, entao no map eu teria:
nome - ‘documentacao de sistema’
criacao - ‘10/10/2006’

Agora eu preciso mostrar esse objeto na tela, entao eu ja tenho o tipoficha=categoria e tenho que carregar a estrutura desse tipoficha pelas tabelas citadas. Com o objeto contendo os atributos da ficha e com a estrutura de propriedades desse tipoficha carregadas eu preciso mostrar os valores da ficha com os tipos de campo corretos.
Com isso eu varro as propriedades encontradas no cadastro da estrutura com as chaves do map e carrego o valor de cada chave, entao para mostrar a propriedade nome eu tenho que montar um label ‘nome’ e na frente do mesmo colocar um textarea com o valor ‘documentacao de sistema’, e para a propriedade criacao eu coloco um label ‘criacao’ e na frente coloco um textarea com mascara de data com o valor ‘10/10/2006’.
Isso foi para mostrar uma ficha do tipo categoria, se fosse para mostrar uma ficha de um outro tipo eu teria que fazer o mesmo soh que as propriedades seriam outras de acordo com o cadastro da estrutura de propriedades do tipo da ficha. Assim como se fosse para incluir uma ficha de um determinado tipo eu teria que montar a tela com as propriedades existentes no cadastro da estrutura do tipo da ficha, com os tipos de campos corretos.

Espero que isso tenha explicado melhor, e muito obrigado pela força Marcelo.

Criado 16 de outubro de 2006
Ultima resposta 18 de out. de 2006
Respostas 8
Participantes 2