Dúvida em Servlet de remoção[RESOLVIDO]

Pessoal,

Estou com um probleminha. Tenho uma tabela no banco de alunos. Criei minha servlet de nome “RemoveAlunoServlet”. Criei o mapeamento no Web.xml com a url-pattern “/removeAluno”, só que minha grande dúvida está na minha “lista-alunos.jsp”. Estou querendo chamar a minha servlet de remoção através de um link chamado de “Remover”. Fiz só que não consegui fazer da forma correta e não está removendo ao clicar no link. E quando clico no link cai no erro HTTP 500 com a seguinte mensagem de erro:

[b]type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.NumberFormatException: For input string: “”
java.lang.NumberFormatException.forInputString(Unknown Source)
java.lang.Long.parseLong(Unknown Source)
java.lang.Long.parseLong(Unknown Source)
servlet.RemoveAlunoServlet.service(RemoveAlunoServlet.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)[/b]

Estou removendo pelo id do aluno e é do tipo Long. Desconfio que o erro seja lá no link “Remover”.

O código do “lista-alunos.jsp” está da seguinte maneira:

<table>
		<c:forEach var="aluno" items="${dao.lista}" varStatus="id">
			<tr bgcolor="#${id.count % 2 == 0 ? 'aaee88' : 'ffff10'}">
				<td>${id.count}</td>
				<td>${aluno.nome}</td>
				<td>${aluno.cpf}</td> 
				<td>${aluno.telefone}</td> 
				<td>${aluno.endereco}</td> 
				<td>${aluno.bairro}</td> 
				<td>${aluno.cidade}</td> 
				<td>${aluno.uf}</td>
				[color=darkred]<td><a href="removeAluno?id=${aluno.id}">Remover</a></td>[/color]
				
			</tr>
			
		</c:forEach>
			
</table>
		<br/>
		<a href="adiciona-aluno.jsp">Adicionar aluno</a>

Gostaria de saber se no link “Remover” fiz da forma correta???

coloca a barrinha tmb assim

Foi mal cara, coloquei em quotes e nao vi q tinha quebrado,

<td>Remover - ${aluno.id}</td>

coloca o codigo do aluno no texto do link pra ver se ta vindo certo.

Pelo erro provavelmente o id aluno esta vindo vazio.

??? Mas já não está???

servlet.RemoveAlunoServlet.service(RemoveAlunoServlet.java:26)

mostra teu servlet ai pra gente ! julhy

Em servlet.RemoveAlunoServlet.service(RemoveAlunoServlet.java:26)
Você tentou remover um aluno cujo id era “” e não um Long. Deu erro de cast.

Veja se todos os objetos retornados por ${dao.lista} possuem ids válidos.
Ids que não podem ser convertidos em longs não são válidos (ex: null, “abc12”, “”).

O servlet está da seguinte forma:

public class RemoveAlunoServlet extends HttpServlet{

protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
	
	Aluno aluno = new Aluno();
	long id = Long.parseLong(req.getParameter("id"));
	aluno.setId(id);
	
	AlunoDAO dao = new AlunoDAO();
	dao.remove(aluno);
	
	res.sendRedirect("lista-alunos.jsp");

}

Se eu colocar o id do aluno, remove numa boa.

Ex: Se eu colocar la na barra de endereço do browser assim

http://localhost:8080/aulaServlet/removeAluno?id=2

O problema acho que é como eu chamo lá no link remover…

Remover **essa parte do código aqui**

O problema está no seu link.
${aluno.id} está retornando “” ao invés de um id válido.

Sim…é justamente no link. Tanto é que que ta dando aquela exception input string = “”. Daquele HTTP 500 mencionado no início. Aquela EL (${aluno.id}), não está pegando um id válido…

Se a sintaxe do link estiver correta e tudo o mais, o q sobra é q o erro poderia estar em quem alimenta este link.

E este seria o ${dao.lista}.
Posta aí o código dele.

Cara, qnd for postar codigo usa a Tag COde que tem em cima do editor de texto. “codigo aki

