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)
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!!