6
respostas

Como seria um metodo pra deletar e alterar , com um botao na pagina lista?

Olá gostaria de saber como seria o código para excluir e alterar um produto no banco de dados por meio de um botoes na lista de produtos, já tentei de tudo e não consegui implementar.

Atenciosamente

Leonardo

6 respostas

Oi Leonardo, acho que a primeira coisa é você postar aqui para a gente a sua tentativa :). Teoricamente, cada um dos botões apontaria para um link com o id do produto que deve ser deletado e editado. E aí métodos diferentes no controller seriam acionados.

Então alberto não sei o que passar no @RequestMapping, e como referenciar na lista.jsp

ProdutosController

@RequestMapping(value="", method=RequestMethod.POST)
    public String excluir(Produto produto) {
        produtoDao.excluir(produto);
        return "produtos";
    }

ProdutoDAO

    public void excluir(Produto produto){
        manager.remove(produto);
    }

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"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Livros de Java, Android, iPhone, Ruby, PHP e muito mais - Livraria do Programador</title>
<c:url value="/resources/css" var="cssPath" />
<link rel="stylesheet" href="${cssPath}/bootstrap.min.css">
<link rel="stylesheet" href="${cssPath}/bootstrap-theme.min.css">
<style type="text/css">
body{padding-top: 60px 0px;}
</style>
</head>
<body>
    <nav class="navbar navbar-inverse">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="${s:mvcUrl('HC#index').build()}">Livraria do Programador</a>
        </div>
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
          <ul class="nav navbar-nav">
              <li><a href="${s:mvcUrl('PC#form').build()}">Cadastro de Produtos</a></li>
            <li><a href="${s:mvcUrl('PC#listar').build()}">Lista de Produtos</a></li>
        </ul>
        </div><!-- /.navbar-collapse -->
      </div>
    </nav>
    <div class="container">
    <h1>Lista de Produtos</h1>
    <p> ${message} </p>
    <table class="table table-bordered table-striped table-hover">
        <tr>
            <th>Título</th>
            <th>Descrição</th>
            <th>Páginas</th>            
            <th>Ação</th>            
        </tr>

        <c:forEach items="${produtos}" var="produto">
            <tr>
                <td>
                    <a href="${s:mvcUrl('PC#detalhe').arg(0, produto.id).build()}">${produto.titulo}</a>
                </td>
                <td>${produto.descricao}</td>
                <td>${produto.paginas}</td>
                <td>
                <form action="${s:mvcUrl('PC#excluir').build() }" method="post">
                <button type="submit" >excluir</button>
                </form>            
                </td>
            </tr>
        </c:forEach>
    </table>
    </div>
</body>
</html>

O Path variable representa estes ids que vem da requisição

    @RequestMapping("{codigo}")
    public ModelAndView edicao(@PathVariable("codigo") Objeto objeto) {
    //...
    }

    @RequestMapping(value="{codigo}", method = RequestMethod.DELETE)
    public String excluir(@PathVariable Long codigo, RedirectAttributes attributes) {
        //...
    }

No caso do editar, um link comum resolve, já no caso do delete, como os navegadores só implementam get e post, vc precisa passar um campo hidden com o method

<td>
<form action='/remover'" method="POST">
            <input type="hidden" name="_method" value="DELETE"/>
<input type="submit" value="remover"/>
</form>
</td>

depois para ajustar a aparência vc pode ciar o botão com aparência de links, ou os links em forma de botão, como uso bootstrap eu coloco tudo com aparência de botão.

Olá, peço desculpas pela demora

Consegui fazer o remover, ao clicar no link remover o produto é removido do banco de dados. Segue o que eu fiz: Metodo da classe ProdutosController

@RequestMapping(method = RequestMethod.GET, value = "remover/{id}")
    public String remover(@PathVariable("id") Integer id) {
        produtoDao.remover(id);
        return "redirect:/produtos";
    }

classe ProdutoDAO

