9
respostas

Pegando objeto de radiobutton JSP

Meu formulário de cadastro de cartão de crédito tem uma lista de bandeiras para escolher:

<c:forEach var="bandeira" items="${bandeiras}">
    <form:radiobutton path="bandeira" />${bandeira.nome}
</c:forEach>

se eu troco o atriuto de path, o console me dá o erro que não existe o atributo escrito, por exemplo bandeira1 não existe em cartãoDeCredito.

Eu deixei no método gravar System.out.println(cartaoDeCredito.getBandeira());, e quando eu clico em salvar aparece no console null.

Tem como eu pegar o objeto bandeira e colocar em cartãoDeCrédito?

9 respostas

Opa, o path precisa ser uma propriedade do objeto relacionado no seu commandName. Se não tem get e set de bandeira1, realmente não vai rolar.. Uma solução,muito usada, é você criar uma classe intermediária, relacionada exclusivamente ao form, receber os dados e aí montar o objeto final.

Você diz receber todos as variáveis e no método gravar eu montar o objeto?

Oi Rodrigo, não. Pensei em você criar uma nova classe, YYYForm, que tem os atributos compatíveis com o formulário.. recebe um objeto dela como argumento e aí sim, monta o seu objeto final em função dessa classe.

Mas no caso o objeto CartaoDeCredito tem todos atributos que estão no form. Seria outro tipo de atributos?

Mas depois de muito bater a cabeça eu consegui contornar o problema.

Eu fiz o seguinte:

<c:forEach var="theBandeira" items="${bandeiras}">
        <form:radiobutton path="bandeira.id" value="${theBandeira.id}"/>
            <img src="<c:url value='../${theBandeira.sumarioPath}'/>"alt="${theBandeira.nome}"  />
            <p><c:out  value="${theBandeira.nome}"/>  </p>
    </c:forEach>

O controller não consegue atribuir o objeto inteiro bandeira para o cartaoDeCredito.setBandeira() , mas eu consigo passar o ID, cartaoDeCredito.setBandeira().setID(), e desse ponto em diante eu consigo popular o objeto.

Pessoal,

Estou com uma dúvida semelhante ao do Rodrigo.

Em uma determinada JSP que tenho, responsável pelo cadastro de produtos (um formulário), eu tenho os campos relativo as informações do produto (Nome e Preço) e outro que é a Marca, que também faz parte da minha classe Produto.

<form action="/ProjetoLoja/cadastrarProduto" method="post">
        <div>
            <label>Nome do Produto:</label> <input type="text"
                name="nome" />
        </div>
        <div>
            <label>Preço:</label> <input type="text" name="preco" />
        </div>
        <div>
            <label>Marca do Produto:</label>
            <select>
                <c:forEach var="marca" items="${marcas}">
                    <option value="${marca}" label="${marca.descricao}"/>
                </c:forEach>
            </select>
        </div>
        <button type="submit">Cadastrar</button>
    </form>
    <br>

Estou utilizando Spring MVC.

Nessa JSP, tenho uma lista de Marcas que trouxe do banco em um combobox.

Eu gostaria de saber como fazer para, ao submeter esse formulário, enviar os dados do Produto e a Marca, que faz parte do Produto, de forma que o Spring possa fazer o binding, pois do jeito que eu fiz, dentro do objeto Produto que o Spring fez o binding, o objeto Marca fica null.

    @RequestMapping("/cadastrarProduto")
    public String gravar(Produto produto) {
        System.out.println("Atendendo requisição da chamada '/cadastrarProduto'");
        System.out.println("Retornando a view 'sucesso' para o container...");

        System.out.println(produto.getNome());
        System.out.println(produto.getMarca().getDescricao());

        return "sucesso";
    }

Bruno você tentou fazer do jeito que eu disse? Colocando no seu exemplo <option value="${marca.id}" label="${marca.descricao}"/>

e no metodo gravar você busca no banco com o id ou então busca na "marcas" que populou o foreach do jsp

Rodrigo,

Fiz a alteração conforme você sugeriu.

Tanto deixando o método como salvar(Produto produto) quanto deixando salvar(Produto produto, Integer id), o Spring parece continuar não conseguindo fazer o binding, pois o valor de Marca no primeiro caso vem null e o valor de id no segundo caso também vem null.

Seguindo a logica da solução que eu encontrei, o gravar( ou salvar, não sei como você nomeou) continua o mesmo. public String gravar(Produto produto), o que muda é o option <option value="${marca.id}" label="${marca.descricao}"/>.

No método gravar você vai ter o Id da marca no produto. produto.getMarca().getId();

Você pode usar a tag form do spring: <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> e testar se funciona. Pode ser algum erro ou input que está faltando, mas eu estou apenas chutando não testei para saber se faz diferença. Na pagina que eu escrevi utilizei essa tag.

Se não funcionar, cria um topico novo com todo o código envolvido para ver se algum moderador ou instrutor te ajuda.

Rodrigo,

Fiz um teste utilizando essa tag que você mencionou, mas ainda continuo com o problema.

Vou pesquisar um pouco mais e qualquer coisa faço como você sugeriu, de abrir um novo tópico com mais detalhes sobre a questão.

Muito obrigado pela ajuda cara!