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