Dúvida validação e manutenção de dados de um formulário

4 respostas
F

Estou criando uma aplicação Web para inscrição de candidatos para um concurso.
No formulário de inscrição, preciso incluir no request objetos que são usados para criar selects, como Estados, Cursos, etc..
Para isso, criei um controler FormularioControler, com o método load abaixo

public void load() {
		result.include("estados", estadoDAO.listAll());
		result.include("linhasPesquisa", linhaPesquisaDAO.listAll());
		result.include("ieses", instituicaoEnsinoDAO.listTodasComCursos());
		result.include("orientadores", orientadorDAO.listAll());
	}

criei também um jsp, chamado load.jsp, conforme o padrão de nomenclatura do VRaptor.

No action do form, é disparada uma ação do controller, que valida os dados de inscrição. Em caso de um erro, como o nome do usuário seja vazio, eu gostaria de redirecionar para o formulário de inscrição, com mensagens de erro, mas sem perder os dados já digitados pelo usuário. Acho que algo normal, e pela documentação do VRaptor, isso parece se algo já contemplado pelo FW. Então eu fiz o seguinte?

public void save(Candidato candidato){
		
		if ((candidato.getCpf() == null) || (candidato.getCpf().isEmpty())){
			validator.add(new ValidationMessage("nome.invalido", "erro"));
		}
		
		if (!Utilities.isCPF(candidato.getCpf())){
			validator.add(new ValidationMessage("cpf.invalido", "erro"));
		}
		

		result.include("candidato", candidato);
		validator.onErrorUsePageOf(FormularioController.class).load();			
		this.candidatoDAO.save(candidato);
	}

Na minha lógica, em caso de algum erro, o método load recarregaria também os valores dos selects, mas isso não está acontecendo. Ele traz os dados do candidato, mas os selects ficam vazios. Alguma dica do que eu estou fazendo errado?

Eu já testei uma solução que funciona, que seria colocar o trecho de código antes do redirecionamento em caso de erro:
result.include("estados", estadoDAO.listAll());
		result.include("linhasPesquisa", linhaPesquisaDAO.listAll());
		result.include("ieses", instituicaoEnsinoDAO.listTodasComCursos());
		result.include("orientadores", orientadorDAO.listAll());

Porém, não acho que este seja a solução correta, por replicar o código.

4 Respostas

Rafael_Guerreiro

Ao invés de “onErrorUsePageOf” usa o “onErrorForwardTo” ou o “onErrorRedirectTo”.

F

Obrigado, funcionou.
Só para completar. Ao retornar do erro, os campos de data retornam o valor java.util.GregorianCalendar[time=1360119600000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=, por conta da conversão para String.
Há alguma solução automática para isso, ou tenho que usar algum padrão do tipo TO.

Rafael_Guerreiro

Você pode usar uma tag que formata para você:

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!-- lembra de importar a tag  em cima -->
<fmt:formatDate value="${objeto.campoDeData}" pattern="dd/MM/yyyy" />
Rafael_Guerreiro

Só para você entender melhor as formas de redirecionamento do VRaptor (acho importante mas esqueci de comentar lá em cima.)

Quando você faz result.of(Controller.class).action() (ou o validator.onErrorUsePageOf(Controller.class).action()) o VRaptor NÃO vai executar o conteúdo dessa action e também NÃO vai
mostrar a url dessa action.
Ele só vai executar o método que você está e no final dele, ele vai te levar para a JSP daquele outro método (ele simplesmente não vai procurar pela jsp da action atual) e vai manter a
URL da action que disparou o UsePageOf.

Quando você faz result.forwardTo(Controller.class).action() (ou o validator.onErrorForwardToController.class).action()) o VRaptor VAI executar o conteúdo do método mas NÃO vai mostrar a url dessa action (parecido com o UsePageOf, mas ele vai executar o método)

Quando você faz result.redirectTo(Controller.class).action() (ou o validator.onErrorRedirectToController.class).action()) o VRaptor VAI executar o conteúdo da action e também VAI mudar a url para a url da action de destino.

Criado 15 de junho de 2012
Ultima resposta 15 de jun. de 2012
Respostas 4
Participantes 2