Olá pessoal
Estou com um probleminha, ao validar um pagina usando hibernate validator, com retorno dos erros é perdido todos os <c:foreach list > da pagina.
Vraptor3 + JSTL + Hibernate
15 Respostas
Não entendi Cleison, se está lá na JSP:
<c:forEach var="error" items="${errors}">
<li>${error.message}</li>
</c:forEach>
Vai mostrar o erro que vêm da validação.
Não entendi Cleison, se está lá na JSP:<c:forEach var="error" items="${errors}"> <li>${error.message}</li> </c:forEach>Vai mostrar o erro que vêm da validação.
Esqueci de informa, ele retorna os erros dento do <c:forEach var=“error” items="${errors}">, só que na pagina tem outas listas de dados usando <c:forech, mas estas lista não retornam.
Deixa ver se entendi, após a validação os dados não retornam pros seus campos? Se for isso coloque o value no input:
Exemplo:
<input name="cliente.nome" type="text" value="${cliente.nome }" />
Deixa ver se entendi, após a validação os dados não retornam pros seus campos? Se for isso coloque o value no input:
Exemplo:<input name="cliente.nome" type="text" value="${cliente.nome }" />
Não não, por exemplo: está lista é carregada junto com a pagina, após a validação ela não carrega e não aparece nada.
<select name="produto.codSetorCusto" id="codSetorCusto" class="ui-widget-content">
<c:forEach items="${setorCustoList}" var="setorCusto">
<option value="${setorCusto.codSetor }">${setorCusto.descricao}</option>
</c:forEach>
</select>
Entendi, mas como vc carrega esse combobox, experimenta assim:
<select name="produto.codSetorCusto" id="codSetorCusto" class="ui-widget-content">
<option value="${produto.codSetorCustos}">${produto.setorCusto.descricao}</option>
<c:forEach var="setorCusto" items="${setorCustos}">
<option <c:if test="${produto.setorCusto.codSetor == setorCusto.codSetor}"> selected="selected"</c:if>
value="${setorCusto.codSetor}">${setorCusto.descricao}</option>
</c:forEach>
</select>
E lá no seu Controller vc manda a lista de setorCusto:
result.include("setorCustos", setorCustoDAO.lista());
Isso se vc possui cadastro de setor custo separado, ai vc pode fazer dessa forma, mandando popular o combo com essa lista mandada pelo Controller.
Entendi, mas como vc carrega esse combobox, experimenta assim:<select name="produto.codSetorCusto" id="codSetorCusto" class="ui-widget-content"> <option value="${produto.codSetorCustos}">${produto.setorCusto.descricao}</option> <c:forEach var="setorCusto" items="${setorCustos}"> <option <c:if test="${produto.setorCusto.codSetor == setorCusto.codSetor}"> selected="selected"</c:if> value="${setorCusto.codSetor}">${setorCusto.descricao}</option> </c:forEach> </select>E lá no seu Controller vc manda a lista de setorCusto:
result.include("setorCustos", setorCustoDAO.lista());Isso se vc possui cadastro de setor custo separado, ai vc pode fazer dessa forma, mandando popular o combo com essa lista mandada pelo Controller.
Não funcionou erro na linha ${produto.setorCusto.descricao}
não entendi porque usar está linha.
Ops, errei ai nessa linha, coloca assim:
<option value="${produto.setorCusto.codigo}">${produto.setorCusto.descricao}</option>
Onde está produto.setorCusto.codigo vc coloca o atributo referente a código que vc possui na classe Produto, se for codProduto, vc coloca:
<option value="${produto.setorCusto.codProduto}">${produto.setorCusto.descricao}</option>
A linha que passei é para o combo retornar preenchido com o que o usuário escolheu após a validação, sem essa linha, ao validar o form, o combo voltaria em branco, ai o usuário teria que selecionar a opção de novo.
Ops, errei ai nessa linha, coloca assim:Onde está produto.setorCusto.codigo vc coloca o atributo referente a código que vc possui na classe Produto, se for codProduto, vc coloca:<option value="${produto.setorCusto.codigo}">${produto.setorCusto.descricao}</option>A linha que passei é para o combo retornar preenchido com o que o usuário escolheu após a validação, sem essa linha, ao validar o form, o combo voltaria em branco, ai o usuário teria que selecionar a opção de novo.<option value="${produto.setorCusto.codProduto}">${produto.setorCusto.descricao}</option>
Obrigado deu certo, agora tenho outra duvida como manter os valores desta lista após a validação:
[code]
Você redireciona para onde quando dá o erro de validação?
Garcia conseguir resolver essas situações acima
Estou com outro probleminha
Tenho um relacionamento entre dois obejtos Produto e TipoProduto
Produto
@ManyToOne
private TipoProduto tipoProduto;
TipoProduto
@OneToMany(mappedBy = "tipoProduto")
private List<Produto> produto;
Estou com dificuldade de popular o combo
Cadadstro de produto
<td >TIPO DE PRODUTO:</td>
<td>
<select name="DUVIDA" id="tipoProd" class="ui-widget-content" onchange="verificaCombo(this);">
<c:forEach items="${tipoProdutoList}" var="tipoProd">
<option value="${tipoProd.codTipoProd}" <c:if test="${DUVIDA == tipoProd.codTipoProd }">Selected="true"</c:if>>${tipoProd.descricao }</option>
</c:forEach>
</select>
</td>
E qual é a dificuldade? O que você não está conseguindo?
Como devo colocar no nome do input para que o vraptor entenda que sera gravado no campo do relacionamento entre os objetos Produto e tipoProduto
Tente assim:
<td >TIPO DE PRODUTO:</td>
<td>
<select name="produto.tipoProduto.codTipoProd" id="tipoProd" class="ui-widget-content" onchange="verificaCombo(this);">
<c:forEach items="${tipoProdutos}" var="tipoProduto">
<option value="${tipoProduto.codTipoProd}" <c:if test="${produto.tipoProduto.codTipoProd == tipoProd.codTipoProd }">Selected="true"</c:if>>${tipoProd.descricao }</option>
</c:forEach>
</select>
</td>
Copie pelo outro combo que eu tinha mandado, é só fazer o mesmo esquema Classe>>Classe Relacionada>>atributo da classe relacionada, então fica, Produto>>tipoProduto>>codTipoProduto. Lá no seu result.include no Controller coloque “tipoProdutos”, pois coloquei o items=“tipoProdutos” ali no select.
[]s
Tente assim:<td >TIPO DE PRODUTO:</td> <td> <select name="produto.tipoProduto.codTipoProd" id="tipoProd" class="ui-widget-content" onchange="verificaCombo(this);"> <c:forEach items="${tipoProdutos}" var="tipoProduto"> <option value="${tipoProduto.codTipoProd}" <c:if test="${produto.tipoProduto.codTipoProd == tipoProd.codTipoProd }">Selected="true"</c:if>>${tipoProd.descricao }</option> </c:forEach> </select> </td>Copie pelo outro combo que eu tinha mandado, é só fazer o mesmo esquema Classe>>Classe Relacionada>>atributo da classe relacionada, então fica, Produto>>tipoProduto>>codTipoProduto. Lá no seu result.include no Controller coloque “tipoProdutos”, pois coloquei o items=“tipoProdutos” ali no select.
[]s
O valor do tipoProduto será armazenado em Produto ou TipoProduto?
O código do tipo de produto sera armazenada na tabela Produto. Então o produto saberá qual é o seu tipo, graças a chave extrangeira de tipoProduto na tabela Produto.