Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
16
respostas

CRUD Função EDITAR não está funcionando

Pessoal estou desenvolvendo um CRUD simples e está faltando apenas eu conseguir EDITAR a informação, quando eu vou em editar não acontece nada na minha página e não apresenta nenhum erro no console.

Abaixo o código que eu fiz.

DAO

public void atualizar(Cartorio cartorio) throws SQLException, ClassNotFoundException {

        Connection conexao = ConexaoFactory.getConexao();

        PreparedStatement statement = conexao.prepareStatement("UPDATE cartorio SET nome =? WHERE id = ?");
        statement.setString(1, cartorio.getNome());
        statement.setInt(2, cartorio.getId());
        statement.execute();

    }

Controler

package br.com.testCartorio.controler;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.testCartorio.dao.CartorioDao;
import br.com.testCartorio.model.Cartorio;

@WebServlet("/CartorioControler")
public class CartorioControler extends HttpServlet {

    private CartorioDao cartorioDao = new CartorioDao();

    private static final long serialVersionUID = 1L;

    public CartorioControler() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String acao = request.getParameter("acao");
        String id = request.getParameter("id");

        try {
            if (acao != null && acao.equals("excluir")) {
                Integer codid = Integer.parseInt(id);
                cartorioDao.excluir(codid);
                request.setAttribute("mensagem", "Nome excluido com sucesso");

            } else if (acao != null && acao.equals("editar")) {
                Integer codid = Integer.parseInt(id);
                Cartorio cartorio = cartorioDao.getCartorioId(codid);
                request.setAttribute("cartorio", cartorio);
            }
            request.setAttribute("cartorio", cartorioDao.getCartorio());
        } catch (SQLException e) {
            request.setAttribute("mensagem", "Erro de Banco de Dados: " + e.getMessage());
        } catch (ClassNotFoundException e) {
            request.setAttribute("mensagem", "Erro de Driver: " + e.getMessage());
        }

        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/paginas/cartorio.jsp");
        dispatcher.forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String nome = request.getParameter("nome");
        String id = request.getParameter("id");
        Cartorio cartorio = new Cartorio(null, nome);

        if (id != null && !id.equals("")) {
            cartorio.setId(Integer.parseInt(id));
        }

        try {
            if (cartorio.getId() != null) {
                cartorioDao.atualizar(cartorio);
                request.setAttribute("mensagem", "Nome atualizado com sucesso");
            } else {
                cartorioDao.salvar(cartorio);
                request.setAttribute("mensagem", "Nome cadastrado com sucesso");
            }
            request.setAttribute("cartorio", cartorioDao.getCartorio());
        } catch (SQLException e) {
            request.setAttribute("mensagem", "Erro de Banco de Dados: " + e.getMessage());
        } catch (ClassNotFoundException e) {
            request.setAttribute("mensagem", "Erro de Driver: " + e.getMessage());
        }
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/paginas/cartorio.jsp");
        dispatcher.forward(request, response);

    }

}

JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Lista de Cadastros</title>
</head>
<body>
    <form method="POST" action="CartorioControler">
        <input type="hidden" name="id" value="${c.id}"/>
        Codigo <input type="text" disabled name="id" value="${c.id}"/> <br>
        Nome <input type="text" name="nome" value="${c.nome}" /> <br>
        <input type="submit" value="Enviar" />

    </form>


    <h2>${mensagem}</h2>

    <h4>Pessoas cadastradas no Cartório</h4>
    <table border="1">
        <tr>
            <th>Codigo</th>
            <th>Nome</th>
            <th>Editar</th>
            <th>Excluir</th>
        </tr>
        <c:forEach var="c" items="${cartorio}">
            <tr>
                <td>${c.id}</td>
                <td>${c.nome}</td>
                <td><a href=CartorioControler?acao=editar&id=${c.id}>Editar</a>
                <td><a href=CartorioControler?acao=excluir&id=${c.id}>Excluir</a>
            </tr>
        </c:forEach>
    </table>
</body>
</html>
16 respostas

Olá Thiago,

tem dois ajustes que eu identifiquei que precisam ser feitos no código. O primeiro deles é que o método doGet envia Attribute para a jsp com o nome cartorio.

 request.setAttribute("cartorio", cartorio);