Seguinte. posta a sua classe AlunoDAO pra gente ver o que pode estar errado.

Esses são os 2 métodos da classe AlunoDAO no qual estou trabalhando no momento:

[code]public List getLista(){
try{
List alunos = new ArrayList();
PreparedStatement stmt = this.connection.prepareStatement(“select * from tb_aluno”);
ResultSet rs = stmt.executeQuery();

	while(rs.next()){
		Aluno aluno = new Aluno();
		aluno.setNome(rs.getString("nome"));
		aluno.setCpf(rs.getString("cpf"));
		aluno.setTelefone(rs.getString("telefone"));
		aluno.setEndereco(rs.getString("endereco"));
		aluno.setBairro(rs.getString("bairro"));
		aluno.setCidade(rs.getString("cidade"));
		aluno.setUf(rs.getString("estado"));
		
		alunos.add(aluno);
	}
	
	rs.close();
	stmt.close();
	return alunos;
	
	}catch(SQLException e){
		throw new RuntimeException(e);
	}
}

public void remove(Aluno aluno){
	String sql = "delete from tb_aluno where id=? ";
	try{
		PreparedStatement stmt = this.connection.prepareStatement(sql);
		stmt.setLong(1, aluno.getId());
		stmt.execute();
	}catch(SQLException e){
		throw new RuntimeException();
	}
}[/code]

Aluno aluno = new Aluno(); aluno.setNome(rs.getString("nome")); aluno.setCpf(rs.getString("cpf")); aluno.setTelefone(rs.getString("telefone")); aluno.setEndereco(rs.getString("endereco")); aluno.setBairro(rs.getString("bairro")); aluno.setCidade(rs.getString("cidade")); aluno.setUf(rs.getString("estado"));

cadê o aluno.setId(…) ?
Por isso nada é exibido no seu link.

Outra coisa, seu “id” é mesmo um long ou uma String? Verifique isto tb.
Vai fazer diferença na linha 33 e onde mais getId e setId forem chamados.

O id é do tipo Long.

Fiz as alterações sugeridas…minha classe AlunoDAO ficou da seguinte forma:

[code]public List getLista(){
try{
List alunos = new ArrayList();
PreparedStatement stmt = this.connection.prepareStatement(“select * from tb_aluno”);
ResultSet rs = stmt.executeQuery();

	while(rs.next()){
		Aluno aluno = new Aluno();
		aluno.setId(rs.getLong("id"));
		aluno.setNome(rs.getString("nome"));
		aluno.setCpf(rs.getString("cpf"));
		aluno.setTelefone(rs.getString("telefone"));
		aluno.setEndereco(rs.getString("endereco"));
		aluno.setBairro(rs.getString("bairro"));
		aluno.setCidade(rs.getString("cidade"));
		aluno.setUf(rs.getString("estado"));
		
		alunos.add(aluno);
	}
	
	rs.close();
	stmt.close();
	return alunos;
	
	}catch(SQLException e){
		throw new RuntimeException(e);
	}
}

public void remove(Aluno aluno){
	String sql = "delete from tb_aluno where id=? ";
	try{
		PreparedStatement stmt = this.connection.prepareStatement(sql);
		stmt.setLong(1, aluno.getId());
		stmt.execute();
	}catch(SQLException e){
		throw new RuntimeException();
	}
}[/code]

Os erros continuam aumentando com as alterações…

[quote=tiagofla]

Os erros continuam aumentando com as alterações…[/quote]

kkkkkkkkkkkkk, muita calma nessa hora. Seguinte na sua tabela o atributo é ID mesmo???

os novos erros sao de compilação ou execução?

posta as mensagem de erro pra podermso ver.

Valeu pessoal !!! Problema resolvido. Estava faltando colocar as seguintes linhas de código:

Método getLista de AlunoDAO:

aluno.setId(rs.getLong("id"));

No lista-alunos.jsp:

<td>${aluno.id}</td>

Ja a chamada do link estava correta: <td><a href="removeAluno?id=${aluno.id}">Remover</a></td>

Blz :slight_smile: