Problema com a inserção de um valor listado em um componente HTML (select) com jsp

2 respostas
M

Bom dia galera. tenho uma página jsp onde possuo um formuário que para a inserção de dados na tabela pessoa (idPessoa, nome, email, fone, idDepto) esta tabela esta relacionada com a tabela departamento por (idDepto). Na miinha página jsp estou usando um componente que está listando todos os departamentos já cadastrados e pretendo inserir um novo usuário e vinvulá-lo a um desses departamentos, porém no momento da execução ocorre o seguinte erro:

org.apache.jasper.JasperException: An exception occurred processing JSP page /index.jsp at line 49

46:           String nome =request.getParameter("nome");
47:           String fone = request.getParameter("fone");
48:           String email =request.getParameter("email");
49:           int cod = Integer.valueOf(request.getParameter("Departamentos"));
50:           
51:           
52:           

java.lang.NumberFormatException: null
	java.lang.Integer.parseInt(Integer.java:417)

Pelo que eu estou entendendo ele não está conseguindo pegar o valor, ou seja, o idDepto do departamento para inseri-lo no banco. Como poderia resolver este problema usando somente jsp. Segue abaixo o código que fiz até o momento:

<h1>Teste de conexão com o banco de dados</h1>
      
              // campos para a inserção na tabela pessoa
                  
                  Nome:<input type ="text" name ="nome" size ="30" >
                  Fone:<input type ="text" name ="fone" size ="12">
                  email:<input type ="text" name ="email" size ="30">
                       
                // departamentos listados para vincular um novo usuárioa um departamento
                                               
                  Departamento:<select name ="Departamentos" SIZE ="1" >
                   <% String dep;
           int idDepto;
          Class.forName("com.mysql.jdbc.Driver");
          Connection con = DriverManager.getConnection("jdbc:mysql://192.168.1.62/curso","ifpa","ifpa");
          Statement stmt = con.createStatement();
          ResultSet rs = stmt.executeQuery("select idDepto,depto from departamento");
          while(rs.next()){
              idDepto =rs.getInt("idDepto");
              dep = rs.getString("depto");    
          %>
          
                    <option value ="<%=idDepto %>" ><%=dep %> </option>
          
       
        <% }
          rs.close();
          stmt.close();
          con.close();
         %> 
         </select> 
         
         <%
         
        // código para inserção do novo usuario na tabela pessoa relacioanada com a tabela departamento          

          String nome =request.getParameter("nome");
          String fone = request.getParameter("fone");
          String email =request.getParameter("email");
          int cod = Integer.valueOf(request.getParameter("Departamentos"));
          
          
          
          Class.forName("com.mysql.jdbc.Driver");
          Connection conexao = DriverManager.getConnection("jdbc:mysql://192.168.1.62/curso","ifpa","ifpa");
          String sql ="insert into pessoa(nome,fone,email,idDepto) values (?,?,?,?)";
          
          
          
          PreparedStatement st = conexao.prepareStatement(sql);
          
          
          st.setString(1,nome);
          st.setString(2,fone);
          st.setString(3,email);
          st.setInt(4,cod);
          st.executeUpdate();
          st.close();
          
          
          conexao.close();
          
          
          
         
         
         
         %>

Vejam qual o erro que estou cometendo.

2 Respostas

Alys

Boa tarde,

Bem, pra referência futura: não recomendo em hipótese alguma deixar códigos de conexão com o banco em um JSP. Além de violar vários padrões arquiteturais, você tem por exemplo questões de performance (imagine um usuário dando F5 toda hora na sua página). Não sei se nesse cenário você está apenas estudando, ou se é um projeto que você já pegou assim, ou se está começando do zero. Fica a sugestão.

Outra coisa: eu presumo que o código do formulário de entrada e o código para inserção no banco de dados estão em arquivos diferentes, é isso mesmo? Se não for, mais uma recomendação: separe objetivos em arquivos (jsps ou classes) diferentes. Deixe cada classe (ou jsp) responsável por um determinado objetivo.

Uma dica sempre útil em desenvolvimento web: verifique o código HTML do formulário montado, se está tudo correto. Tags não fechadas, ou ausência de determinadas tags atrapalham o funcionamento. Um exemplo: aonde está o formulário de entrada, você abriu e fechou a tag ? Outro: reparei que você não fechou nenhuma das tags .

Por fim, o banco de dados está preenchido? O combo de Departamentos é montado corretamente?

Vou colocar um exemplo simples de select com JSP funcionando normalmente, para te dar uma base de comparação:

Formulário de entrada:

<form method="post" action="retorno.jsp" >

Nome:<input type ="text" name ="nome" size ="30" /> <br />  
Fone:<input type ="text" name ="fone" size ="12" />  <br />  
Departamento:<select name ="Departamentos" >
<% 
	int[] indices = {1, 2, 3, 4};
	String[] deptos = {"Depto 1", "Depto 2", "Depto 3", "Depto 4"}; 
	int i = 0;
	while (i < 4){
		%>
		<option value ="<%=indices[i]%>" ><%=deptos[i]%> </option>
		<%  
		i++;
	}
        //Importante: este loop  está horrível, estou apenas tentando mapear com seu cenário, ok? Não faça isso em casa :D
%>
</select>

<input type="submit" value="Enviar" />

</form>

Retorno:

<body>

<%

String nome =request.getParameter("nome");  
String fone = request.getParameter("fone");  
String depto =request.getParameter("Departamentos");  

%>

<p>Nome: <%=nome %></p>
<p>Fone: <%=fone %></p>
<p>Departamento: <%=depto %></p>

</body>

Este exemplo simples funciona: na segunda tela, você consegue recuperar todos os valores informados na primeira tela.

M

Obrigado pelas dicas. Já consegui resolver este problemas.

Criado 18 de junho de 2012
Ultima resposta 18 de jun. de 2012
Respostas 2
Participantes 2