Só que na jsp, dentro da tag form nos values dos inputs, está chamando apenas com o nome de c

<input type="hidden" name="id" value="${c.id}"/>
Codigo <input type="text" disabled name="id" value="${c.id}"/> <br>
Nome <input type="text" name="nome" value="${c.nome}" /> <br>

ali precisava chamar com o nome que foi enviado pela servlet, como:

${cartorio.id} 
${cartorio.nome} 

Um segundo ponto que talvez precise de ajuste é na hora de recuperar cartório para enviar até a tela.

} else if (acao != null && acao.equals("editar")) {
    Integer codid = Integer.parseInt(id);
    Cartorio cartorio = cartorioDao.getCartorioId(codid);
    request.setAttribute("cartorio", cartorio);
}
request.setAttribute("cartorio", cartorioDao.getCartorio());

Ali dentro do if é buscado o cartório baseado no id e ele é colocado dentro dos atributos da request. Só que logo após o if esse cartório é sobrescrito pelo comando request.setAttribute("cartorio", cartorioDao.getCartorio()), o que provavelmente está fazendo com que o cartório que foi filtrado pelo id seja perdido.

Olá Lucas,

Realizei a primeira mudança e meu código apresentou erro nessas linhas.

type Exception report

message An exception occurred processing JSP page /WEB-INF/paginas/cartorio.jsp at line 12

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

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/paginas/cartorio.jsp at line 12

9: 10:

11: 12: 13: Código 14: Nome 15:

Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) br.com.testCartorio.controler.CartorioControler.doGet(CartorioControler.java:52) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) root cause

java.lang.NumberFormatException: For input string: "id" java.lang.NumberFormatException.forInputString(Unknown Source) java.lang.Integer.parseInt(Unknown Source) java.lang.Integer.parseInt(Unknown Source) javax.el.ListELResolver.coerce(ListELResolver.java:163) javax.el.ListELResolver.getValue(ListELResolver.java:51) org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104) org.apache.el.parser.AstValue.getValue(AstValue.java:183) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:1026) org.apache.jsp.WEB_002dINF.paginas.cartorio_jsp.jspService(cartoriojsp.java:77) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) br.com.testCartorio.controler.CartorioControler.doGet(CartorioControler.java:52) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) note The full stack trace of the root cause is available in the Apache Tomcat/7.0.47 logs.

A segunda parte referente a linha request.setAttribute("cartorio", cartorioDao.getCartorio()); retirei essa linha para fazer alguns testes e não apresenta erro somente minha lista que fica ocultada.

Pelo erro ele está reclamando da chamada do getId da classe Cartorio. Me manda a classe completa para eu dar uma olhada.

Classe Cartorio.

package br.com.testCartorio.dao;

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;

import br.com.testCartorio.model.Cartorio;

public class CartorioDao {

public List<Cartorio> getCartorio() throws SQLException, ClassNotFoundException {

    Connection conexao = ConexaoFactory.getConexao();

    PreparedStatement ps = conexao.prepareStatement("SELECT id,nome FROM cartorio");
    ResultSet rs = ps.executeQuery();
    List<Cartorio> cartorio = new ArrayList<>();
    while (rs.next()) {
        cartorio.add(new Cartorio(rs.getInt(1), rs.getString(2)));
    }
    return cartorio;
}

public void salvar(Cartorio cartorio) throws SQLException, ClassNotFoundException {

    Connection conexao = ConexaoFactory.getConexao();

    PreparedStatement statement = conexao.prepareStatement("INSERT INTO cartorio(nome) values (?)");
    statement.setString(1, cartorio.getNome());
    statement.execute();
}

public void excluir(Integer codid) throws SQLException, ClassNotFoundException {

    Connection conexao = ConexaoFactory.getConexao();

    PreparedStatement statement = conexao.prepareStatement("DELETE FROM cartorio WHERE id = ?");
    statement.setInt(1, codid);
    statement.execute();
}

public Cartorio getCartorioId(Integer codid) throws SQLException, ClassNotFoundException {

    Connection conexao = ConexaoFactory.getConexao();

    PreparedStatement ps = conexao.prepareStatement("SELECT id,nome FROM cartorio WHERE id = ?");
    ps.setInt(1, codid);
    ResultSet rs = ps.executeQuery();
    if (rs.next()) {
        return new Cartorio(rs.getInt(1), rs.getString(2));
    }
    throw new SQLException("Nao foi encontrado" + codid);
}

public void atualizar(Cartorio cartorio) throws SQLException, ClassNotFoundException {

    Connection conexao = ConexaoFactory.getConexao();

    PreparedStatement statement = conexao.prepareStatement("UPDATE cartorio SET nome =? WHERE id = ?");
    statement.setString(1, cartorio.getNome());
    statement.setInt(2, cartorio.getId());
    statement.execute();

}

}

