Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Como editar um produto

Bom dia

1) Tem como reaproveitar o formulario de cadastro de produto para atualizar um produto ?

2) Tem como usar o mesmo metodo que grava um produto atualizar ? Ou para atualizar precisa de um outro metodo no controller ?

3) Minha dificuldade está em jogar na tela os atributos do objeto 'Produto'.

Lista de Produto - até aqui tranquilo, consigo passa o id para fazer uma nova busca do produto, (Queria mesmo é passar o objeto produto e o jogar para a tela de formulario de cadastro de produto, tem como fazer isso ?)

<c:forEach items="${produtos}" var="produto" varStatus="status">
        <tbody>
        <tr>
            <td>${produto.titulo}</td>
            <td>${produto.descricao}</td>
            <td>${produto.paginas}</td>
            <td>
                <a href="<c:url value='produtos/editar/${produtos[status.index]}' />" >
                    <input type="hidden" name="${produtos[status.index].id}" value="<c:url value='produtos/editar/${produtos[status.index].titulo}' />">
                    <img alt="Editar" src="<c:url value='/resources/icon/ic_mode_edit_black_24dp_1x.png' />">
                </a>
                 <a href="<c:url value='produtos/remover/${produtos[status.index].id}' />" >
                    <img alt="Remover" src="<c:url value='/resources/icon/ic_delete_black_24dp_1x.png' />">
                </a>
            </td>
        </tbody>
        </c:forEach>

Metodo editar no controller de produto

@RequestMapping(value="editar/produto")
    public ModelAndView editar(@PathVariable("produto")Produto produto) {
        return new ModelAndView("redirect:/produtos/form");
    }
1 resposta
solução!

Oi Renato,

Tem como sim!

O seu link para editar o registro deve apenas levar como parametro o id do produto que foi clicado:

<a href="<c:url value='produtos/editar/${produto.id}' />" >
/>">
    <img alt="Editar" src="<c:url value='/resources/icon/ic_mode_edit_black_24dp_1x.png'/>">
</a>

E no metodo editar do controller você recupera esse id, carrega os dados do produto no BD e retornar para o formulário de cadastro:

@RequestMapping(value="produtos/editar/{id}")
public ModelAndView editar(@PathVariable("id") Long id) {
    Produto selecionado = dao.buscarPorId(id);

    ModelAndView mv =  new ModelAndView("produtos/form");
    mv.addObject("produto", selecionado);

    return mv;
}

Obs: não pode ser um redirect, se não vai perder os dados do produto carregado.

Repare que no metodo editar do controller eu adicionei no ModelAndView um parametro chamado produto, que representa o produto selecionado para edição. Agora no seu formulário de cadastro você consegue jogar nos inputs as informações do produto:

<form method="post" action="<c:url value='produtos/cadastrar'/>">
    <input name="nome" value="${produto.nome}">
    <input name="preco" value="${produto.preco}">
    // outros campos...
</form>

Além disso, vai precisar adicionar um input=hidden no formulário contendo o id do produto, para na lógica do controller saber qual o produto estava sendo editado para fazer o update certinho:

<form method="post" action="<c:url value='produtos/cadastrar'/>">
    <input type="hidden" name="id" value="${produto.id}"/>

    <input name="nome" value="${produto.nome}">
    <input name="preco" value="${produto.preco}">
    // outros campos...
</form>

E na sua lógica de cadastrar no controller, basta fazer um if/else para saber se esta criando um novo produto ou editando:

@RequestMapping(value="produtos/cadastrar")
public ModelAndView cadastrar(Produto produto) {
    //se nao tem id, significa que é cadastro de um novo produto
    if (produto.getId() == null) {
        dao.salvar(produto);
    } else {
        dao.atualizar(produto);
    }
    return  new ModelAndView("redirect:produtos/listar");
}

Bons estudos!