Olá No cadastro de produtos feito no curso eu adicionei a categoria a qual o produto pertence, essa categoria ele escolhe em um select dentro do formulário de inclusão ou alteração.
Na tela de inclusão(formulario.jsp) eu utilizava o método validator.onErrorUsePageOf(this).formulario(); mas ele não mantinha na tela a lista de categorias, então passei a utilizar validator.onErrorForwardTo(this).formulario(); e agora ele mantem a lista de categorias.
Como eu faço para manter as listas e outros objetos disponibilizados para a view na tela de edição? vou ter que buscar do banco de dados todas as coleções(no caso a de categorias) e o objeto inteiro que quero atualizar a cada erro de validação do usuário?
list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Lista de Produtos</title>
<link rel="stylesheet" type="text/css"
href="../bootstrap/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../base.css">
<style type="text/css">
.link {
text-decoration: underline;
border: none;
background: none;
color: blue;
cursor: pointer;
}
</style>
</head>
<body>
<h1>Listagem de Produtos do ${usuarioLogado.usuario.nome}</h1>
<c:if test="${not empty mensagem}">
<div class="alert alert-success">${mensagem}</div>
</c:if>
<table class="table table-stripped table-bordered table-hover">
<thead>
<tr>
<th>Nome</th>
<th>Valor</th>
<th>Quantidade</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<c:forEach items="${produtoList}" var="produto">
<tr>
<td>${produto.nome}</td>
<td>${produto.valor}</td>
<td>${produto.quantidade}</td>
<td><a href="<c:url value="/produto/${produto.id}"/>">Editar</a></td>
<td>
<form action='<c:url value="/produto"/>' method="post">
<input name="produto.id" value="${produto.id}" type="hidden" />
<button class="link" type="submit" name="_method" value="DELETE">remover</button>
</form>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<a href="<c:url value='/produto/formulario'/>">Adicionar mais produtos!</a>
</body>
</html>
formulario.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<link rel="stylesheet" type="text/css"
href="../bootstrap/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../base.css">
</head>
<body>
<div class="container">
<h1>Adicionar Produtos</h1>
<c:if test="${not empty errors}">
<div class="alert alert-danger">
<c:forEach var="error" items="${errors}">
${error.category} - ${error.message}<br />
</c:forEach>
</div>
</c:if>
<form action="${linkTo[ProdutoController].adiciona()}" method="post">
Nome: <input class="form-control" type="text" name="produto.nome"
value="${produto.nome}" /> Valor: <input class="form-control"
type="text" name="produto.valor" value="${produto.valor}" />
Quantidade: <input class="form-control" type="text"
name="produto.quantidade" value="${produto.quantidade}" /> Categoria
<select id="produtos" name="produto.categoria.id"
class="form-control">
<c:forEach var="categoria" items="${categorias}">
<option value="${categoria.id}"
${produto.categoria.id eq categoria.id ? 'selected' : '' }>${categoria.nome}</option>
</c:forEach>
</select> <input type="submit" class="btn btn-primary" value="Adicionar" />
</form>
</div>
</body>
</html>
edita.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="../bootstrap/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../base.css">
</head>
<body>
<div class="container">
<h1>Alterar Produto</h1>
<c:if test="${not empty errors}">
<div class="alert alert-danger">
<c:forEach var="error" items="${errors}">
${error.category} - ${error.message}<br />
</c:forEach>
</div>
</c:if>
<form action="<c:url value="/produto/${produto.id}"/>" method="post">
<label for="nome">Nome:</label>
<input id="nome" type="text" name="produto.nome" class="form-control"
value="${produto.nome}"/>
<label for="valor">Valor:</label>
<input type="text" id="valor" name="produto.valor" class="form-control" value="${produto.valor}"/>
<label for="quantidade">Quantidade:</label>
<input id="quantidade" type="text" name="produto.quantidade" class="form-control"
value="${produto.quantidade}"/>
Categoria <select id="produtos" name="produto.categoria.id" class="form-control" >
<c:forEach var="categoria" items="${categorias}">
<option value="${categoria.id}" ${produto.categoria.id eq categoria.id ? 'selected' : '' } >${categoria.nome}</option>
</c:forEach>
</select>
<button type="submit" class="btn btn-primary" name="_method" value="PUT">Enviar</button>
</form>
</div>
</body>
</html>
Controller
@Controller
public class ProdutoController {
private final Result result;
private final ProdutoDao dao;
private final Validator validator;
private final CategoriaDao catDao;
@Deprecated
public ProdutoController() {
this(null,null,null,null);
}
@Inject
public ProdutoController(Result result, ProdutoDao dao,CategoriaDao catDao, Validator validator) {
this.result = result;
this.dao = dao;
this.validator = validator;
this.catDao = catDao;
}
@Get("/")
public void inicio() {}
@Get
public void formulario(){
result.include("categorias",catDao.lista());
}
@Get("/produto/{id}")
public void edita(Long id) {
result.include("categorias",catDao.lista());
result.include("produto",dao.carrega(id));
}
@Get
public List<Produto> lista() {
return dao.lista();
}
@Post
public void adiciona(@Valid Produto produto) {
validator.onErrorForwardTo(this).formulario();
dao.adiciona(produto);
result.include("mensagem", "Produto adicionado com sucesso!");
result.redirectTo(this).lista();
}
@Put("/produto/{produto.id}")
public void altera(@Valid Produto produto) {
//????????????
//validator.onErrorForwardTo(this).???;
dao.atualiza(produto);
result.redirectTo(this).lista();
}
@Delete
@Path("/produto")
public void remove(Produto produto){
Produto produtoToRemove = dao.busca(produto);
dao.remove(produtoToRemove);
result.redirectTo(this).lista();
}
}