A variavel de apoio que estou usando para alterar senha está saindo como nula

Estou tentando fazer um método de alterar senha, no meu if ele passa como se estivesse tudo certo mais não altera no banco de dados, eu debuguei e parece que a minha variavel cpfApoio está sendo passada como nula

Aqui vai o código:

public boolean AlterarSenha(String senha) {
    Aluno aluno = new Aluno();
    // comandos banco de dados
        String sql  = "update aluno set senha = ? where cpf = " + aluno.getCpfApoio();
    // conectando no banco de dados
    Connection con = Conexao.Conectar();

    try {
        PreparedStatement stm = con.prepareStatement(sql);
        stm.setString(1, senha);   
        stm.execute();
        
    } catch (SQLException ex) {
      System.out.println("Erro:" + ex.getMessage());
      return false;
    }
    return true;
}

///////////////////////////////////////////////////////////////////////

eu clico em um botao alterar senha e ele passa pelos seguinte jsp

ConfirmarCpf

<body>
    <form action="recebeConfirmarCpf.jsp">
        <input type="text" id="cpf" name="cpf" placeholder="Insira o CPF da conta" required="required">
        <input type="submit" name="entrar" value="Buscar">
     </form>
</body>

recebeConfirmarCpf

<%
String cpf = request.getParameter(“cpf”);

AlunoDAO alunoDAO = new AlunoDAO();
if(alunoDAO.confirmarCpf(cpf) == true){
      Aluno aluno = new Aluno();
      aluno.setCpfApoio(cpf);
      response.sendRedirect("alterarSenha.jsp");  
    }
    else {
    response.sendRedirect("confirmarCpf.jsp");  
}

%>

/////////////////////////////////////////

AlterarSenha

<body>
    <form action="recebeAlterarSenha.jsp">
    <input type="password" name="senha" required="required">
    <input type="submit" value="Alterar">
    </form>
</body>

e recebeAlterarSenha

<%
String senha = request.getParameter(“senha”);
Aluno aluno = new Aluno();

AlunoDAO alunoDAO = new AlunoDAO();
if (alunoDAO.AlterarSenha(senha) == true) {
       response.sendRedirect("loginAluno.jsp");
    }
    else {
    response.sendRedirect("alterarSenha.jsp");
}

%>

ele está passando por tudo e não está dando nenhum erro mas não atualiza no banco de dados, caso possam me ajudar ficarei muito grato.

public boolean AlterarSenha(String senha) {
    Aluno aluno = new Aluno();
    // comandos banco de dados
//não convém passar variáveis diretamente na query sql, pois é um convite para sql injection //
        String sql  = "update aluno set senha = ? where cpf = ?;
    // conectando no banco de dados
    Connection con = Conexao.Conectar();

    try {
        PreparedStatement stm = con.prepareStatement(sql);
           stm.setString(1, senha);   
           stm.setDouble(2, aluno.getCpfApoio());    
        stm.execute();
        
    } catch (SQLException ex) {
      System.out.println("Erro:" + ex.getMessage());
      return false;
    }
    return true;
}

//////////// no formulario falta informar o metodo, se é post ou get////////

<body>
    <form action="recebeAlterarSenha.jsp" method="post">
    <input type="password" name="senha" required="required">
    <input type="submit" value="Alterar">
    </form>
</body>
//////
Verifique se no output do servidor (conteiner) se tem algum erro

Preste atenção no seu código:

public boolean AlterarSenha(String senha) {
    // aqui você acabou de criar um objeto do tipo Aluno
    Aluno aluno = new Aluno();
    String sql  = "update aluno set senha = ? where cpf = ?";
    Connection con = Conexao.Conectar();
    try {
        PreparedStatement stm = con.prepareStatement(sql);
           stm.setString(1, senha);
           // e aqui quer obter o CpfApoio do objeto que acabou de criar?
           // esse objeto acabou de ser criado, ele não tem nada setado...
           stm.setDouble(2, aluno.getCpfApoio());
        stm.execute();
    } catch (SQLException ex) {
      System.out.println("Erro:" + ex.getMessage());
      return false;
    }
    return true;
}

Tem razão, não reparei

Fiz tudo e não deu certo, continua indo o valor como nulo e não alterando no banco e não há nenhum erro no output do servidor

não entendi sua resposta, estou setando um valor no apoioCpf no jsp recebeConfirmaCpf

Se eu fizer desta maneira também não funciona

public boolean AlterarSenha(Aluno aluno) {

    // comandos banco de dados
        String sql  = "update aluno set senha = ? where cpf = ?";
    // conectando no banco de dados
    Connection con = Conexao.Conectar();

    try {
        PreparedStatement stm = con.prepareStatement(sql);
        stm.setString(1, aluno.getSenha()); 
        stm.setString(2, aluno.getCpfApoio());
        stm.execute();
        
    } catch (SQLException ex) {
      System.out.println("Erro:" + ex.getMessage());
      return false;
    }
    return true;
}

O [staroski] tem razão, o problema é que está a enviar para duas jsp’s, onde em cada JSP cria um objeto Aluno aluno = new Aluno();
Assim vai perder o set cpf, quando criar um novo objeto na segunda jsp, o ideal era efetuar a validação toda num só JSP, onde cria um objeto único e seta os valores de cpf e senha.

Está criando um objeto Aluno no recebeConfirmarCpf.
E está criando outro objeto Aluno no método AlterarSenha.

2 curtidas

Consegui resolver, coloquei em uma pagina junta e recebi usando dois ifs e está funcionando obrigada!

1 curtida