[RESOLVIDO] Javascript dentro do método java

22 respostas
camilooscar

Pessoal, bom dia.

Alguém sabe como que eu faço para executar um método javascript dentro do meu método java?

Att.

Camilo Oscar

22 Respostas

drsmachado

Cuma?

Hebert_Coelho

camilooscar:
Pessoal, bom dia.

Alguém sabe como que eu faço para executar um método javascript dentro do meu método java?

Att.

Camilo Oscar

1) Not possible.
2) Pra q? O.o

camilooscar

Estou criando minhas xhtml dinâmicas, onde os campos que vão aparecer na tela estão no banco. Então na minha xhtml tenho só meu panelgrid e via java, instancio os campos (label, input, combo, button…)

Quando eu clico no button, eu chamo uma action, segue abaixo:

UICommand button = new UICommand();
			button.setValue("Pesquisar");
			
			
			MethodBinding action = application.createMethodBinding("#{criarCotacaoController.teste}", null);

			
			button.setAction(action);

dentro deste meu método teste, eu tenho que abrir um pop up, com uma outra página xhtml. Pensei em fazer isto via JS, mas está dando erro de compilação… segue a idéia abaixo:

public voidteste() {
		
		<script language="JavaScript">
        function abrir("pagina") {

            var width = 400;
            var height = 250;

            var left = 99;
            var top = 99;

            window.open(URL,'janela', 'width='+width+', height='+height+', top='+top+', left='+left+', scrollbars=yes, status=no, toolbar=no, location=no, directories=no, menubar=no, resizable=no, fullscreen=no');

        }
    </script>

}

Preciso dentro deste método teste, chamar um JS para abrir este popup.

Rodrigo_Sasaki

Cara, isso não vai funcionar… apesar do nome ser parecido, são dois mundos diferentes.

O JavaScript tem que ficar do lado do client, você vai ter que achar uma outra forma, que vai depender de o que você estiver usando para montar a View.

camilooscar

Rodrigo Sasaki, beleza?

Eu sei que são dois mundos diferentes hehehe. Tem idéia de como posso fazer isto?

Att.

Camilo Oscar

Rodrigo_Sasaki

camilooscar:
Rodrigo Sasaki, beleza?

Eu sei que são dois mundos diferentes hehehe. Tem idéia de como posso fazer isto?

Att.

Camilo Oscar


Esse button que você clica… Ele está na view, correto?

Não tem como deixar o JS lá ?

camilooscar

Sim ele está na view.

Ele é criado pelo metodo java, mas eu “embuto” ele no meu panelgrid, que está na view.

Posso deixar este popup na view sim, mas como vou chamá-lo via java? Segue o que eu tenho na minha xhtml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">

<ui:composition template="Create.xhtml">
	<ui:define name="body">
		<h:form>

			<p:growl id="msg" showDetail="false" escape="false" />
			
			<h:panelGrid id="gridImpressao" binding="#{criarCotacaoController.impressaoContainer}" columns="6"/>

			<p:separator />
			
			<h:outputLabel value="#{msgs.web_campos_complementares}:" rendered="#{criarCotacaoController.habilitaSeparatorImpressaoSecundario}" style="margin-left:5px; font-size: 85%;" />
			<h:panelGrid id="gridImpressaoSecundaria" binding="#{criarCotacaoController.impressaoContainerSecundario}" columns="4" rendered="#{criarCotacaoController.habilitaSeparatorImpressaoSecundario}"/>
				      			
			<p:separator rendered="#{criarCotacaoController.habilitaSeparatorImpressaoSecundario}" />
						
			<p:panelGrid styleClass="semBorda" columns="1">
				<p:commandButton id="btn_criar_cotacao_print" styleClass="btn_cotacao_impressao"
					value="#{msgs.btn_ok}" ajax="false" action="#{criarCotacaoController.salvarModuloImpressao}"
					/>
			</p:panelGrid>


			<br />
		</h:form>
	</ui:define>
</ui:composition>

</html>

Neste panelgrid:

<h:panelGrid id="gridImpressao" binding="#{criarCotacaoController.impressaoContainer}" columns="6"/>

que eu vou “embutindo” meus componentes dinamicamente, via código Java.

Rodrigo_Sasaki

teoricamente, se você souber qual o id que o popup vai ter quando ele for “embutido” consegue invocá-lo com um JS na página.

camilooscar

Eu sei qual será o id deste popup. Como faço para chamá-lo?

Rodrigo_Sasaki

colocando o javascript na página, e invocando ele no botão, por um evento onclick ou algo parecido.

drsmachado

Você conseguiria se:
Utilizasse alguma forma de escrita na página que permitisse que, ao ser interpretado pelo compilador java, ocorresse a geração do código de forma automática, tanto o html, quanto o javascript.
Isso é possível em Servlet e JSP.

Para o xhtml, onde os componentes definem o conteúdo a ser gerado, isso não teria funcionalidade.

O que o Rodrigo está dizendo é que, independente de como os elementos serão postos em página, o javascript já precisa existir, para que funcione.

camilooscar

O java script pode existir no meu xhtml, não tem problema ele estar lá.

Mas como vou chamá-lo a partir da classe java?

quando crio meu botão (código abaixo):

UICommand button = new UICommand();
			button.setValue("Pesquisar");
			
			
			MethodBinding action = application.createMethodBinding("#{criarCotacaoController.teste}", null);

			
			button.setAction(action);
			panelgrid.getChildren().add(button);

Não tenho acesso ao onclick, via classe Java. Somente tenho acesso ao action e actionlistener…então precisaria chamar o JS que está na xhtml…mas a dúvida é, como chamar.

drsmachado

Você está confundindo as coisas.
Os eventos onclick, onmouseover, onblur devem ser disparados pelo usuário, no browser e não pelo java. Se é para disparar pelo java, deve ser o método da classe.

Enfim, você pode tentar fazer o seguinte, após o local onde o novo elemento é inserido, coloque um trecho script, invocando o método que ele deve disparar, verificando, lógico, se ele já existe:

<script>
if(document.getElementById('idDoElemento') != null &&
  document.getElementById('idDoElemento') != 'undefined'){
   chamaFuncaoQueDeveriaSerDisparadaPeloElemento();
}
</script>

P.S.: Não sei se a comparação com undefined é assim mesmo e estou com preguiça de testar.

camilooscar

Este Script deve ficar na xhtml ou no java? não entendi

Rodrigo_Sasaki

xhtml

B

Como voce esta usando primefaces, voce pode executar um comando javaScript através do java sim, apesar de não ser muito recomendado.

// No metodo execute(String arg0), voce passa o comando que quer executar.
org.primefaces.context.RequestContext.getCurrentInstance().execute("alert ('Este alert em JS é chamado em um método Java!');");

// No seu caso, como voce quer executar o metodo voidteste(), voce pode fazer o seguinte:
org.primefaces.context.RequestContext.getCurrentInstance().execute("voidteste()");
I

button.setOnclick("javascript:function abrir(“pagina”) {

var width = 400;  
        var height = 250;  

        var left = 99;  
        var top = 99;  

        window.open(URL,'janela', 'width='+width+', height='+height+', top='+top+', left='+left+', scrollbars=yes, status=no, toolbar=no, location=no, directories=no, menubar=no, resizable=no, fullscreen=no');  

    } ");
camilooscar

ismael.costa

setOnclick não existe para o JSF, via java.

:wink:

camilooscar

brufelipe, não entendi.

Poderia me passar um exemplo?

Valew

B

Certo, vamos la:

Vamos supor que eu tenha uma classe Usuario, com id e nome. Na minha pagina eu tenho um datatable com usuarios, e um botão!

<p:outputPanel>
     <!-- Renderizado caso não tenha nenhum user escolhido -->
     <p:dataTable value="#{bean.listUsuarios}" var="usuario">
          <p:column headerText="Usuario">
               <h:outputText value="#{usuario.nome}" />
          </p:column>
          <p:column>
                <p:commandButton value="Abrir cadastro">
                     <f:setPropertyActionListener value="#{usuario}" target="#{bean.selectedUser}" />
                </p:commandButton>
          </p:column>
     </p:dataTable>
</p:outputPanel>
<p:dialog widgetVar="dlgUsuario" id="idDlgUsuario">
   <h:form>
       <h:outputText value="#{bean.selectedUser.nome}, selecionado!" />
   </h:form>
</p:dialog>

Ai no bean :

//...
public void setSelectedUser(User user)
{
     this.selectedUser = user;
     
     // org.primefaces.context.RequestContext.getCurrentInstance() -> pega a "pagina atual"
     // .execute() -> executa uma ação
     // No primefaces, quando voce cria um dialog, ele gera um js, .show() e .hide() pro widgetVar, então
     // dlgUsuario.show() -> Exibe o dlgUsuario.
     // no caso de um botão, voce colocaria oncomplete="dlgUsuario.show"
     // ja neste caso, a gente pega a pagina, e executa o comando dlgUsuario.show()!!
     org.primefaces.context.RequestContext.getCurrentInstance().execute("dlgUsuario.show()");
}
//...
camilooscar

brufelipe,

cara, tu é fera.

Me ajudou muito muito muito mesmo garoto. Ganhei o dia com seu ensinamento.

Muito Obrigado de verdade.

Você teria alguma literatura para me indicar?

Abs

Camilo Oscar

B

Camilo, literatura mesmo eu não tenho cara. A melhor dica que eu posso te dar é: pratique!

A um ano atrás, eu não sabia nem o que era java. Pedi estágio em uma empresa, e comecei a trabalhar com desenvolvimento web java. Foi na prática, na curiosidade, e na marra, que acabei aprendendo hehe.
Quanto a literatura, eu te falo uma coisa: Documentação! Voce encontra praticamente tudo nas documentações!

Fico feliz em poder ter ajudado.
Abraços, e sucesso!

:thumbup:

ps: Apenas corrigindo uma falha minha no post anterior, no oncomplete, eu coloquei oncomplete=“dlgUsuario.show”, no caso de funcões, precisa de “()”, então o certo seria oncomplete=“dlgUsuario.show()”, igual no execute!

Criado 19 de outubro de 2012
Ultima resposta 19 de out. de 2012
Respostas 22
Participantes 6