[RESOLVIDO]Deletar dados do banco ao clicar em botão HTML

7 respostas
M

Bom dia, eu estou com uma lista em JSTL que exibe dados do banco na minha página. Ao lado de cada item da lista tem um botão e eu gostaria que ao clicar nele, o item fosse deletado. Porém não é o que está acontecendo, a página está executando o método dentro do botão mesmo sem clicar nele, ao apertar F5 ele simplesmente apaga todos os dados do banco.

Método da classe DAO:

public void deletar(int id){

String sql = “delete from colaborador where id=?”;
try{
		PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setInt(1, id);
			
			stmt.execute();
			stmt.close();
	}catch(SQLException e){
		throw new RuntimeException(e);
	}
	
}
Lista JSTL:

<c:forEach var=colaborador items="${daocolaborador.pesquisar()}">

tr>
td style="width: 25%">${colaborador.id}</td
		td style="width: 25%">${colaborador.nome}</td
		td style="width: 25%">${colaborador.local}</td
		td style="width: 25%">
			button class="btn btn-warning" style="background-color:orange;color:white" type="submit" onClick="${daocolaborador.deletar(colaborador.id)}">Deletar</button
			button class="btn btn-warning" style="background-color:orange;color:white" type="submit" onClick="">Alterar</button
		</td		
	/tr>
</c:forEach>

Alguém sabe me dizer porque dele deletar mesmo sem eu estar clicando no botão? Agradeço desde já.

7 Respostas

W

Bom dia, amigo.
Para melhorar seu código, faça uma validação melhor antes de deletar.
Verifica se existe o id requerido antes para não haver problemas futuros.

Agora vamos para o problema central.
Faça outra função para pegar o submit e retire o onClick do botão.
Para isso insira um name=“del_colaborador” no button.
Agora na função você verifica se foi clicado o botão, caso sim inicia a função de delete.

Separar esse OnClick da função é uma possível solução pois tira de fora do foreach, que ao meu ver pode ser este o problema.

J

Toda vez que tem um refresh na pagina ele deleta um colaborador ?

Tenta rodar o debug pra ver quando o método é acionado.

M

Eu entendi o que você quis dizer mas pra ser honesto não sei como fazer. Seria através de um formulário pelo action enviando um request para um Servlet?

M

Não, quando dá um refresh ele deleta todos de uma vez só.

V

Declare dentro do try catch assim:
String sql = “delete from colaborador where id="+id+”;
e depois mande imprimir sql.
Assim você consegue ver todas as chamadas que são realizadas.

M

O problema é que por ter um foreach, o onClick está sendo executado todas as vezes ao que parece, o que acaba deletando todos os dados.

M

Problema resolvido da seguinte forma:

form action=“ServletSoftware” method=“POST” style=“float: left; margin-right: 1%”>

input type=“hidden” name=“software” value=“remove”>

input type=“hidden” name=“id” value="${<a href="http://software.id">software.id</a>}">

button class=“btn btn-danger” style=“color:white” type=“submit”>Deletar

/form>

Obrigado a todos que tentaram ajudar!!

Criado 1 de março de 2018
Ultima resposta 9 de mar. de 2018
Respostas 7
Participantes 4