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)
12
respostas

Não remove linha

Fiz o exercício 2, porém não está excluindo a linha. Coloquei debug, mas não chama a função remove e não achei o pq.

Não gera nenhum erro, única coisa que verifiquei, foi ao executar aparece no console a seguinte informação:

10:21:52,146 DEBUG [VRaptor             ] VRaptor ended the request
10:21:52,173 DEBUG [DefaultStaticContentHandler] Deferring request to container: /vraptor-produtos/js/jquery-1.6.1.min.js

Segue meus fontes:

ProdutoController

package br.com.caelum.online.loja.controlador;

import java.util.List;

import br.com.caelum.online.loja.dominio.Produto;
import br.com.caelum.online.loja.repositorio.RepositorioDeProdutos;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Validations;
import br.com.caelum.vraptor.view.Results;

@Resource
public class ProdutoController {

    private final RepositorioDeProdutos produtos;
    private Result result;
    private Validator validator;

    public ProdutoController(RepositorioDeProdutos produtos, Result result, Validator validator) {
        this.produtos = produtos;
        this.result = result;
        this.validator = validator;
    }

    public List<Produto> lista(){
        return produtos.pegaTodos();
    }

    @Path("/produto/{id}")
    public Produto exibe(Long id){
        return produtos.pegaPorId(id);
    }

    @Path("/produto/{id}/xml")
    public void exibeComoXml(Long id){
        Produto produto = produtos.pegaPorId(id);
        result.use(Results.xml()).from(produto).serialize();
    }

    @Path("/produto/{id}/json")
    public void exibeComoJson(Long id){
        Produto produto = produtos.pegaPorId(id);
        result.use(Results.json()).from(produto).serialize();
    }


    public void formulario(){}

    @Post
    public void adiciona(final Produto produto){

        validator.checking(new Validations(){
            {
                that(produto.getPreco() > 0.1, "preco", "produto.preco.invalido");
                that(produto.getDescricao() != null && produto.getDescricao().length() >0, "descricao", "produto.descricao.invalido");
                that(produto.getNome() != null && produto.getNome().length() >=3 && produto.getNome().length() <=100, "nome","produto.nome.invalido");        
            }
        });

        validator.onErrorUsePageOf(ProdutoController.class).formulario();

        produtos.salva(produto);
        result.include("mensagem", "Produto adicionado com sucesso!");
        result.redirectTo(ProdutoController.class).lista();
    }

    public void remove(Produto produto){
        produtos.remove(produto);
        result.nothing();
    }

}

lista.jsp

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

<!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=UTF-8">
<script type="text/javascript" src="<c:url value="/js/jquery-1.6.1.min.js" />"></script>
<script type="text/javascript">
    function remove(id){
        $.get('remove?produto.id=' + id, function(){
            alert('Produto removido com sucesso');
        });

    }
</script>

<title>Lista Produtos</title>
</head>
<body>
${mensagem }
<table>
    <c:forEach var="produto" items="${produtoList }">
        <tr>
            <td>${produto.nome }</td>
            <td>${produto.descricao }</td>
            <td>${produto.preco }</td>
            <td>${produto.cor }</td>
            <td><a href="" onclick="remove(${produto.id}); return false;" >Remove</a></td>
        </tr>
    </c:forEach>
</table>
</body>
</html>
12 respostas

Vídeo AJAX: por páginas mais dinâmicas

lista.jsp

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

<!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=UTF-8">
<script type="text/javascript" src="<c:url value="/js/jquery-1.6.1.min.js" />"></script>
<script type="text/javascript">
    function remove(id){
        $.get('remove?produto.id=' + id, function(){
            alert('Produto removido com sucesso');
        });

    }
</script>

<title>Lista Produtos</title>
</head>
<body>
${mensagem }
<table>
    <c:forEach var="produto" items="${produtoList }">
        <tr>
            <td>${produto.nome }</td>
            <td>${produto.descricao }</td>
            <td>${produto.preco }</td>
            <td>${produto.cor }</td>
            <td><a href="" onclick="remove(${produto.id}); return false;" >Remove</a></td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

