Vraptor3 + JSTL + Hibernate

15 respostas
C

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.

15 Respostas

Guevara

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.

C

Guevara:
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.

Guevara

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 }" />
C

Guevara:
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>
Guevara

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.

C

Guevara:
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.

Guevara

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.

C
Guevara:
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.

Obrigado deu certo, agora tenho outra duvida como manter os valores desta lista após a validação:

[code]








G

Você redireciona para onde quando dá o erro de validação?

C

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

E qual é a dificuldade? O que você não está conseguindo?

C

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

Guevara

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

C

Guevara:
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?

Guevara

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.

Criado 26 de setembro de 2010
Ultima resposta 28 de set. de 2010
Respostas 15
Participantes 3