Ola'Thiago,

esta que você me mandou é a CartorioDao, precisava ver a classe br.com.testCartorio.model.Cartorio mesmo.

Desculpa, está aqui a classe Cartorio.

package br.com.testCartorio.model;

public class Cartorio {

private Integer id;

private String nome;

public Cartorio() {
    super();
}

public Cartorio(Integer id, String nome) {
    super();
    this.id = id;
    this.nome = nome;
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

}

Ahhh pera agora eu vi. Quando você tirou o comando request.setAttribute("cartorio", cartorioDao.getCartorio()) ele parou de dar erro na página? Ele só parou de carregar a tabela? É isso?

Quando eu retiro sim ele não da erro e não carrega a tabela.

Agora entendi. O problema é que o cadastro estava interferindo na tabela, são ações diferentes.

Note que por enquanto na geração da tabela é feito um for em cima de cartorio

 <c:forEach var="c" items="${cartorio}">

só que agora o cartorio não é uma lista do que foi registrado, este cara é usado para o formulário de cadastro. Então o que você precisa fazer é voltar com aquele setAttribute que usava o cartorioDao.getCartorio(), mas ao invés de mandar como cartorio mandar como listaCartorios

request.setAttribute("listaCartorios", cartorioDao.getCartorio());

E na jsp no items do foreach chamar esta listaCartorio.

Lucas, fiz as alterações conforme você me disse e apresenta o erro abaixo quando vou acessar a aplicação.

HTTP Status 500 - An exception occurred processing JSP page /WEB-INF/paginas/cartorio.jsp at line 12 type Exception report

message An exception occurred processing JSP page /WEB-INF/paginas/cartorio.jsp at line 12

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

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/paginas/cartorio.jsp at line 12

9: 10:

11: 12: 13: Código 14: Nome 15:

Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) br.com.testCartorio.controler.CartorioControler.doGet(CartorioControler.java:53) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) root cause

java.lang.NumberFormatException: For input string: "id" java.lang.NumberFormatException.forInputString(Unknown Source) java.lang.Integer.parseInt(Unknown Source) java.lang.Integer.parseInt(Unknown Source) javax.el.ListELResolver.coerce(ListELResolver.java:163) javax.el.ListELResolver.getValue(ListELResolver.java:51) org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104) org.apache.el.parser.AstValue.getValue(AstValue.java:183) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:1026) org.apache.jsp.WEB_002dINF.paginas.cartorio_jsp.jspService(cartoriojsp.java:77) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) br.com.testCartorio.controler.CartorioControler.doGet(CartorioControler.java:53) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) note The full stack trace of the root cause is available in the Apache Tomcat/7.0.47 logs.

Olá Thiago,

pelo erro parece que você alterou o formulário. Ali é para usar o cartório mesmo e não a lista. A ${listCartorio} você precisa usar apenas na tabela, que ali sim você precisa de vários cartórios salvos no banco. No formulário você está trabalhando com 1 cartorio, que ai sim é o ${cartorio}

Olá Lucas,

Fiz as alterações conforme você me indicou e agora quando vou no botão editar as informações são carregadas no formulário (antes elas não eram carregadas). Eu as edito e vou em salvar e apresenta erro.

HTTP Status 500 - An exception occurred processing JSP page /WEB-INF/paginas/cartorio.jsp at line 12 type Exception report

message An exception occurred processing JSP page /WEB-INF/paginas/cartorio.jsp at line 12

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

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/paginas/cartorio.jsp at line 12

9: 10:

11: 12: 13: Código 14: Nome 15:

Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) br.com.testCartorio.controler.CartorioControler.doPost(CartorioControler.java:82) javax.servlet.http.HttpServlet.service(HttpServlet.java:647) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) root cause

