Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida para preencher dois atributos no Select

Boa tarde pessoal!

Eu ví no curso como preencher uma lista de valores dos livros com Enum... Até ai blz...

Estou desenvolvendo um projeto e quero preencher a DESCRICAO e o CODIGO do TipoProduto...

Eu listo no meu formulario.jsp as descrições dos tipos de produto...

Minha classe modelo Produto (PRINCIPAL), tenho os dois campos:

    @Column(name = "descricao_tipo_produto", length = 30)
    private String descricaoTipoProduto;

    @Column(name = "tipo_produto")
    private Integer tipoProduto;

Minha classe TipoProduto, os dois campos:

    @Column(name = "tipo_produto")
    private Integer tipoProduto;

    @Column(name = "descricao_tipo_produto", length = 30)
    private String descricaoTipoProduto;

O método no meu ProdutoController:

    @RequestMapping("/vaz")
    public ModelAndView vaz() {
        List<TipoProduto> tiposProduto = produtoDao.listaTipoProduto();
        List<Montadora> montadoras = produtoDao.listaMontadora();
        List<SulfixoOpcional> sulfixosOpcionais = produtoDao.listaSulfixoOpcional();
        ModelAndView modelAndView = new ModelAndView("produto/vaz");
        modelAndView.addObject("tiposProduto", tiposProduto);
        modelAndView.addObject("montadoras", montadoras);
        modelAndView.addObject("sulfixosOpcionais", sulfixosOpcionais);
        return modelAndView;
    }

E no meu formulario.jsp:

           <label>Descrição tipo produto:</label>
        <select name="produto.descricaoTipoProduto" id="descricaoTipoProduto">
            <c:forEach items="${tiposProduto}" var="tipoProduto" varStatus="status">
                <option value="${produto.descricaoTipoProduto}" ${produto.descricaoTipoProduto eq tipoProduto.descricaoTipoProduto ? "Selected" : ""}> ${tipoProduto.descricaoTipoProduto}</option>
            </c:forEach>
        </select>

Aonde eu devo adicionar o código:

<input type="text" name="produto.tipoProduto" size="3" maxlength="3"  disabled/><br /><br />

Como eu devo alterar essa linha acima, para sincronizar o código com a descrição que eu escolhi no select...

Obrigado!!

6 respostas

Olá Ewerton,

neste caso note que as informações que estão em TipoProduto são exatamente iguais as informações em Produto, no caso:

@Column(name = "descricao_tipo_produto", length = 30)
private String descricaoTipoProduto;

@Column(name = "tipo_produto")
private Integer tipoProduto;

Então o que você pode fazer é ao invés de repetir os mesmos valores em duas classes e ter este baita trabalho de tentar relacioná-los na sua jsp, o que você pode fazer é na classe Produto criar um atributo cujo tipo é a classe TipoProduto, ou seja, criar um relacionamento (provavelmente one to many) entre as duas classes. Que ai dentro deste atributo obtêm as duas informações de descrição e tipo.

E no caso da tela, você envia pelo select apenas o id do TipoProduto que foi escolhido para o seu Produto. Na hora persistir as informações o Hibernate já vai salvar o relacionamento entre os dois.

Bom dia Lucas!

Eu pensei em algo parecido com o que vc me orientou...

Mas o problema é que eu preciso ter essas duas informações (TipoProduto e DescricaoTipoProduto) na tabela Produto, porque eu tenho por exemplo:

ID        TipoProduto        DescricaoTipoProduto
1          005               Garrafa térmica
2          005               Garrafa térmica inóx
3          005               Garrafa térmica elétrica
4          006               Jogo de talheres
5          006               Jogo de talheres Tramontina

Etc...

Eu trabalho em cima de um BD em produção, acessado por outro sistema.. Esse BD não possui NORMALIZAÇÃO, e o relacionamento entre as tabelas não é BOM, isso é qdo existe... Então não posso mexer na estrutura do BD, pra não correr o risco do sistema atual parar...

Se você tiver acesso a informação da estrutura desse banco, até pode usar algumas anotações do Hibernate que ajudam ele a mapear o relacionamento nas suas classes de acordo com o que tem neste BD, mesmo que o relacionamento esteja um pouco bizarro. Que ai você conseguiria se aproveitar das vantagens da orientação a objetos no seu códgio sem que o banco interfira nisso. Vou deixar dois links aqui se você quiser estudar mais a fundo, um é do mkyong com exemplos de mapeamentos one to many e este link é a documentação do Hibernate.

Se você não puder fazer isso de jeito nenhum mesmo, vai dar um trabalho de front e um pouco de gambiarra para fazer essa associação entre os campos da descrição e do tipo. O que você pode fazer é deixar 1 input text parecido com o que você fez lá em cima, só que ao invés de disabled coloca readonly porque se não a informção não é enviada pelo formulário. Para cada descricaoTipoProduto que tem no seu select você precisa guardar qual o tipoProduto associado e fazer um código javascript que preenche o valor do seu input readonly com esse tipoProduto de acordo com a option que o usuário escolheu. Você pode usar a estrutura do dataset para fazer isso.

Não tem como eu fazer isso direto pelo .jsp ?

Só com tags não tem como ligar dois campos de entrada de informação diferentes, de forma que quando você escolhe um valor o outro é preenchido automaticamente. Você precisará de um pouco de javascript para fazer isso.

solução!

XXXXXXXXXXXXXXXXXXXXXXX