[Resolvido] Manter dados no form após erro na validação - VRaptor 3

35 respostas
Guevara

Oi pessoal!
Fui lá na receita mas não achei a resposta.
http://vraptor.caelum.com.br/documentacao/validacao/

Como faço pra manter os dados digitados no form após erro na validação? Dei uma pesquisada no fórum e tb não achei a dica.
Tentei com validator.onErrorUse(Results.page()) e não deu boa.
Abraço!

35 Respostas

yorgan

Coloque os dados submetidos no result e utilize o parametro value de cada campo para preenche-los.

[]'s
Daniel

aluisiodsv

Ao realizar a validação, os dados do formulário se perdem por estar em um escopo de requisição.

Este escopo é pequeno, e garante os dados apenas de uma requisição para outra.

Ao validar os dados vc está fazendo uma requisição no servidor, e ao fazer outra requisição para voltar ao fomulário com a mensagem de validação estes dados se perderam.

O correto é repassar estes dados de uma requisição para outra.

Guevara

Obrigado pessoal!
É só redirecionar com validator.onErrorUse(Results.page() e colocar os values nos .
Abraço!

Guevara

Ops!
Os inputs voltam, mas os combobox não:

<label>Categoria</label>	
			<select name="imovel.categoria.codCategoria">
				<option value="${imovel.categoria.tipoCategoria}" selected="selected"></option>					
				<c:forEach var="categoria" items="${categoria}">		
				<option value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>  
				</c:forEach>
			</select>

Tá voltando vazio, sabem o que pode ser?

Lucas_Cavalcanti

pro select vc tem que fazer diferente…

vc tem que colocar o selected=“selected” na option que corresponde ao valor do cara da requisição…

Guevara

Oi Lucas!!
Não entendi onde fica o selected, coloquei na option de baixo, mas ai ele mostra automáticamente “Apartamento” quando chamo o form. Só tenho duas options aqui:
Assim vêm em branco:

<label for="categoria">Categoria</label>			
			<select id="categoria" name="imovel.categoria.codCategoria">
			<option selected="selected" value="${imovel.categoria.codCategoria}"></option>					
			<c:forEach var="categoria" items="${categoria}">	
			<option value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>  
			</c:forEach>
			</select>

Assim ele vêm populado quando chamo o form:

<label for="categoria">Categoria</label>			
			<select id="categoria" name="imovel.categoria.codCategoria">
			<option value="${imovel.categoria.codCategoria}"></option>					
			<c:forEach var="categoria" items="${categoria}">	
			<option selected="selected" value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>  
			</c:forEach>
			</select>

Valeu!!

Lucas_Cavalcanti

algo assim:

<c:forEach var="categoria" items="${categoria}">    
    <option ${categoria.codCategoria eq imovel.categoria.codCategoria ? 'selected="selected"': ''}
     
value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>    
</c:forEach>
Guevara

Não entendi Lucas, é pra fazer uma comparação alí no option??

Lucas_Cavalcanti

isso

Guevara

Opa!
Lucas, mandei um <c:if test> lá e não aceita não, só dá erro ao abrir a jsp. O.o
Têm outro jeito de comparar isso dentro do option?
Abraço!!!

Lucas_Cavalcanti

bom, o que eu te mandei já era o if :wink: (com operador ternário)

mas vc pode fazer isso tb:

<option <c:if test="${categoria.codCategoria eq imovel.categoria.codCategoria}">selected="selected"</c:if>  
value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>
Guevara

Estranho, agora o combo vêm preenchido com “Apartamento”, mesmo após a validação. =/

<label for="categoria">Categoria</label>						
			<select id="categoria" name="imovel.categoria.codCategoria">
			<option value="${imovel.categoria.codCategoria}"></option>	
			<c:forEach var="categoria" items="${categoria}">								
			<option selected="selected" <c:if test="${imovel.categoria.codCategoria eq categoria.codCategoria}"></c:if>	 value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>				
			</c:forEach>
			</select>

Onde é que tu tô errando?? :smiley:

Lucas_Cavalcanti

tire a primeira option:

<option value="${imovel.categoria.codCategoria}"></option>
Guevara

Removi essa linha, mas continua o mesmo comportamento.

<label for="categoria">Categoria</label>						
			<select id="categoria" name="imovel.categoria.codCategoria">
			<c:forEach var="categoria" items="${categoria}">										
			<option selected="selected" <c:if test="${imovel.categoria.codCategoria eq categoria.codCategoria}"></c:if> value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>				
			</c:forEach>
			</select>

Será que devo usar o <c:choose>?

Lucas_Cavalcanti

o que vc quer que aconteça?

Guevara

Eu queria que o item selecionado voltasse a ser selecionado da mesma forma que os inputs após erro na validação de algum outro input. Vamos supor que o usuário preenche td, ai esquece da data de inclusão e manda o submit, ai os combos voltariam com o item selecionado antes do submit. É possível isso ou é só com os inputs que o negócio funciona?
Abraço!!

Lucas_Cavalcanti

qual é o html gerado pelo jsp no select? (pega pelo código fonte da página no browser)

Guevara

Oi Lucas!
Deixei o código assim:

<select id="categoria" name="imovel.categoria.codCategoria">
				<option selected="selected" value="${imovel.categoria.codCategoria}">${imovel.categoria.tipoCategoria}</option>
				<c:forEach var="categoria" items="${categoria}">	
				<c:if test="${imovel.categoria.codCategoria eq categoria.codCategoria}"></c:if>							
				<option value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>				
				</c:forEach>
			</select>

A visualização do código fonte HTML é esta após o submit e retorno da validação:

<select id="categoria" name="imovel.categoria.codCategoria">

				<option selected="selected" value="4"></option>
					
											
				<option value="2">Sítio</option>				
					
											
				<option value="4">Sala Comercial</option>				
					
											
				<option value="3">Lote</option>				
					
											
				<option value="1">Fazenda</option>				
					
											
				<option value="5">Cobertura</option>				
					
											
				<option value="6">Casa</option>				
					
											
				<option value="7">Apartamento</option>				
				
			</select>

Era pra ele mostrar no combo o nome da categoria, já que o código foi capturado, mas não está mostrando, tentei com:

<option selected="selected" value="${imovel.categoria.codCategoria}">${categoria.tipoCategoria}

Mas dá erro na JSP nessa linha.

Lucas_Cavalcanti

tenta isso:

<option selected="selected" value="${imovel.categoria.codCategoria}">${imovel.categoria.tipoCategoria}</option>

mas a opção atual vai ficar repetida, tem problema?

Guevara

Já estou usando assim, ao voltar da validação o combo não vêm com o item selecionado anteriormente, apesar de vir populado. Mas acho que vou deixar assim mesmo, o usuário terá que selecionar as opções novamente no combobox. Quando descobrir uma forma de resolver isso eu posto aqui.
Valeu pelo força Lucas!
Abraço!

Lucas_Cavalcanti

tem certeza? o q vc postou aqui tava diferente…

Guevara
<select id="categoria" name="imovel.categoria.codCategoria">
				<option selected="selected" value="${imovel.categoria.codCategoria}">${imovel.categoria.tipoCategoria}</option>
				<c:forEach var="categoria" items="${categoria}">	
				<c:if test="${imovel.categoria.codCategoria eq categoria.codCategoria}"></c:if>							
				<option value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>				
				</c:forEach>
			</select>

As duas options estão iguais sim. =)