ProdutoController

package br.com.caelum.online.loja.controlador;

import java.util.List;

import br.com.caelum.online.loja.dominio.Produto;
import br.com.caelum.online.loja.repositorio.RepositorioDeProdutos;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Validations;
import br.com.caelum.vraptor.view.Results;

@Resource
public class ProdutoController {

    private final RepositorioDeProdutos produtos;
    private Result result;
    private Validator validator;

    public ProdutoController(RepositorioDeProdutos produtos, Result result, Validator validator) {
        this.produtos = produtos;
        this.result = result;
        this.validator = validator;
    }

    public List<Produto> lista(){
        return produtos.pegaTodos();
    }

    @Path("/produto/{id}")
    public Produto exibe(Long id){
        return produtos.pegaPorId(id);
    }

    @Path("/produto/{id}/xml")
    public void exibeComoXml(Long id){
        Produto produto = produtos.pegaPorId(id);
        result.use(Results.xml()).from(produto).serialize();
    }

    @Path("/produto/{id}/json")
    public void exibeComoJson(Long id){
        Produto produto = produtos.pegaPorId(id);
        result.use(Results.json()).from(produto).serialize();
    }


    public void formulario(){}

    @Post
    public void adiciona(final Produto produto){

        validator.checking(new Validations(){
            {
                that(produto.getPreco() > 0.1, "preco", "produto.preco.invalido");
                that(produto.getDescricao() != null && produto.getDescricao().length() >0, "descricao", "produto.descricao.invalido");
                that(produto.getNome() != null && produto.getNome().length() >=3 && produto.getNome().length() <=100, "nome","produto.nome.invalido");        
            }
        });

        validator.onErrorUsePageOf(ProdutoController.class).formulario();

        produtos.salva(produto);
        result.include("mensagem", "Produto adicionado com sucesso!");
        result.redirectTo(ProdutoController.class).lista();
    }

    public void remove(Produto produto){
        produtos.remove(produto);
        result.nothing();
    }

}

Existe uma falha na explicação por vídeo, siga o tutorial por texto.

Segui e mesmo assim não excluiu. Fiz o mesmo exercício pelo curso VRaptor 4 e funcionou, não sei o que está errado. Gostaria de saber o que está de errado para entender.

Oi José,

Que falha há no vídeo?

Chryss,

Abra o console do seu browser e veja se aparece algum erro de javascript!

Chryss/Maurício, vocês tem skype? Se sim, me adicionem: jhenriquefelix.itel

Oi José,

Não uso skype! :/

Vc pode me enviar por e-mail!

solução!

Maurício,

Estou tentando subir o servidor, mas não estou conseguindo. Estava no vraptor 4, este é do vraptor 3, não sei se e isso. Mas vou verificar e qq problema retorno! Desde já obrigada!

O problem está no nome da função JavaScript, ela não pode ser igual ao nome do método do ProdutoController. Troquei de remove para remover, e funcionou:

<script type="text/javascript">
    function remover(id){
        $.get('remove?produto.id=' + id ,function() {
            alert ('Produto removido com sucesso!');
        });
    }
</script>

Ajuste no onclick:

<td><a href="" onclick="remover(${produto.id}); return false;">Remove</a>
Tive os problemas citados neste tópico. 
O primeiro foi a questão do nome do método java script que realmente não funcionou usando remove(), tive que mudar para remover.
O segundo foi a chamada da biblioteca do jquery no contexto. Como a lista está dentro de produtos no texto do site está "<script type="text/javascript" src="js/jquery-1.6.1.min.js"></script>" ocorrendo que o nevegador tenta carregar do contexto vraptor-produtos/produto. Para sanar basta usar o jslt <script type="text/javascript" src="<c:url value="/js/jquery-1.6.1.min.js"/>"></script>

Tigo, eu tive o mesmo problema que você. Segui sua orientação e deu certo. Muito obrigado!