Java + Flash

7 respostas
ganondorfan

Boa noite pessoal,

Existe alguma maneira de fazer com que um flash(SWF) obtenha parametros de uma resposta de um Servlet? Ou seja, um swf que é alimentado por uma response de um Servlet.

Se sim, como fazer?

[]'s

7 Respostas

otaviojava

Olha tem um framework que eu ouvir alguns colegas meus falando para essa função, mas eu nunca usei.
Que é o framework openamf feito para trabalhar java + flash, Java Flash Remoting.

davidbuzatto

AMF é um protocolo para intercâmbio de objetos ActionScript com outra tecnologia. É um mecanismo de serialização/deserialização de objetos ActionScript.
É Flash “puro” ou Flex que você está usando?

Se for só a biblioteca ActionScript do Flash, vc pode usar a classe URLLoader. Se for a API do Flex SDK, existem algumas alternativas: WebService (consome web services), HttpService (consome dados em html) e RemoteObject (consome dados em AMF). Se quiser referenciar a API do Flex a partir do Flash, dê uma olhada aqui.

[]'s

ganondorfan

É flash puro mesmo, não manjo nada de flex.

davidbuzatto

Exemplo:

dados.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<raiz>
    <pessoas>
        <c:forEach varStatus="i" begin="1" step="1" end="${param.quantidade}">
            <pessoa>
                <nome>Nome ${i.count}</nome>
                <sobrenome>Sobrenome ${i.count}</sobrenome>
            </pessoa>
        </c:forEach>
    </pessoas>
</raiz>
O JSP dados.jsp recebe como parâmetro uma quantidade e gera um xml com a quantidade de pessoas especificadas, usando o forEach da JSTL. Para uma quantidade 3, geraria o seguinte XML.
<raiz>
    <pessoas>
        <pessoa>
            <nome>Nome 1</nome>
            <sobrenome>Sobrenome 1</sobrenome>
        </pessoa>
        <pessoa>
            <nome>Nome 2</nome>
            <sobrenome>Sobrenome 2</sobrenome>
        </pessoa>
        <pessoa>
            <nome>Nome 3</nome>
            <sobrenome>Sobrenome 3</sobrenome>
        </pessoa>
    </pessoas>
</raiz>
Crie um novo arquivo no Flash, usando ActionScript 3.0. Coloque no palco um campo de texto, mude o tipo para dinâmico e configura o nome da instância para "campo" (sem as aspas). No primeiro keyframe, coloque o seguinte código:
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.IOErrorEvent;
import flash.events.Event;
import flash.net.URLVariables;

var loader: URLLoader;

// função para executar a carga dos dados de uma URL
function load() {
	
	// variáveis a serem enviadas
	var vars: URLVariables = new URLVariables();
	// olha a quantidade aqui! nesse caso, quero que sejam geradas 10 pessoas
	vars.quantidade = 10;
	
	// requisição para a URL que aponta para o dados.jsp
	var request: URLRequest = new URLRequest( "http://localhost:<porta do tomcat>/<seu contexto>/<caminho do jsp>/dados.jsp");
	request.method = "POST";
	request.data = vars;
	
	// carregador
	loader = new URLLoader();
	// registra os eventos do carregador
	loader.addEventListener( IOErrorEvent.IO_ERROR, errorHandler );
	loader.addEventListener( Event.COMPLETE, completeHandler );
	
	try {
		// tenta carregar o request
		loader.load( request );
	} catch ( erro: SecurityError ) {
		trace( "erro..." );
	}

}

// função para tratar um erro de IO
function errorHandler( e: IOErrorEvent ) {
	campo.text = "Não foi possível carregar os dados...";
}

// função para tratar o evento complete do carregador
// ou seja, quando o carregador é executado (load)
// e os dados são obtidos
function completeHandler( e: Event ) {
	
	// cria um XML com os dados obtidos
	var xml: XML = new XML( loader.data );
	var dados: String = "";
	
	// itera pelo XML criado, montando uma string
	for each ( var el: XML in xml.pessoas ) {
		for each ( var p: XML in el.pessoa ) {
			dados += "Nome: " + p.nome + "\n";
			dados += "Sobrenome: " + p.sobrenome + "\n\n";
		}
	}
	
	// configura a propriedade text de um campo
	// de texto dinâmico com o valor da string dados
	campo.text = dados;
	
	// faz o trace dos dados (manda para a saída
	// do flash player)
	trace( dados );
	
}

// executa a função load
load();

// para o filme
stop();

Ao executar o swf, o campo de texto vai ser carregado com os valores obtidos no XML.
Você pode gerar os dados em qualquer formato, basta você fazer o parse depois.
Estou enviando um projeto Java Web do NetBeans. Dentro da estrutura do projeto está o obtemDados.fla, que é o arquivo fonte em Flash (CS 5) do que eu te expliquei.

[]'s

ganondorfan

Valew David, muito obrigado pela atenção.

Vou tentar adaptar para as minhas necessidades e ver se aprendo algo. :smiley:

davidbuzatto

Legal!
Tente modularizar ainda mais o código, fazendo com que a função load possa ser chamada em um botão por exemplo, recebendo a URL e as variáveis a serem enviadas como parâmetro. Assim você tem um método genérico para esse tipo de tratamento. A função load tbm pode receber como parâmetro a função que faz o tratamento do evento COMPLETE, pois em ActionScript vc pode passar funções como parâmetro. Ficaria algo assim.

import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLVariables;


var carregar: Function = function( request: URLRequest, completeHandler: Function, errorHandler: Function ) {
	
	var loader: URLLoader = new URLLoader();
	loader.addEventListener( Event.COMPLETE, completeHandler );
	loader.addEventListener( IOErrorEvent.IO_ERROR, errorHandler );
	
	try {
		loader.load( request );
	} catch ( erro: SecurityError ) {
		trace( "erro..." );
	}

}


var tratadorErro: Function = function( e: IOErrorEvent ) {
	campo.text = "Não foi possível carregar os dados...";
}


var completeHandler: Function = function( e: Event ) {
	
	var xml: XML = new XML( ( e.target as URLLoader ).data );
	var dados: String = "";
	
	for each ( var el: XML in xml.pessoas ) {
		for each ( var p: XML in el.pessoa ) {
			dados += "Nome: " + p.nome + " ";
			dados += "Sobrenome: " + p.sobrenome + "\n";
		}
	}
	
	campo.text = dados;
	trace( dados );
	
}


btnQuant.addEventListener( MouseEvent.CLICK, function( e: MouseEvent ) {
						  
	var vars: URLVariables = new URLVariables();
	vars.quantidade = Number( campoQuant.text );
	
	var request: URLRequest = new URLRequest( "http://localhost:8084/DadosRemotosFlash/dados.jsp");
	request.method = "POST";
	request.data = vars;
	
	carregar( request, completeHandler, tratadorErro );

});

Novamente, segue em anexo o projeto do NetBeans e o arquivo .fla novo (obtemDadosMod.fla).
[]'s

lilirc

Tenho uma aplicação Flex a qual não possuo o código fonte, porém sei quais os parâmetros que a aplicação espera. Atualmente estou chamando a aplicação em um jsp passando os parâmetros via flashVars, porém não é uma forma muito segura.

Alguém saberia me indicar alguma forma segura de eu passar os parâmetros para a aplicação sem expor o conteúdo passado?

Criado 1 de janeiro de 2011
Ultima resposta 4 de jul. de 2011
Respostas 7
Participantes 4