Fases do JSF

Gostaria de ter acesso as menssagens de erro do hibernate <h:messages> antes delas serem renderizadas no html.

Tem como?

É atraves do PhaseListener ?

Obrigado.

cara…

acredito que vc poderia implementar isso com Listeners
De uma olhada neste pdf

http://ww1.ucmss.com/books/LFS/CSREA2006/ICM4132.pdf

tenta os metodos getMessages() e getMessages(String clientId) do FacesContext.

Você quer ter acesso para poder alterá-las?

Se forem as mensagens padrão vc pode fazer a seguinte forma:

Priemeiro crie um message bundle para sua aplicação, por exemplo mensagens.properties.

Nesso mensagens.properties vc vai “sobrescrever” as mensagens padrão do jsf desta forma:

javax.faces.component.UIInput.REQUIRED=Este campo é de preenchimento obrigatório javax.faces.validator.NOT_IN_RANGE=O valor especificado deve estar entre {0} e {1} javax.faces.validator.DoubleRangeValidator.MAXIMUM=Este campo aceita {0} como valor máximo javax.faces.validator.LongRangeValidator.MAXIMUM=Este campo aceita {0} como valor máximo javax.faces.validator.DoubleRangeValidator.MINIMUM=Este campo aceita {0} como valor mínimo javax.faces.validator.LongRangeValidator.MINIMUM=Este campo aceita {0} como valor mínimo javax.faces.validator.DoubleRangeValidator.TYPE=Este campo aceita apenas números javax.faces.validator.LongRangeValidator.TYPE=Este campo aceita apenas números javax.faces.validator.LengthValidator.MAXIMUM=Este campo aceita no máximo {0} caracteres javax.faces.validator.LengthValidator.MINIMUM=Este campo aceita no mínimo {0} caracteres

Feito isso vc precisa indicar no faces-config o message bundle da aplicação

<!-- Define o bundle da aplicação --> <application> <message-bundle>pacotes.da.aplicacao.mensagens</message-bundle> </application>

Pronto :smiley:

Falow!

[quote=poiati]Gostaria de ter acesso as menssagens de erro do hibernate <h:messages> antes delas serem renderizadas no html.

Tem como?

É atraves do PhaseListener ?

Obrigado.[/quote]

LifeCycle phases:

  1. restoreview
  2. apply request values
  3. process validators
  4. update models
  5. invoke application
  6. render response

Você pode colocar um listener after phase para o número 3, ai você pode pegar o iterator das mensagens usando context.getMessages, e também pode passar um clientID para acessar todas as mensagens de erro de validação que foram geradas para aquele componente.

Espero ter ajudado, até mais.

[quote=davidbuzatto]Você quer ter acesso para poder alterá-las?

Se forem as mensagens padrão vc pode fazer a seguinte forma:

Priemeiro crie um message bundle para sua aplicação, por exemplo mensagens.properties.

Nesso mensagens.properties vc vai “sobrescrever” as mensagens padrão do jsf desta forma:

javax.faces.component.UIInput.REQUIRED=Este campo é de preenchimento obrigatório javax.faces.validator.NOT_IN_RANGE=O valor especificado deve estar entre {0} e {1} javax.faces.validator.DoubleRangeValidator.MAXIMUM=Este campo aceita {0} como valor máximo javax.faces.validator.LongRangeValidator.MAXIMUM=Este campo aceita {0} como valor máximo javax.faces.validator.DoubleRangeValidator.MINIMUM=Este campo aceita {0} como valor mínimo javax.faces.validator.LongRangeValidator.MINIMUM=Este campo aceita {0} como valor mínimo javax.faces.validator.DoubleRangeValidator.TYPE=Este campo aceita apenas números javax.faces.validator.LongRangeValidator.TYPE=Este campo aceita apenas números javax.faces.validator.LengthValidator.MAXIMUM=Este campo aceita no máximo {0} caracteres javax.faces.validator.LengthValidator.MINIMUM=Este campo aceita no mínimo {0} caracteres

Feito isso vc precisa indicar no faces-config o message bundle da aplicação

<!-- Define o bundle da aplicação --> <application> <message-bundle>pacotes.da.aplicacao.mensagens</message-bundle> </application>

Pronto :smiley:

Falow![/quote]

É por esse motivo que eu não uso os validators do faces, você define as mensagens para as validações dele (exemplo, length) e em todo canto que tu usar, ele cospe sempre a mesma mensagem.

Eu utilizo uma estratégia de validação que me da mais flexibilidade, onde posso colocar:

net.pimpas.validators.length.Usuario=O Usuário digitado é inválido. Por favor, digite um valor entre {1} e {2} caracteres.
net.pimpas.validators.length.Senha=Senha inválida! Mínimo {1} máximo {2} caracteres.
// default
net.pimpas.validators.length=O Campo {0} precisa possuir a quantidade mínima de {1} caracter(es) e a quantidade máxima de {2} caracter(es).

O Validators do faces podia ser assim :slight_smile:

casmeiron, o JSF 1.2 tem suporte a esse esquema mais flexível que voce disse :smiley:

Mesmo? Da ultima vez que vi era igual, vo dar uma olhada :slight_smile:

[quote=davidbuzatto]Você quer ter acesso para poder alterá-las?

Se forem as mensagens padrão vc pode fazer a seguinte forma:

Priemeiro crie um message bundle para sua aplicação, por exemplo mensagens.properties.

Nesso mensagens.properties vc vai “sobrescrever” as mensagens padrão do jsf desta forma:

javax.faces.component.UIInput.REQUIRED=Este campo é de preenchimento obrigatório javax.faces.validator.NOT_IN_RANGE=O valor especificado deve estar entre {0} e {1} javax.faces.validator.DoubleRangeValidator.MAXIMUM=Este campo aceita {0} como valor máximo javax.faces.validator.LongRangeValidator.MAXIMUM=Este campo aceita {0} como valor máximo javax.faces.validator.DoubleRangeValidator.MINIMUM=Este campo aceita {0} como valor mínimo javax.faces.validator.LongRangeValidator.MINIMUM=Este campo aceita {0} como valor mínimo javax.faces.validator.DoubleRangeValidator.TYPE=Este campo aceita apenas números javax.faces.validator.LongRangeValidator.TYPE=Este campo aceita apenas números javax.faces.validator.LengthValidator.MAXIMUM=Este campo aceita no máximo {0} caracteres javax.faces.validator.LengthValidator.MINIMUM=Este campo aceita no mínimo {0} caracteres

Feito isso vc precisa indicar no faces-config o message bundle da aplicação

<!-- Define o bundle da aplicação --> <application> <message-bundle>pacotes.da.aplicacao.mensagens</message-bundle> </application>

Pronto :smiley:

Falow![/quote]

É eu conheço esse esquema, o problema é que ele busca o nome do campo no Id do componente e o mesmo não pode conter espaços então as menssagens saem assim:

É necessário preencher o campo Titulo_Projeto.

Mas realmente o JSF acaba com o problema.

Foda que o tamcat não suporta ainda.

Casmerion brigadão era isso mesmo que eu queria saber.

Se você utilizar o Facelets 1.2 juntamente com o JSF 1.2, você nao tem mais dependencia do servidor (no caso tomcat) ter que implementar a JSP 2.1, ou seja, você consegue rodar JSF 1.2 no tomcat 5.5 mesmo.
Você só precisa colocar no classpath o jar da versao nova porque tem umas classe que a versao antiga nao tem, mas o tomcat usa a versao dele para startar, e o Facelets pega as classes que precisa do outro jar. Só tem q tirar a classe javax.servlet.jsp.JspPage pois nao pode ter duas dela no classpath, e se tiver o tomcat nao carrega o jar do jsp-2.1 e acaba dando ClassNotFound quando o JSF 1.2 for rodar…
É um incoveniente… :frowning: mas eu to usando assim e tem funcionado.

Sei que não combina com o conteúdo desse tópico mas como disparar uma action antes da fase “render response”?

a action já executa antes do “Render Response”, o primeiro na Fase 5 e o ultimo na Fase 6.
Se sua action nao executa, o que provavelmente está acontecendo é algum erro de calidação ou conversao (Fase 3).
dá uma olhada no console ou entao coloca a tag h:messages na página pra voce ver se está dando algum erro.

o que eu estou precisando é que essa action seja executada antes de renderizar a resposta, ou seja, no momento em que a página for ser renderizada disparar a action, uma especie de onBeforeRender.

Entendi… uma espécie de onload né?
Já vi um topico aqui no fórum onde o cara fala de um componente que voce adiciona no seu projeto e dá essa funcionalidade, mas eu nao conheço. Conheço o Shale, que faz um monte de coisas, inclusive isso que voce quer (mas talvez por isso seja um canhão pra matar formiga, no teu caso).
Se voce nao encontrar nada pronto, nem quiser usar o shale, tem como fazer parecido com o que o Shale (e o visual web pack do netbeans) faz internamente:

voce arranja um jeito de, a partir do teu JSP voce saber o nome do teu managed bean (mesmo nome, por exemplo) e entao voce usa um PhaseListener para chamar a sua action no before da Fase 6.

Espero que alguma dessas coisas te ajudem.

o nosso ambiente aqui foi configurado com jboss, seam, myeclipse, jsf e o ICEFaces, as extensões que usamos são xhtml, e como o ambiente esta fechado não tem como adicionar outro componente, e não usamos netbeans, e com a nossa configuração também não existe manage-bean porque o seam reselve isso.
eu procuro uma forma de executar essa action antes de renderizar a resposta porque preciso mudar alguns componentes visualmente.
agradeço muito pela sua ajuda.
Obrigado!

Talvez o proprio Seam tenha algo como um @Prerender ou algo naqueles @Interceptors dele. Mas sobre a solução “na unha” que eu comentei, tem como você fazer do mesmo jeito, pois managed bean existe (a nao ser que você fez algo bem diferente do convencional), só o Seam que te dá uma forma mais tranquila de configurar, usando annotation no lugar do faces-config.xml.

Valeu peal dica vou tentar ver se no SEAM tem alguma coisa, depois posto o resusltado.
Obrigado pela ajuda.

[quote=luisandro]o nosso ambiente aqui foi configurado com jboss, seam, myeclipse, jsf e o ICEFaces, as extensões que usamos são xhtml, e como o ambiente esta fechado não tem como adicionar outro componente, e não usamos netbeans, e com a nossa configuração também não existe manage-bean porque o seam reselve isso.
eu procuro uma forma de executar essa action antes de renderizar a resposta porque preciso mudar alguns componentes visualmente.
agradeço muito pela sua ajuda.
Obrigado![/quote]

Você pode setar o momento que sua action será executada, como?!
Simples assim:

// sobresceve 
	@Override
	public void queueEvent(FacesEvent event) {
                // escolhe a fase que o action deve ser executado
		event.setPhaseId(PhaseId.INVOKE_APPLICATION);
		super.queueEvent(event);
	}

Atraves da sua sugestão sobre o SEAM eu consegui chegar até isto o que funciona muito bem:

[quote]

[/quote]

Muito obrigado pela Ajuda.

isso também é muito bom, setar o momento que sua action será executada.
Vou testar e ver o que melhor se adapta a minha necessidade.