public void remover(Integer id) {
        manager.remove(findById(id));
    }

link com a pagina de listagem lista.jsp

<c:forEach items="${produtos }" var="produto">
            <tr>
                <td>
                    <a href="${s:mvcUrl('PC#detalhe').arg(0,produto.id).build() }">${produto.titulo }</a>
                </td>
                <td>${produto.descricao }</td>
                <td>${produto.precos }</td>
                <td>${produto.paginas }</td>
                <td>        
<a href="<c:url value='produtos/remover'/>/${produto.id}">Remover</a>
                </td>  
            </tr>
        </c:forEach>

Porém continuo com dificuldade com o Editar, nao sei como fazer para redirecionar exibindo os dados do produto no form de cadastro

Segue os códigos:

classe ProdutosController

@RequestMapping(method = RequestMethod.POST, value = "produtos/{id}/form")
    public ModelAndView atualizar(@PathVariable("id") Integer id, @Valid Produto produto, BindingResult result) {
        if (result.hasErrors()) {
            return form(produto);
        }
        produtoDao.atualizar(produto);
        return new ModelAndView("redirect:produtos/form-update");
    }

classe ProdutoDAO

public void atualizar(Produto produto) {
        manager.merge(produto);
    }

link na listagem de produtos lista.jsp

<c:forEach items="${produtos }" var="produto">
            <tr>
                <td>
                    <a href="${s:mvcUrl('PC#detalhe').arg(0,produto.id).build() }">${produto.titulo }</a>
                </td>
                <td>${produto.descricao }</td>
                <td>${produto.precos }</td>
                <td>${produto.paginas }</td>
                <td>        
                <a href="<c:url value='produtos/${produto.id}/form'/>">Alterar</a>
                <a href="<c:url value='produtos/remover'/>/${produto.id}">Remover</a>
                </td>  
            </tr>
        </c:forEach>
    </table>

E a página form-update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Livro de Java, Android, iPhone, Ruby, PHP e muito mais - Livraria do Programador</title>

<c:url value="/resources/css" var="cssPath" />
<link rel="stylesheet" href="${cssPath }/bootstrap.min.css">
<link rel="stylesheet" href="${cssPath }/bootstrap-theme.min.css">

<style type="text/css">
    body {
        padding: 60px 0px;
    }
</style>

</head>
<body>

    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="${s:mvcUrl('HC#index').build() }">Livraria do Programador</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
            <li><a href="${s:mvcUrl('PC#listar').build() }">Lista de Produtos</a></li>
            <li><a href="${s:mvcUrl('PC#form').build() }">Cadastro de Produtos</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>

    <div class="container">

    <h1>atualizar produto</h1>

    <form:form action="${s:mvcUrl('PC#atualizar').build() }" method="PUT"
            commandName="produto" enctype="multipart/form-data">
        <div class="form-group">
            <label>Titulo</label>
            <form:input path="titulo" cssClass="form-control" />
            <form:errors path="titulo" />
        </div>
        <div class="form-group">
            <label>Descição</label>
            <form:textarea path="descricao" cssClass="form-control" />
            <form:errors path="descricao" />
        </div>
        <div class="form-group">
            <label>Páginas</label>
            <form:input path="paginas" cssClass="form-control"/>
            <form:errors path="paginas" />
        </div>
        <div class="form-group">
            <label>Data de Lançamento</label>
            <form:input path="dataLancamento" cssClass="form-control"/>
            <form:errors path="dataLancamento"/>
        </div>
        <c:forEach items="${tipos }" var="tipoPreco" varStatus="status">
            <div class="form-group">
                <label>${tipoPreco }</label>
                <form:input path="precos[${status.index }].valor" cssClass="form-control" />
                <form:hidden path="precos[${status.index }].tipo" value="${tipoPreco }" />
            </div>
        </c:forEach>
        <button type="submit" class="btn btn-primary">Atualizar</button>
    </form:form>

    </div>

</body>
</html>