Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Dúvida no Ex. 1 da Aula 6 - Usando AJAX

Fiz conforme o vídeo, eu clico no link "Apagar", mas não muda o Status "paga" e não adiciona a data de pagamento...

O meu método no contaController:

    @RequestMapping("/removeConta")
    public String remove(Conta conta) {
        ContaDAO dao = new ContaDAO();
        dao.remove(conta);
        return "redirect:listaContas";
    }

No meu lista.jsp:

<script src="resources/js/jquery.js"></script>
<script type="text/javascript">

    function deuCerto(dadosDaResposta){
        alert("Conta paga com sucesso!")
    }

    function pagaAgora(id){
        $.get("pagaConta?id=" + id, deuCerto);        
    }

</script>

Depois, também no lista .jsp:

            <td>
                <a href="removeConta?id=${conta.id}">Deletar</a> |
                <c:if test="${conta.paga eq false}">
                      <a href="#" onclick="pagaAgora(${conta.id});">Pagar</a>
                </c:if>                
            </td>

E no spring-context-handler:

<mvc:default-servlet-handler/>
11 respostas

Ewerton, Bom dia!

Cade sua action "pagaConta" ?

Bom dia Herbert!

    @RequestMapping("/pagaConta")
    public String paga(Conta conta) {
        ContaDAO dao = new ContaDAO();
        dao.paga(conta.getId());
        return "redirect:listaContas";

    }

Tentei também fazendo:

    @RequestMapping("/pagaConta")
    public void paga(Conta conta, HttpServletResponse response) {
        ContaDAO dao = new ContaDAO();
        dao.paga(conta.getId());
        response.setStatus(200);
    }

Mas o resultado é o mesmo...

Bom dia,

Então cara o apagar ele não está atualizando os dados da conta e sim remove do banco de dados. como pode ver no código

 @RequestMapping("/removeConta")
    public String remove(Conta conta) {
        ContaDAO dao = new ContaDAO();
        **dao.remove(conta);**
        return "redirect:listaContas";
    }

A action que atualiza os valores é a pagaConta

    @RequestMapping("/pagaConta")
    public void paga(Conta conta, HttpServletResponse response) {
        ContaDAO dao = new ContaDAO();
        dao.paga(conta.getId());
        response.setStatus(200);
    }

Como pode ver na classe ContaDAO

    public void paga(Long id) {

        if (id == null) {
            throw new IllegalStateException("Id da conta nao deve ser nula.");
        }

        String sql = "update contas set paga = ?, dataPagamento = ? where id = ?";
        PreparedStatement stmt;
        try {
            stmt = connection.prepareStatement(sql);
            stmt.setBoolean(1, true);
            stmt.setDate(2, new Date(Calendar.getInstance().getTimeInMillis()));
            stmt.setLong(3, id);
            stmt.execute();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

Também fiquei com uma dúvida!

você está clicando no "Pagar" ou "Apagar"?

PAGAR...

A tá então o correto seria atualizar mesmo, quando você chama a lista novamente não está atualizado os dados??

O Alert é apresentado???

Não é apresentado o "alert", não marca a conta como "paga" e não adiciona a "data de pagamento"...

Ai eu dou um F5, e marca a conta como "paga" e adiciona a "data de pagamento"...

Mas não é assim que deveria funcionar...

Estranho...

Então, esse exemplo é pra funcionar assim mesmo, no jquery não tem nenhuma instrução para atualizar a lista! Inclusive no vídeo o professor fala que pode ser feito mais algumas coisas para manipular o html.

Mas o alert deveria ser apresentado no caso que você devolve response(200).

solução!

Oi Ewerton,

o problem é que sua função jquery está faltando parâmetros. O $.get do jquery funciona assim:

$.get('aqui vai a URL', 'depois os dados', 'depois a função de sucesso');

O seu código pode ficar assim:

<script>
  function pagaAgora(id) {
    $.post("pagaConta", {'id' : id}, function() {
      alert("Conta paga com sucesso");
    });
  }
</script>

Ou assim:

<script type="text/javascript">

    function deuCerto(dadosDaResposta){
        alert("Conta paga com sucesso!")
    }

    function pagaAgora(id){
        $.get("pagaConta", {'id': id}, deuCerto);        
    }

</script>

Veja se é isso mesmo e se muda algo.

Abraço

Beleza Paulo!!

Era isso mesmo...

Obrigado!!! Um abraço!!