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

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software