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

Preencher campo Text conforme seleção da ComboBox

Olá pessoal.

Estou com a seguinte duvida de como fazer isso.

Preenchi a ComboBox desta forma:

              <select name = "teste.id" class="form-control">
                    <c:forEach items="${teste}" var="teste" varStatus="status">
                        <div>
                            <option value="${teste.id}">${teste.descricao}</option>
                        </div>
                    </c:forEach>    
              </select>

Eu quero preencher este campo Text conforme a seleção da ComboBox.

              <label>Descrição</label>
              <input type="text"  name="teste1.descricao" class="form-control">

A tabela Teste e Teste1 são relacionadas através da anotação @ManyToOne, estou utilizando as mesmas ferramentas deste curso. Spring MVC, JSTL, JSP e Hibernate.

Se alguém puder me ajudar agradeço

7 respostas

Olá Marcos, tudo bem? Você poderia explicar melhor, como todos os nomes estão teste e a anotação @ManyToOne não entendi muito bem como é sua estrutura, poderia explicar como estão mapeados os objetos e ou utilizar nomes diferentes para que eu possa entender e tentar ti ajudar de alguma forma!

Fico aguardando retorno!

Bom dia, Jonilson. Grato pela Atenção.

Segue abaixo o código.

Model Produto.

@Entity
public class Produto {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne
    private TipoCategoria categoria;

    private String descricao;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public TipoCategoria getTipoCategoria() {
        return categoria;
    }

    public void setTipoCategoria(TipoCategoria categoria) {
        this.categoria = categoria;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
}

Model TipoCategoria

@Entity
public class TipoCategoria {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String descricao;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
}

Controller

    @RequestMapping("/formVenda")
    public ModelAndView form() {
        List<Produto> produto = produtoDao.listar();

        ModelAndView modelAndView = new ModelAndView("venda/formVenda");
        modelAndView.addObject("produto", produto);

        return modelAndView;
    }

Código do método listar.

@Repository
@Transactional
public class ProdutoDAO {

    @PersistenceContext
    private EntityManager manager;

    public List<Produto> listar() {
        // TODO Auto-generated method stub
        return manager.createQuery("Select p From Produto p"
                                    + " join fetch p.tipoCategoria tipoCategoria", Produto.class).getResultList();
    }
}

O meu JSP

    <body>
        <form:form action="${s:mvcUrl('VC#gravar').build() }" method="post" commandName="venda">

             <div class="form-group col-md-4">
              <label>Produto</label>
              <select name = "produto.id" class="form-control">
                    <c:forEach items="${produto}" var="produto">
                        <div>
                            <option value="${produto.id}">${produto.descricao}</option>
                        </div>
                    </c:forEach>    
              </select>
            </div>                    

            <div class="form-group col-md-4">
              <label>Tipo Categoria</label>
              <input type="text"  name="produto.tipoCategoria.descricao" class="form-control" readonly="readonly">
            </div>

             <div class="form-group col-md-2">
                <button type="submit" class="btn btn-primary">Cadastrar</button>
            </div>
        </form:form>
    </body>

Qual seria minha duvida. Quando eu selecionar a combobox de produto, preencher automaticamente o campo TipoCategoria.

Veja se ficou mais claro a minha dúvida, se não estiver me fala que eu mudo a postagem.

Sim entendi certinho, bem a questão é o campo TipoCategoria precisa estar dentro do forEach e dessa forma você vai conseguir pegar o tipo da categoria, tenta dessa forma e fala se deu certo!

Não entendi. Eu crio o campo TipoCategoria em um outro option ? Como eu devo fazer, teria como criar um exemplo ?

solução!

Marcus,

Esse jsp foi renderizando virou html e está no cliente.

2 opções, tem outra mas acho que essas são as mais simples:

1 Então para voce fazer essa relação sem ir ao servidor voce tem que fazer uma chamada ajax para o seu servidor, usando javascript (JQuery) no onchange do seu combo.

OU

2 Enviar o formulario no onchage do seu combo ou submeter sem prencher a categoria e então colocar alem da lista de produtos o produto selecionado no seu request.

Peço desculpas Marcos, eu fui quem me confundi, é que na verdade o seu forEach já é dentro do select e por isso é inviável, porque veja bem apenas o objeto produto que está dentro do loop é que conhece e consegue trazer o TipoCategoria, então por isso as duas abordagens apresentadas pelo Mario fazem mais sentido, porque quando acontecer a mudança no select (no caso onchange) você vai enviar outra requisição para o seu backend passando o Id do produto para que o backend retorne apenas o TipoCategoria referente ao produto você enviou o Id.

A abordagem que o Mario informou eu havia feito, mas eu pensei que desse para fazer de alguma outra forma devido ao Spring e JSTL. Senão tem blz. tranquilo

Obrigado a todos