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

Como sincronizar um campo input e um campo input no JSP

Boa tarde pessoal!

Estou desenvolvendo um projeto, e quando o usuário selecionar uma opção no "select" => descricaoTipoProduto, eu preciso preencher automaticamente o tipoProduto, que refere-se ao código.

Na classe modelo "Produto" eu tenho os dois campos "descricaoTipoProduto" e "tipoProduto".

E possuo os campos na 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>

OBSERVAÇÃO : Me pediram para evitar ao MÁXIMO o uso de JAVA SCRIPT no projeto.

Obrigado!

8 respostas

Bom, no seu servidor, vc consegue buscar o tipo do produto em função da descrição escolhida? Caso consiga, esse pode ser um caminho, ex:

public void metodoQueSalva(TipoDoObjeto objeto){
   TipoProduto tipo = produtoDao.buscaPorDescricao(objeto.getDescricaoTipoProduto());
  objeto.setTipoProduto(tipo);
  //resto do código
}

Um outro jeito é vc deixar no value do select o tipo e não a descrição.. aí vc busca o tipo no método do controller e já vai ter a descrição.

Caso nenhuma das soluções forem suficientes para você, tem que colocar um evento no javascript para atualizar um hidden em função da escolha do select.

Alberto, no meu ProdutoDao, eu criei o método buscaTPPorDescricao:

    public TipoProduto buscaTPPorDescricao(String descricaoTipoProduto) {
        try {
            TypedQuery<TipoProduto> query = manager.createQuery(
                    "Select tp.tipoProduto from TipoProduto tp Where tp.descricaoTipoProduto = :descricaoTipoProduto",
                    TipoProduto.class);
            query.setParameter("descricaoTipoProduto", descricaoTipoProduto);
            return query.getSingleResult();
        } catch (Exception e) {
            return null;
        }
    }

E também no meu ProdutoDao, eu tenho o método salva:

    public void salva(Produto produto) {
        manager.getTransaction().begin();
        if (produto.getId() == null) {
        //COMO FAZER O SET...
        //produto.setTipoProduto( XXX )
            manager.persist(produto);
        } else {
            manager.merge(produto);
        }
        manager.getTransaction().commit();
        manager.close();
    }

Eu tentei fazer direto:

produto.setTipoProduto(this.buscaTPPorDescricao(produto.getDescricaoTipoProduto()));

**Porém o método de busca, retorna um OBJETO TipoProduto... E o setTipoProduto espera um Integer...

Como eu resolvo ??

Obrigado!!

O integer eh a chave estrangeira? Se for, eh só pegar o tipoProduto.getId(). Num futuro, o melhor eh o produto ter um atributo do tipo TipoProduto.

id é chave na tabela TipoProduto... Mas eu não tenho essa informação no ProdutoDao, momento que eu chamo o método salva... Eu dei um System.println nela e está como null... A única informação que eu vou ter é a descricaoTipoProduto, por isso criei o buscaTPPorDescricao no dao...

Eh... Alguém precisa ter o id do TipoProduto. O método do dao que busca por ele , deve retornar um TipoProduto completo, com seu id. Não tem outro jeito...

Eu consegui o objeto TipoProduto pelo método buscaTPPorDescricao do Dao... Eu não consigo extrair o Id dele pra settar ?

Se dentro dele tiver um atributo id, vc pode criar um getId e passar o valor retornado para o setTipoProduto.

solução!

Resolvido !!!

Criei o método busca no Dao:

    public TipoProduto buscaTPPordescricaoTP(String descricaoTipoProduto) {
        try {
            TypedQuery<TipoProduto> query = manager.createQuery(
                    "Select tp from TipoProduto tp where tp.descricaoTipoProduto = :descricaoTipoProduto",
                    TipoProduto.class);
            query.setParameter("descricaoTipoProduto", descricaoTipoProduto);
            return query.getSingleResult();
        } catch (Exception e) {
            return null;
        }
    }

E alterei o salva no Controller para:

    @IncludeParameters
    public void salva(@Valid Produto produto, TipoProduto tipoProduto) {
        validator.onErrorRedirectTo(this).form();
        tipoProduto = produtoDao.buscaTPPordescricaoTP(produto.getDescricaoTipoProduto());
        produto.setTipoProduto(tipoProduto.getTipoProduto());
        produtoDao.salva(produto);
        result.redirectTo(this).lista();
    }