Logica server side para gerar Javascript e rodar automaticamente no browser?

13 respostas
P

Ola pessoal,

Eu preciso de uma logica server-side aonde eu pudesse receber requests de diversas paginas e pudesse gerar codigo javascript para essas paginas processarem.
Primeiramente pensei em uma solucao com Java Custom tags pq elas me dariam uma forma pratica de renderizer o javascript e ter o browser automaticamente rodando o codigo, mas o problema e que nem todas as paginas poderiam incluir a Custom tag pq elas nao sao paginas Java.

Alguma outra alternativa? tecnologia para fazer isso ?

O que eu consigo ver seria… com javascript fazer um request para um Servlet/WS Restful que pudesse gerar a resposta XML para mim…

<xml> <response> <![CDATA[ ><script> alert('minha funcao rodando automaticamente no browser'); </script> ]]> </response>

MAs dai eu precisaria ter codigo javascript na pagina para poder fazer o parser e dai de alguma forma rodar o javscript.

Eu quero eliminar adicional logica javscript para montar o js que vem do server, queria que o javascript rodasse ja como resposta do servico como com as Custom Tags… (mime: application/javascript)

E possivel?

Obriagdo desde ja,

Felipe.

13 Respostas

M

Não conhesso muito de muita coisa, mas pelo que sei richfaces gera ajax, pode ser que ele tenha alguma funcionalidade para gerar javascript.

É só um chute :stuck_out_tongue:

P

vc quer devolver um xml no client side?

tipo, usuário acessa página, clica no botão, botão chama servlet, servlet faz N processamentos, servlet retorna xml processado p/ tela requisitante.

algo assim?

não entendi o pq do js.

att,

P

oi…

Entao…a resposta do meu servico e uma tag javascript

<SCRIPT>

</SCRIPT>

Mas esse javascript deve ser gerado de acordo com o client (pagina) que faz a requisicao…

O XML iria conter a minha funcao javscript (mas isso pq eu nao vejo uma outra forma de retornar a funcao javscript que nao seja por XML entende?)
Essa e a minha duvida…

no final, eu quero que a minha funcao JS rode no browser…

preciso enteder como recuperar a funcao js do XML e ja rodar…tipo um parsing automatico seguido da execucao ta tag javascript…sem ter que desenvolver meu proprio codigo javascript for parsing e etc…

Existe isso ? :slight_smile:

Tks tks

P

q q é isso, rs, ñ da p/ refazer?

faço a minima idéia, nunca me deparei com esse cénario.

JSON será q ñ te ajuda?

att,

J

Pittella,

Eu juro que ainda não entendi direito o que você quer fazer, mas deixo uma palavrinha ou duas:

XML é bacana, tem bastante parser de XML por aí, mas o que o Javascript gosta mesmo é JSON. Dá uma olhada, não é complicado, acho até mais fácil que XML.
Você conhece uma biblioteca chamada DWR? Eles tem um lance de Ajax bem diferente. Talvez seja o que você precisa para rodar a sua aplicação e “avisar” o browser do cliente (é um lance chamado Piggyback, alguns chamam de Reverse Ajax)

G

Eu também não entendi a necessidade de enviar script para o client. Seria melhor o servlet lidar apenas com os dados, e um script pronto no lado client processaria esses dados como conveniente.

Os scripts podem ser encapsulados em uma biblioteca que cada desenvolvedor de páginas referencia com

Explique melhor o que você precisa implementar, funcionalmente falando.

P

cada vez que a uma pagina e carregada, a pagina envia alguns parameters para o componente server-side…

Este componente executa logica complexa que nao poderia ser feita com javascript libraries

ao inves de retornar um XML com dados e fazer o parsing e depois montar o HTML/javascript eu precisaria retornar ja a tag javascript (HTML/js)

preciso rodar a menor quantidade possivel de logica javscript na pagina para evitar problema de processamento (page-loading)…

Entendam que esta logica e particular…este servico foi feito para isso…e considerado um third-party service que nao pode impactar as paginas (processing)…nao levem em considerecao aqui MVC, frameworks and etc… meu servico e como uma Custom tag que escreve HTML na pagina…com a desvatagem de rodar antes da pagina ser carregada no browser…por isso a necessidade de gerar javascript…

Fui mais claro ?

obrigado pela ajuda!!!

G

Não fica bravo, mas eu não entendi ainda porque o servidor tem que gerar o javascript ao invés de apenas os dados... hehe :D

Mesmo assim vou dar uma sugestão. É uma solução extremamente simples:

Página:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Teste</title>
</head>
<body>
	Testando pagina que vai carregar um script do servlet
</body>
<script src="/myapp/script?parametro=TESTANDO"></script>
</html>

/myapp/script é um caminho que está mapeado para um Servlet.
Ou seja, vai buscar o retorno do servlet e tratar como se fosse um arquivo .js estático.
No código do servlet basta então "cuspir" o javascript que se deseja executar:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String parametro = request.getParameter("parametro");
		response.getWriter().print("alert('Hello " + parametro + "');");
	}

Lembrando que este servlet poderia ser qualquer coisa que gere uma saída em texto: um JSP, uma action do struts, uma página ASP, etc.

P

Oi gomes…sim assim funciona…obrigado pelos exemplos!!!

Me diz uma coisa…como eu poderia retornar essas tags abaixo entao ?

