JavaScript + JSF, será que dá certo? (parte 2)
Autor: Reinaldo Elias | Publicado: 2011-11-20T11:07:00-02:00


Em um outro 
post sobre JSF + Javascript comentei como manipular os objetos no jsp via 
javascript, agora vou postar algo ainda mais útil que isso, ainda no quesito 
gambiarra necessária.
Imagine que você tem algumas variáveis de controle em 
seu código Java, mas precisa que essas variáveis sejam enviadas de alguma forma 
para o jsp para que você faça alguma ação via javascript, como por exemplo, 
efetuar uma validação no código Java e se tudo estiver certo continuar a 
execução, mas se algo estiver errado volta para a tela, exibe uma mensagem e 
pinta os campos de alguma cor destacando o que está errado. Nesse caso a ação de 
pintar os campos e até mesmo a mensagem, dependendo da sua aplicação, é uma ação 
delegada ao javascript. 

Mas como fazer para que a minha variável de controle no Java seja enxergada 
no javascript? 

Na minha época de estagiário, eu certamente faria algo do tipo:
Deixa a 
variável de controle no Bean, adiciona um campo “inputtext” oculto no jsp e faz 
esse campo receber o valor da variável de controle, via javascript eu mando um 
getElementById pegar o valor desse campo e começo a utilizar. 

Maravilha, gambiarra melhor que essa fica difícil de fazer, nem da vontade de 
mexer mais no código depois disso, deixa lá para as gerações futuras saberem 
quem fez essa maravilha de código. 

Uma coisa que eu costumo dizer é: Para que ter o trabalho de fazer algo que 
já fizeram, e provavelmente melhor do que você? 

O Tomahalk já faz algo do tipo sem precisar ficar colocando 
campo oculto na tela, não precisa se preocupar mais com essa gambiarra, se 
preocupe com as outras. 

O que iremos fazer é utilizar um comando do tomahalk que pega uma variável 
qualquer do seu bean e passa o seu valor para uma variável global em javascript 
(a variável é global mas funciona apenas no jsp em que ela foi declarada). Para 
utilizar essa “poderosíssima” ferramenta, precisaremos primeiro importar a 
taglib necessária no jsp, mas não se desespere, se você está utilizando JSF é 
bem provável que possua esse jar no meio de sua pasta lib. 

Importe a seguinte taglib (eu estou chamando apenas de “T” 
para economizar as teclas digitadas): 


&lt;%@ taglib uri="http://myfaces.apache.org/tomahawk" 
prefix="t"%&gt;
Agora, em qualquer lugar de seu jsp, mas para ficar menos feio, próximo ao 
seu javascript, importe a variável que precisa utilizando o comando 
t:jsValueSet 


&lt;t:jsValueSet name="" value=""/&gt;
Em NAME você precisa colocar o nome que essa variável terá 
no javascript, pode ser qualquer coisa, atésorveteDeChocolate, mas será 
muito mais agradável se colocar um nome que faça referência ao que ela 
representa.
Em VALUE você deve colocar a variável de seu 
bean. 

Ex.: Digamos que eu tenha uma variável de controle em meu bean chamada 
controleMensagem, essa variável é booleana. 

NOTA: Os nomes no Java e no javascript podem ser iguais, eu coloquei 
diferente para não confundir as coisas. 

Feito isso, agora eu só preciso utilizar a variável no javascript: 


if (exibeMensagem) {
alert("preencha direito o campo 
x!");
}
No exemplo acima eu estou utilizando minha variável dentro do IF, porque 
condiz com o exemplo que eu passei, mas você pode utilizar em qualquer outra 
situação dentro de qualquer javascript no jsp em que o jsValueSet foi declarado, 
a variável não precisa nem ser booleana, pode ser de qualquer tipo. 

Espero que esse post ajude a eliminar muitas gambiarras em seu código!