Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Validação: manter dados na tela de edição após erro

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();
    }


}
2 respostas
solução!

Oi Ricardo,

Não tem mágica! :/

Vc precisa fazer isso na mão, mandando pra view os dados que o usuário digitou na requisição, e preenchendo os input boxes de novo!

aquilo que não tem remédio remediado está!! rsrs, Obrigado!