out.print("<img src='https://localhost:8084/MyWebApp/image.jpg'/>"); out.print("&lt;script src='https://localhost:8084/MyWebApp/image.jpg'&gt;&lt;/script&gt;");

e automaticamente rodar elas no browser com o exemplo que vc passou acima:

&lt;script src="https://localhost:8084/MyWebApp/MyServlet?param=xxxx"&gt;&lt;/script&gt;

tendo como resultado:

<img src='https://localhost:8084/MyWebApp/image.jpg'/> ou &lt;script src="https://localhost:8084/MyWebApp/image.jpg"&gt;&lt;/script&gt;

Obrigado!!!

P

Gomes, pessoal…

Eu fiz funcionar com IMG

http://localhost:8084/TROLWebApp/MyServlet?param=Hello

que retorna (text/html) e a seguinte string:

out.print("<img src='http://localhost:8084/MyWebApp/image.jpg'/>");

No HTML eu faco assim:

resultado da chamada ajax:

document.getElementById("mydiv").innerHTML=httpRequest.responseText;

e a IMG e renderizada aqui :

&lt;div id="mydiv"&gt;&lt;/div&gt;

MAAAAAS, o mesmo nao funcionou para esse retorno do Servlet para retornar uma tag HTML <SCRIPT>:

out.print("&lt;script src='http://localhost:8084/MyWebApp/MyServlet?param=secondCall'&gt;&lt;/script&gt;");

No HTTP body dessa chamada eu consigo ver la:

&lt;script src='http://localhost:8084/MyWebApp/MyServlet?param=secondCall'&gt;&lt;/script&gt;

Mas quando jogo no DIV ele nao renderiza… :frowning:

Alguem pode me ajudar?

Desde ja obrigado!!

G

Parece que ao incluir dinamicamente no HTML uma tag o browser não processa essa tag. Verifiquei isso com a página de teste abaixo, o que vc tentou fazer não funciona no Firefox nem no IE.

Aproveitando, estou colocando aqui mais uma opção, o comando eval

<html>
	<head>
		<title>Teste JS Dinamico</title>
		<script>
			// Contem o codigo javascript a ser executado dinamicamente.
			// Seria o bloco de codigo retornado em uma chamada HTTP ao servidor
			var codigoScript = "function sayHello() {"
			       		+ "	alert('Hello JS');"
					+ " } "
					+ "sayHello();";

			var tagJs = "<script>" + codigoScript + "<" + "/script>";

			var tagConteudo = "<span>SOU UMA TAG NORMAL</span>";

			// Inclui na DIV uma tag com conteudo comum, apenas para demonstrar que esse conteudo é renderizado
			function carregarConteudoNormal() {
				alert("inserindo conteudo");
				document.getElementById("divConteudoNormal").innerHTML = tagConteudo;
			}

			// Inclui na DIV uma tag script, para verificar se o seu conteudo é executado
			function carregarJSDinamico() {
				alert("inserindo script: \n" + tagJs);
				document.getElementById("divScript").innerHTML = tagJs;
			}

			// Executa pedaço de codigo pelo comando eval
			function executaEVAL() {
				alert("executando eval");
				eval(codigoScript);
			}
		</script>
	</head>

	<body>
		<div id="divConteudoNormal"></div>
		<div id="divScript"></div>

		<input type="button" value="Carrega Conteudo normal" onclick="carregarConteudoNormal()" />
		<input type="button" value="Carrega JS" onclick="carregarJSDinamico()" />
		<input type="button" value="Processa JS com EVAL" onclick="executaEVAL()" />
	</body>

</html>
P

OI gomes,

Primeiramente obrigado pelo exemplo (bem claro) e desculpe pela demora…nao pude responder antes.

Entao…

Nessa parte aqui:

eval(codigoScript);

Vc esta aplicando o eval em uma funcao javascript…

"&lt;script&gt;" + codigoScript + "&lt;" + "/script&gt;";

Mas infelizmente no meu caso eu nao vou ter isso…

Eu preciso disso:

&lt;script src="http://domain.com/resource.sd?param1=x&param2=yyy"&gt; &lt;/script&gt;

Quando eu retorno esta tag omo TEXTO do meu Servlet , e tento usar o eval(), nao funciona (estou deixando algo passar?).

com IMG src eu nao preciso de eval nem nada, eu posso normalmetne atribuir para o DIV que o browser roda a chamada:

<IMG src="http://domain.com/resource.sd?param1=x&param2=yyy" />

Perguntas:

  1. Como resolver o problema para <script src=""> </script>

  2. Pq vc concatena a ultima parte da string com + "<" + "/script>";

Obriagdo desde ja,

G

O eval realmente não funciona com a tag <script>, apenas com o código javascript propriamente dito.
Para utilizá-lo, seria necessário fazer uma chamada HTTP para http://domain.com/resource.sd?param1=x¶m2=yyy , e depois aplicar o eval sobre a string retornada.

Adicionar a tag script de forma que ela seja executada eu infelizmente não sei como fazer… achei esses links sobre o assunto, veja se resolve:
http://unixpapa.com/js/dyna.html

  1. Usei “<” + “/script>” porque se colocasse “</script>” o browser podia acabar se confundindo pensando que eu estava realmente fechando a tag script (aquela que começa lá na linha 4).
Criado 16 de março de 2012
Ultima resposta 28 de mar. de 2012
Respostas 13
Participantes 5