Lucas_Cavalcanti

maldita dislexia :stuck_out_tongue:

tenta imprimir o ${imovel.categoria.tipoCategoria} e o ${imovel.categoria.codCategoria} em algum outro lugar e ver se tem alguma coisa neles

Guevara

Testei digitando os dados em inputs, e os valores voltam normalmente após erro na validação:

O problema é com o combobox mesmo… =/

Lucas_Cavalcanti

qual opção tá ficando selecionada?

vc tem algum javascript mexendo nos selects?

Guevara

Não tenho javascript neste form não. Vou tentar aqui com o <c:choose> pra ver no que dá e já posto o resultado…

Guevara

Deu na mesma, preenche o form de cara e não retorna o item após a validação:

<select id="categoria" name="imovel.categoria.codCategoria">
				<c:forEach var="categoria" items="${categoria}">	
				<c:choose>				
				<c:when test="${imovel.categoria.codCategoria eq categoria.codCategoria}">  
					<option selected="selected" value="${imovel.categoria.codCategoria}">${imovel.categoria.tipoCategoria}</option>
				</c:when>	
				<c:otherwise>
					<option selected="selected" value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>		 
				</c:otherwise>				
				</c:choose> 
				</c:forEach>				
			</select>

O estranho é que aquela comparação no when está sendo verdadeira mesmo ${imovel.categoria.codCategoria estar vazio, já que não existe nenhum item selecionado manualmente.

Lucas_Cavalcanti

não devia ter o selected=“selected” no c:otherwise

Guevara

Removi o selected do otherwise, mesmo assim vêm preenchido e o comportamento continua o mesmo. Testei com outro combobox que não é populado pelo banco, e ao passar pela validação o combo volta sem item selecionado, acho que é assim mesmo, só com javascript pra fazer o item voltar selecionado.
Abraço!

Lagaffe

Guevara,

Comigo funciona. Olhando rápidamente o seu código deveria funcionar.

O meu código é um pouco diferente, uma das diferenças é que eu uso selected=“true”, mesmo que o correto pelo que li nas especificações seja “selected”

Tente mudar para ver se faz diferença.

Lagaffe

Ou tente:

<label for="categoria">Categoria</label>                          
             <select id="categoria" name="imovel.categoria.codCategoria">  
               <c:forEach var="categoria" items="${categoria}">                                        
                 <option <c:if test="${imovel.categoria.codCategoria == categoria.codCategoria}"> selected="selected"</c:if> 
                  value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>                 
               </c:forEach>  
            </select>
Lucas_Cavalcanti

tenta trocar o selected por checked=“checked”

Guevara

ahhhhh!! :?
Todo esse problema causado por causa de um operador! Era pra usar == ao invés de “eq”, o que é lógico já que está comparando número. Tinha esquecido que o “eq” não consegue fazer essa comparação. "/
Quando bati o olho no código do lagaffe, caiu a ficha.

Valeu Lucas! Valeu lagaffe. Agora sim, tá resolvido! :smiley:
Ficou assim o código:

<select id="categoria" name="imovel.categoria.codCategoria"> 
			 <option value="${imovel.categoria.codCategoria}">${imovel.categoria.tipoCategoria}</option> 
               <c:forEach var="categoria" items="${categoria}">                                        
                 <option <c:if test="${imovel.categoria.codCategoria == categoria.codCategoria}"> selected="selected"</c:if> 
                  value="${categoria.codCategoria}">${categoria.tipoCategoria}</option>                 
               </c:forEach>  
            </select>

Abraço!!

softwork

Bom dia amigo Guevara.

Não sei se lhe interessa mas vou colocar aqui um código que fiz para facilitar a minha vida com SELECT´s em meus JSP´s.

Segue o código (arquivo select.tag):

&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%&gt;

&lt;%@ attribute name="name"           required="true"%&gt;
&lt;%@ attribute name="index"          required="true"%&gt;
&lt;%@ attribute name="attribute"      required="true"%&gt;
&lt;%@ attribute name="collection"     type="java.util.Collection" required="true"%&gt;
&lt;%@ attribute name="selected"       required="false"%&gt;
&lt;%@ attribute name="required"       required="false"%&gt;
&lt;%@ attribute name="disable"        required="false"%&gt;
&lt;%@ attribute name="onchange"       required="false"%&gt;
&lt;%@ attribute name="onfocus"        required="false"%&gt;
&lt;%@ attribute name="onblur"         required="false"%&gt;

&lt;select name="${name}" id="${name}" ${not empty disable && disable eq true ? '"disabled"' : ''} onchange="${onchange}" onfocus="${onfocus}" onblur="${onblur}"&gt;
    &lt;c:choose&gt;
        &lt;c:when test="${collection != null}"&gt;
            &lt;c:if test="${not required}"&gt;
                &lt;option value="-1" selected&gt;Selecione...&lt;/option&gt;
            &lt;/c:if&gt;
            &lt;c:forEach var="item" items="${collection}"&gt;
                &lt;option value="${item.index}" ${not empty selected && (item.index eq selected || item.index == selected) ? 'selected="selected"' : ''}&gt;
                    &lt;c:forTokens items="${attribute}" delims="," var="attr"&gt;
                        ${item[attr]}
                    &lt;/c:forTokens&gt;
                &lt;/option&gt;
            &lt;/c:forEach&gt;
        &lt;/c:when&gt;
        &lt;c:otherwise&gt;
            &lt;option&gt;ATENÇÃO: Conteúdo indisponível na lista, por favor verificar...&lt;/option&gt;
        &lt;/c:otherwise&gt;
    &lt;/c:choose&gt;
&lt;/select&gt;

<br/>

Você irá utilizá-la em seus JSP´s desta maneira:

&lt;%@ taglib tagdir="/WEB-INF/tags" prefix="t"%&gt;
...
...
...
&lt;t:select name="imovel.categoria.codCategoria" index="codCategoria" attribute="tipoCategoria" collection="${categoria}" required="false"/&gt;

NOTA: A opção attribute poderá receber dois ou mais atributos da sua classe, afim de apresentá-los simultaneamente; veja exemplo:

&lt;t:select name="imovel.categoria.codCategoria" index="codCategoria" attribute="codCategoria,tipoCategoria" collection="${categoria}" required="false"/&gt;

Para o código funcionar direitinho você deverá utilizar a biblioteca padrão de tags JSP (JSTL - Java Server Pages Standard Tag Library), sendo assim deverá colocar no classpath as libs: standard-1.1.2.jar e jstl-1.1.2.jar em anexo.

Se desejar, existe maiores informações aqui.

A ideia é criar tag´s que facilitem o dia a dia!

Espero ter contribuído de alguma forma.

Boa sorte.

Guevara

Maravilha softwork!
Bem legal essa tag, já baixei os arquivos, assim que puder eu testo aqui. Vou tentar fazer uma tag para mapas do google seguindo essa dica ai.
Abraço!

Criado 26 de agosto de 2010
Ultima resposta 1 de set. de 2010
Respostas 35
Participantes 6