GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

[JSF] Passar parametro #{} para function JS


#1

Bom dia pessoal,
Alguém sabe como posso chamar uma função javascript no onload da página e passar para essa função valores de uma variável de um bean?
Algo como:

<script>
function funcao(valor) {
   alert(valor);
}
<body onload="funcao(#{bean.variavel});">
     ....conteudo da página....
</body>

Contudo a tag BODY não aceita chamadas JSF.

[]´s

Daniel


#2

Como assim não aceita?
Deu algum erro de compilação aí?


#3

Segue mensagem:

Codigo JSP:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<html>
    <f:view>
        <head>
            <link href="css/estilos.css" rel="stylesheet" type="text/css" />
            <script type="text/javascript" src="js/funcoes.js"></script>
            <script>
            function funcao(valor) {
          		alert(valor);
            }
            </script>
        </head>
        <body onload="funcao(#{testeBean.variavel1})">
            teste
        </body>
    </f:view>
</html>

Erro:

org.apache.jasper.JasperException: /teste.jsp(20,63) #{..} is not allowed in template text
...
...
...

#4

seria isso ?


#5

Isso mesmo guimoz. Inicialmente eu havia pensando que o jsfunction só serviria para enviar informações ao Bean via javascript e isso seria o caminho inverso do que eu precisava. Contudo, olhando melhor a documentação consegui fazer o que eu precisava.
Apenas para deixar aqui a solução, segue um exemplo simples:

Bean

public class TesteBean {
	private String variavel1;
	public TesteBean() {
		variavel1 = "Teste";
	}
	public String getVariavel1() {
		return variavel1;
	}
	public void setVariavel1(String variavel1) {
		this.variavel1 = variavel1;
	}
}

JSP:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<html>
    <f:view>
        <head>
            <script>
            function funcao(valor) {
          		alert(valor);
            }
            </script>
        </head>
        <body onload="scriptJSF()">
        	<h:form>
            	<a4j:jsFunction name="scriptJSF" data="#{testeBean.variavel1}" oncomplete="funcao(data)"/>
            </h:form>
        </body>
    </f:view>
</html>

[]´s

Daniel


#6

olá senhores,

estou com um problema semelhante!

tenho uma galeria em flash que aciona uma função JavaScript, passando 3 parâmetros
essa função recebe o valores e através da mesma função, será aberto um pop-up.
os 3 valores do parâmetro serão enviados para o pop-up.jsf

function LancamentoPopUp( id, unidade, empreendimento ){
		window.open('popupLancamento.jsf?id='+id+';unidade='+unidade+';empreendimento='+empreendimento);
}

os exemplos que já analisei, são apenas utilizando 1 parâmetro.

para separar os parâmetro tentei utilizar o "&", mas não funcionou!
devido ao delimitador requirido pelo Servlet

colocando o delimitar ";" funciona, mas quando tenho que pegá-lo com request.getParameter
os parametros não veem separados

imprimi pra ver os valores:

System.out.println("request:id " + request.getParameter("id"));
System.out.println("request:idunidade " + request.getParameter("unidade"));
System.out.println("request:idempreendimento " + request.getParameter("emprendimento"));

resultados!

request:id 57;unidade=57;empreendimento=3;unidade=;empreendimento=
request:idunidade 57;unidade=57;empreendimento=3;unidade=;empreendimento=
request:idempreendimento 57;unidade=57;empreendimento=3;unidade=;empreendimento=

alguém poderia mostar uma forma para pegar os parâmetros separadamente?!?


#7

mudando forma de passar esses parâmetros....

verifiquei que esse problema ocorre só quando tento passar dentro da função JS,
pois em uma galeria em flash, no meu AS3 passo determinados parâmetros usando
o '&' para passar mais de um parâmetro.


#8

Utilize a taglib do tomahawk jsValueSet ou seu equivalente no rich faces.

Fica mais ou menos assim:

<t:jsValueSet name="" value=""/>

Em name, defina o nome para a variável, e em value coloque o parâmetro do bean "#{xxx.yyy}".

Depois é só utilizar a variável no javascript.

NOTA: Essa "declaração de variável" tem que ficar antes do script que vai utilizá-la.


#9

Olá amigos,

Estou com um probleminha! Preciso passar o tamanho da tela capturada via js como parâmetro num método do bean!

Tem como fazer isso??

 <script language="JavaScript">
            var width, height;
            if (screen.width === 640 || screen.height === 480){     
        // alert("A resolução da tela do seu monitor é 640x480. Para ter uma visão total do site é recomendavel 800x600.")
            }else if (screen.width === 800 || screen.height === 600){
               // alert("A resolução da tela do seu monitor é 800x600. Você terá uma boa visão do site.")
            }else if (screen.width === 1024 || screen.height === 768){
               // alert("A resolução da tela do seu monitor é 1024x768. Você terá uma boa visão do site. RECOMENDÁVEL 800x600.")
            }else if (screen.width === 1152 || screen.height === 864){
               // alert("A resolução da tela do seu monitor é 1152x864. Você terá uma boa visão do site. RECOMENDÁVEL 800x600.")
            }else{ //if all else
                //alert("A resolução da tela do seu monitor é desconhecida. Para ter uma visão total do site é recomendavel 800x600.")
            };
#{logar.tela(width,height)} //entra no método mas o valores são nulos, não reconhece as variáveis do js
        </script>

#10
  • você tem que ter um campo hidden no seu formulário, este campo hidden tem que estar linkado a uma variável da sua entidade.
  • tanto o seu formulário quando o seu campo hidden tem que ter o atributo ID definidos
  • No javascript você seta um valor nesse campo hidden, mais ou menos assim:

document.getElementById("idDoForm:idDoCampo").value = "123";

No jsf, mesmo quando você seta um ID fixo para um campo, quando o jsp é compilado ele recebe um novo id, ficando "id do formulario dois pontos id do campo".
Se você não definir nenhum id, para o form ou para o campo, o jsf vai gerar um numero aleatorio, tipo "123:779".
Como o javascript trabalha no navegador do cliente (página já compilada) você precisa trabalhar com os ids do jsp compilado.

Depois que o seu campo hidden estiver com o valor, você vai precisar fazer o submit no formulário, seja clicando em um botão ou usando ajax.
Uma gambiarra que eu costumava fazer, quando eu não podia usar ajax, era fazer um outro javascript mandando clicar em um botão automaticamente.
Eu criava um outro botão normal, com action e actionlistener, mas deixava ele oculto por css (style="display:none"), e no final do meu método javascript eu acionava esse botão document.getElementById("form:botao").click()


#11

Olá reinaldo558, muito grato pela resposta amigo,

fiz uns testes aqui e não deu muito certo! Acho que estou fazendo algo errado. Segue código:

<script>
document.getElementById("botoes:w").value="800";
document.getElementById("botoes:h").value="600";
</script>
<h:form id="botoes">
<p:inputText id="w" value="#{logar.width}" style="display: none" />
<p:inputText id="w" value="#{logar.height}" style="display: none" />
</form>

Existe algum erro? Vou testar de outras formas, já que me deu uma luz!

Abraço


#12