Problemas com exercicio da apostila FJ21 execicio 9.9.2

2 respostas
L
Bom dia galera Estou fazendo este exercício da apostila fj21: Coloque um link na sua lista-contatos-elegante.jsp que abre a pagina teste-altera-mvc.jsp passando o id do contato que vc quer alterar. Deixe o campo id visível no form mas não alterável. Não esqueça de passar o campo id pela requisição

. Faça com que os campos do form estejam populados com os dados do contato a ser editado.

bem, inseri o link na pagina:

<td><a href="mvc?logica=AlteraContatoLinkLogic&id=${contato.id}">Alterar</a></td>

criei esta logica para enviar os dados a serem alterados:

package br.com.caelum.mvc.logica;
 
import javax.servlet.RequestDispatcher;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  

import br.com.caelum.agenda.dao.ContatoDao;
import br.com.caelum.agenda.modelo.Contato;
  
public class AlteraContatoLinkLogic implements Logica{  
  
    public void executa(HttpServletRequest req, HttpServletResponse res) throws Exception {  
        Long id = Long.parseLong(req.getParameter("id"));  
        ContatoDao contatoDao = new ContatoDao();  
        Contato contato = contatoDao.pesquisarContato(id);
        req.setAttribute("nome",contato.getNome());  
        req.setAttribute("email",contato.getEmail());  
        req.setAttribute("endereco",contato.getEndereco());  
        req.setAttribute("nascimento",contato.getDataNascimento());  
  
        RequestDispatcher rd = req.getRequestDispatcher("testa-altera-mvc.jsp");  
        rd.forward(req, res);  
    }  
  
}

e criei a pesquisa no contatodao:

public Contato pesquisarContato(Long id){  
        Contato contato = new Contato();  
        try{  
            PreparedStatement stmt = this.connection.prepareStatement("select * contato where id=?");  
            ResultSet rs = stmt.executeQuery();  
            stmt.setLong(1,contato.getId());  
            contato.setId(rs.getLong("id"));  
            contato.setNome(rs.getString("nome"));  
            contato.setEmail(rs.getString("email"));  
            contato.setEndereco(rs.getString("endereco"));  
            rs.close();  
            stmt.close();  
        }catch(SQLException e){  
            throw new RuntimeException(e);  
        }  
          
        return contato;  
    }

Como eu resolvo isso ??[size=18] [/size]
Mas ao executar aparece esse erro :

java.lang.NumberFormatException: For input string: ""
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
java.lang.Long.parseLong(Long.java:453)
java.lang.Long.parseLong(Long.java:483)
br.com.caelum.mvc.logica.AlteraContatoLinkLogic.executa(AlteraContatoLinkLogic.java:13)
br.com.caelum.mvc.servlet.ControllerServlet.service(ControllerServlet.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

2 Respostas

TerraSkilll

Seu método pesquisar contato parece estar errado. Você está passando o id do contato ("contato.getId()", que está nulo) ao invés do parâmetro do método, além de estar passando o parâmetro depois de chamar o "executeQuery()".

A correção seria algo como:

public Contato pesquisarContato(Long id){  
        Contato contato = new Contato();  
        try{  
            PreparedStatement stmt = this.connection.prepareStatement("select * contato where id=?");  
            stmt.setLong(1, id); // usa o parametro do metodo
            ResultSet rs = stmt.executeQuery(); // executa a query depois de passar o parametro
            contato.setId(rs.getLong("id"));
            contato.setNome(rs.getString("nome"));  
            contato.setEmail(rs.getString("email"));  
            contato.setEndereco(rs.getString("endereco"));  
            rs.close();  
            stmt.close();  
        }catch(SQLException e){  
            throw new RuntimeException(e);  
        }  
          
        return contato;  
    }

Abraço.

L

Ola TerraSkilll

Fiz as alterações mas ainda esta com erro, ao tentar executar apareceu essa mensagem de erro:

type Exception report

message A logica de negocios causou uma exceção

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

exception

javax.servlet.ServletException: A logica de  negocios causou uma exceção

br.com.caelum.mvc.servlet.ControllerServlet.service(ControllerServlet.java:29)

javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

root cause

java.lang.NumberFormatException: For input string: “”

java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

java.lang.Long.parseLong(Long.java:453)

java.lang.Long.parseLong(Long.java:483)

br.com.caelum.mvc.logica.AlteraContatoLinkLogic.executa(AlteraContatoLinkLogic.java:13)

br.com.caelum.mvc.servlet.ControllerServlet.service(ControllerServlet.java:26)

javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Nao estou entendendo nesse execicio como é passado o id para ser modificado clicando no link e queria saber tb como debugar isso.

Criado 16 de setembro de 2014
Ultima resposta 17 de set. de 2014
Respostas 2
Participantes 2