Solucionado (ver solução)
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.