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

pegar valores em um select no spring mvc

Ola, boa noite! Estou com um problema aqui, não sei como pegar os valores que passei para um select que fiz no jsp. Já procurei em tudo mais não encontrei algo que possa me ajudar, alguém pode me ajuda ? Sou novo em SPRING MVC!

vou passa as classe com o que fiz, tudo simples o que eu fiz.

package br.com.adnautomacao.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import br.com.adnautomacao.dao.ClienteDao;
import br.com.adnautomacao.dao.ProdutoDao;
import br.com.adnautomacao.modelos.Cliente;

@Controller
@RequestMapping("/produto")
public class ProdutoController {

    @Autowired
    private ProdutoDao produtoDao;

    @Autowired
    private ClienteDao clienteDao;

    @RequestMapping("/incluirProduto")
    public ModelAndView produtoForm(){
        List<Cliente> clientes = clienteDao.listar();
        ModelAndView view = new ModelAndView("produtos/cadastro-produto");
        view.addObject("cliente", clientes);
        return view;        

    }
    //teremina esse select, e busca nova maneira para pegar os valores que são mandados
    @RequestMapping(method=RequestMethod.POST)
    public String grava( Cliente cliente){
        System.out.println(cliente.getNome());
        return "cliente/ok";
    }

}
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<h1>Cadastro de Computadores para Serviço</h1>

<form action="${s:mvcUrl('PC#grava').build()}" method="post">
    <tr>
        <td>Clientes</td>
        <td><form:select path="cliente">
            <form:options items="${cliente}" itemValue="id" itemLabel="nome"/>
            </form:select>
    </tr>
    <button type="submit">Cadastra</button>
</form>
</body>
</html>

me ajudem ai gente, kkkk.

6 respostas

Oi Maycon,

Esse formulário é para cadastrar produtos, certo?

Acho que no seu controller então você deve receber como parâmetro um objeto Produto e não Cliente:

@RequestMapping(method=RequestMethod.POST)
    public String grava( Produto produto){
        System.out.println(produto.getCliente().getNome());
        return "cliente/ok";
    }

Desse jeito o cliente escolhido já vai ser settado no atributo cliente dentro do objeto Produto.

Veja se resolve.

Bons estudos!

Ola Rodrigo Ferreira, então fiz o que me explicou no exemplo acima, sendo que fiz mais não funcionou e ainda deu erro java.lang.NullPointerException .

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<h1>Cadastro de Computadores para Serviço</h1>

<form action="${s:mvcUrl('PC#grava').build()}" method="post">
    <tr>
        <td>Clientes</td>
        <td><form:select path="cliente">
            <form:options items="${cliente}" itemValue="id" itemLabel="nome"/>
        </form:select>

            </td>
    </tr>
    <br />
    <div>
        <label>Nome:</label>
        <input type="text" name="nome" />
    </div><br />

    <div>
        <label>Codigo:</label>
        <input type="text" name="codigo" value="${aleatorios}" />
    </div><br />

    <div>
        <label>Data de Entrada:</label>
        <input type="text" name="dataEntrada" />
    </div><br />

    <div>
        <label>Data de Saida:</label>
        <input type="text" name="dataSaida" />
    </div><br />

    <div>
        <label>Técnico:</label>
        <input type="text" name="tecnico" />
    </div><br />

    <div>
        <label>Ocorrência:</label>
        <textarea rows="5" cols="100"></textarea>
    </div><br />

    <div>
        <input type="radio" name="finalizado" value="true"> Finalizado
        <input type="radio" name="finalizado" value="false">Não Finalizado

    </div>


    <div>
        <label>Manutenção:</label>
        <input type="text" name="manutencao" />
    </div><br />


    <button type="submit">Cadastra</button>
</form>
</body>
</html>
package br.com.adnautomacao.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import br.com.adnautomacao.dao.ClienteDao;
import br.com.adnautomacao.dao.ProdutoDao;
import br.com.adnautomacao.modelos.Cliente;
import br.com.adnautomacao.modelos.NumeroAleatorios;
import br.com.adnautomacao.modelos.Produto;

@Controller
@RequestMapping("/produto")
public class ProdutoController {

    @Autowired
    private ProdutoDao produtoDao;

    @Autowired
    private ClienteDao clienteDao;

    @RequestMapping("/incluirProduto")
    public ModelAndView produtoForm(){
        int gerador;
        List<Cliente> clientes = clienteDao.listar();
        NumeroAleatorios aleatorios = new NumeroAleatorios();
        gerador = aleatorios.geraNumeroDeCodigo();
        ModelAndView view = new ModelAndView("produtos/cadastro-produto");
        view.addObject("aleatorios", gerador);
        view.addObject("cliente", clientes);
        return view;        

    }
    //teremina esse select, e busca nova maneira para pegar os valores que são mandados
    @RequestMapping(method=RequestMethod.POST)
    public String grava( Produto produto){
        System.out.println(produto.getCliente().getId());
        return "cliente/ok";
    }

}

Oi Maycon,

Na verdade falei errado, quando o usuário seleciona um cliente na combo-box e submete o formulário, o Spring envia apenas o atributo id do cliente selecionado, e não o objeto cliente inteiro.

Com isso, você precisará alterar o seu código para:

<form:select path="cliente.id">
    <form:options items="${cliente}" itemValue="id" itemLabel="nome"/>
</form:select>

E no controller deve imprimir agora o id do cliente escolhido:

@RequestMapping(method=RequestMethod.POST)
public String grava( Produto produto) {
    System.out.println(produto.getCliente().getId());
    return "cliente/ok";
}

Caso você precise dos outros dados do cliente, vai precisar fazer uma consulta ao BD:

@RequestMapping(method=RequestMethod.POST)
public String grava( Produto produto) {
    Cliente escolhido = clienteDao.buscarPorId(produto.getCliente().getId());
    System.out.println(escolhido.getId());
    System.out.println(escolhido.getNome());
    //...
    return "cliente/ok";
}

Veja se assim resolve.

Bom dia Rodrigo Ferreira, então fiz como vc me explicou no tópico acima, sendo que da erro . Vou colocar o erro para vc ver.

Hibernate: select cliente0_.id as id1_0_, cliente0_.cnpj as cnpj2_0_, cliente0_.cpf as cpf3_0_, cliente0_.nome as nome4_0_, cliente0_.nomeFantasia as nomeFant5_0_, cliente0_.quantidade as quantida6_0_, cliente0_.razaoSocial as razaoSoc7_0_, cliente0_.telefone1 as telefone8_0_, cliente0_.telefone2 as telefone9_0_, cliente0_.tipoSistema as tipoSis10_0_ from Cliente cliente0_
abr 05, 2018 8:55:35 AM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/adnautomacao] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
    at br.com.adnautomacao.controllers.ProdutoController.grava(ProdutoController.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1132)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
solução!

Oi Maycon,

Bom, eu não manjo muito dessas taglibs do Spring, então o jeito que sei que funciona seria assim:

<select name="cliente.id">
    <c:forEach items="${cliente}" var="c">
        <option value="${c.id}">${c.nome}</option>
    </c:forEach>
</select>

Lembrando que tem que importar a taglib c:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

Desse jeito o Spring vai conseguir enviar o id do cliente escolhido na combo para o controller.

Veja se assim resolve.

Boa Tarde Rodrigo Ferreira, Muito obrigado por me ajuda, funcionou!!