java.lang.NumberFormatException: For input string: "id" java.lang.NumberFormatException.forInputString(Unknown Source) java.lang.Integer.parseInt(Unknown Source) java.lang.Integer.parseInt(Unknown Source) javax.el.ListELResolver.coerce(ListELResolver.java:163) javax.el.ListELResolver.getValue(ListELResolver.java:51) org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104) org.apache.el.parser.AstValue.getValue(AstValue.java:183) org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:1026) org.apache.jsp.WEB_002dINF.paginas.cartorio_jsp.jspService(cartoriojsp.java:77) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) br.com.testCartorio.controler.CartorioControler.doPost(CartorioControler.java:82) javax.servlet.http.HttpServlet.service(HttpServlet.java:647) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) note The full stack trace of the root cause is available in the Apache Tomcat/7.0.47 logs.

Me manda o Código do CartorioController e da jsp completos para eu dar uma olhada como está agora.

Lucas,

CartorioController

package br.com.testCartorio.controler;

import java.io.IOException; import java.sql.SQLException;

import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import br.com.testCartorio.dao.CartorioDao; import br.com.testCartorio.model.Cartorio;

@WebServlet("/CartorioControler") public class CartorioControler extends HttpServlet {

private CartorioDao cartorioDao = new CartorioDao();

private static final long serialVersionUID = 1L;

public CartorioControler() {
    super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    String acao = request.getParameter("acao");
    String id = request.getParameter("id");

    try {
        if (acao != null && acao.equals("excluir")) {
            Integer codid = Integer.parseInt(id);
            cartorioDao.excluir(codid);
            request.setAttribute("mensagem", "Nome excluido com sucesso");

        } else if (acao != null && acao.equals("editar")) {
            Integer codid = Integer.parseInt(id);
            Cartorio cartorio = cartorioDao.getCartorioId(codid);
            request.setAttribute("cartorio", cartorio);
        }
        request.setAttribute("listaCartorio", cartorioDao.getCartorio());
        //request.setAttribute("cartorio", cartorioDao.getCartorio());
    } catch (SQLException e) {
        request.setAttribute("mensagem", "Erro de Banco de Dados: " + e.getMessage());
    } catch (ClassNotFoundException e) {
        request.setAttribute("mensagem", "Erro de Driver: " + e.getMessage());
    }

    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/paginas/cartorio.jsp");
    dispatcher.forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    String nome = request.getParameter("nome");
    String id = request.getParameter("id");
    Cartorio cartorio = new Cartorio(null, nome);

    if (id != null && !id.equals("")) {
        cartorio.setId(Integer.parseInt(id));
    }

    try {
        if (cartorio.getId() != null) {
            cartorioDao.atualizar(cartorio);
            request.setAttribute("mensagem", "Nome atualizado com sucesso");
        } else {
            cartorioDao.salvar(cartorio);
            request.setAttribute("mensagem", "Nome cadastrado com sucesso");
        }
        request.setAttribute("cartorio", cartorioDao.getCartorio());
    } catch (SQLException e) {
        request.setAttribute("mensagem", "Erro de Banco de Dados: " + e.getMessage());
    } catch (ClassNotFoundException e) {
        request.setAttribute("mensagem", "Erro de Driver: " + e.getMessage());
    }
    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/paginas/cartorio.jsp");
    dispatcher.forward(request, response);

}

}

JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

Código Nome
</form>


<h2>${mensagem}</h2>

<h4>Cartórios Cadastrados</h4>
<table border="1">
    <tr>
        <th>Código</th>
        <th>Nome</th>
        <th>Editar</th>
        <th>Excluir</th>
    </tr>
    <c:forEach var="c" items="${listaCartorio}">
        <tr>
            <td>${c.id}</td>
            <td>${c.nome}</td>
            <td><a href=CartorioControler?acao=editar&id=${c.id}>Editar</a>
            <td><a href=CartorioControler?acao=excluir&id=${c.id}>Excluir</a>
        </tr>
    </c:forEach>
</table>

Acho que só faltou no método doPost faltou trocar o attribute da lista de cartorio para listaCartorio.

request.setAttribute("listaCartorio", cartorioDao.getCartorio());
solução!

Lucas,

Agora deu certo, consigo cadastrar, listar, editar e excluir.

Obrigado pela ajuda.