Criando aplicações ricas com Adobe Flex 3.4 e Java

Propaganda
artigo
Gilberto Santos
([email protected]) é graduando do curso
de Análise e Desenvolvimento de Software pela PUCGO, trabalha com Java desde 2005, possui certificação
SCJP5 e Adobe Certifield Expert, entusiasta opensource. Trabalha como desenvolvedor sênior no Centro
de Excelência da Politec – Goiânia e mantém um blog
em http://gilbertosantos.com.
Criando aplicações ricas com
Adobe Flex 3.4 e Java
Entenda a arquitetura deste framework MVC e aprenda a
disponibilizar serviços para o Flex que vem ganhando espaço
no mundo Java
Ganhos efetivos
As aplicações RIA (Rich Internet Applications –
aplicações ricas em internet) estão a cada dia
ganhando mais mercado. Diversos aplicativos,
tais como planilhas eletrônicas e gerenciadores
de conteúdo, já abordam conceitos de RIA e
estão cada vez mais semelhantes aos softwares
no ambiente desktop.
40 www.mundoj.com.br
$SJBOEPBQMJDBÎÜFTSJDBTDPN"EPCF'MFYF+BWB
0RVFÏ"EPCF'MFY
É um framework de desenvolvimento criado pela Adobe que dá suporte
a criação de componentes ricos visíveis ao Flash Player baseados em
ActionScript 3 (linguagem orientada a eventos da antiga Macromedia).
O Adobe Flex 3 foi desenvolvido com esse propósito, por meio de componentes reutilizáveis e ricos em interface. Recursos como transições,
efeitos, arrastar e soltar, entre outros desejos do desenvolvedor web que
eram barrados por incompatibilidade dentre os browsers e suas versões,
são simplificados em componentes com o uso da linguagem ActionScript 3.
Por serem componentes visuais, a Adobe desenvolveu uma interface para a
linguagem ActionScript 3, o MXML, que é uma marcação XML comum que
mapeia instâncias de AC3. Ambos contam com uma IDE (Flex Builder 3)
baseada em Eclipse como ferramenta.
Antigamente, só era possível fazer isso com uma linguagem interpretada
de comportamento de tela orientada a eventos, baseada no modelo HTML
+ JavaScript, onde era preciso programar bastante para alcançar algum
efeito RIA.
Todas as fábricas de software já possuem know-how suficiente para construir sistemas ERP, CMS ou Mapas. As regras passam a ser comuns e, hoje,
os ganhos efetivos ficam no diferencial das interfaces desses softwares que
mais amigavelmente legíveis se oferecem ao usuário, lembrando do efeito
que o IPhone trouxe para o mercado de telefonia móvel. A grande mudança
fez com que as instituições concorrentes tivessem que adotar o mesmo
conceito RIA para não perder mercado. Agora, com o desenvolvimento web
não é diferente, este segue a mesma tendência. Porém, existem algumas
alternativas de soluções RIA para web. Neste artigo, vamos focar no Adobe
Flex, por ser open-source e pelo fato de o plugin do Adobe Flash Player
estar presente em mais de 80% dos browsers no mundo.
Por enquanto, falamos somente de interfaces ricas, mas a Adobe não se
preocupou só com esse detalhe. Onde ficam as regras de negócio? Pensando também na segurança das informações, a Adobe criou o AMF (protocolo
binário de comunicação) e o RPC (Remote Procedure Call), que permitem
que a aplicação interaja com servidores e forneça acesso local ou remoto
a um server-side. O Flex é projetado para interagir com vários tipos de
serviços de RPC, alguns desse são:
WebService: fornece acesso SOA baseado em serviços da web (trafega
XML);
HTTPService: fornece acesso a HTTP/S URLs que retornam dados (trafega XML);
RemoteObject: fornece acesso a objetos no servidor usando protocolo
de AMF (trafegam dados binários).
Mais detalhes sobre como o Spring trata o gerenciamento de transações
com Hibernate podem ser vistos no projeto disponibilizado para download.
O papel do BlazeDs
O Adobe Flash Player suporta serialização do tipo AMF, e o BlazeDs é um
simples provedor de comunicação do tipo two-way. O framework é feito
em Java, disponibilizado em pacotes jars, e é apenas um conversor de
Destinos Remotos para o AMF3, que são disponibilizados em um descritor
services-config.xml.
Por definição, o BlazeDs cria instâncias completas de objetos no serverside Java. A integração com o Spring faz a injeção desses objetos como
beans e sejam disponibilizados como Destinos Remotos para o Flex.
O BlazeDs vem como um projeto web empacotado em um .war. Para
utilizá-lo, descompacte-o e atente-se às suas dependências, e também ao
diretório /WEB-INF/flex e seus arquivos *.xml.
Configuração dos projetos
O objetivo deste artigo é usar essa nova tecnologia de aplicações Rich como
uma camada de visão aos recursos de aplicações Java, separando-a das regras
de negócio, e criando assim dois projetos distintos. Para esse efeito, vamos
começar a trabalhar com a IDE Adobe Flex Builder 3 e com suas perspectivas
para cada tipo de desenvolvimento. Crie um projeto para cada:
Flex Development
aplicacao_flex
(Front-end)
Java EE
aplicacao_java
(back-end)
Essa separação garante que o seu software seja também independente de um
front-end. Isso porque obrigatoriamente os recursos Java serão agora disponibilizados por um @Controller, e o seu front-end deverá conhecer somente essa
classe, que será unicamente responsável por conceber os serviços de negócio.
Para este artigo, vamos usar da força de alguns frameworks de modo a garantir que os serviços transacionais e a comunicação do Adobe Flex para o
Java sejam garantidos. Para isso, vamos trabalhar com o Spring e o BlazeDs.
O papel do Spring
Como um excelente fornecedor de beans para aplicações enterprise serverside, o framework possui um módulo específico para que o Java se comunique diretamente com o AMF3 do Flex. Uma camada de controle MVC do
Spring será disponibilizada como Destino Remoto.
Figura 1. Caminho para publicação do template de aplicação do Adobe Flex.
41
$SJBOEPBQMJDBÎÜFTSJDBTDPN"EPCF'MFYF+BWB
Dentro de um projeto Flex estão recursos *.xml, *.as e imagens, e tudo isso
será compilado pelo SDK do Flex, que irá gerar arquivos *.swf. A IDE facilita
o trabalho de criação de um projeto Flex, criando o template necessário para
carregar o *.swf no browser.
É necessário que esse arquivo gerado pelo SDK faça parte de um mesmo
contexto Java EE quando se utiliza o BlazeDs como fornecedor AMF, conforme
a figura 1. Para tanto, vá em propriedades do projeto aplicacao_flex, Flex Built
Path e altere a Output Folder para:
como serviço AMF para invocações do RPC do Flex.
É necessário que as dependências do BlazeDs estejam no diretório
lib da sua aplicacao_java e também que o diretório /flex esteja dentro de WEB-INF.
Modelo de Arquitetura Flex com Java
${DOCUMENTS}\aplicacao_java\web\flex
É justamente no momento da compilação que é necessário passar alguns
argumentos para o SDK, para que sua aplicacao_flex conheça os serviços
AMF que estão disponíveis para o RPC do Flex. Vá em propriedades do
projeto em aplicacao_flex, vá para Flex Compiler e adicione os parâmetros
conforme a figura 2.
- locale en_US //define o Locale da aplicação, por default en_US
- compiler.services //define o caminho fisico dos serviços AMF disponíveis
para o RPC Flex
- compiler.root //define para qual context essa aplicação pode ser invocada
Figura 3. Modelo de arquitetura Flex com Java.
No momento da compilação para geração de arquivos *.swf, o Flex precisa
mapear onde estarão os Destinos Remotos disponíveis sob o protocolo AMF.
Neste nosso cenário, o desenvolvedor gera e compila os fontes, realizando
em um mesmo deploy no container arquivos *.swf e *.class. O cliente
(browser) carrega o *.swf, que deve estar pronto para fazer as chamadas
remotas às classes Java que foram disponibilizadas pelo Spring como
Destino Remoto.
Figura 1.1. Argumentos adicionais ao SDK do Flex, para a localização de serviços disponíveis
em AMF.
Feito isso, o Flex irá tentar localizar um descritor services-config.xml de
serviços disponíveis no lado Java, e provavelmente a IDE irá acusar um
erro porque ainda não concluímos esta etapa. Este descritor vem junto
com o BlazeDs.
Após a chamada remota do Flex, a execução passa a estar disponível no
server-side. Isso, às vezes, fica um pouco confuso para o desenvolvedor
Java. Para esse efeito, vamos lembrar que Java é executado top-down e
left–right, e essa execução não é interrompida, a não ser que ocorra alguma exceção. No Flex, pode-se programar assim também, entretanto, a
forma mais correta é a programação orientada a eventos. As classes Java
estarão disponíveis para execução após o evento de invocação de chamada remota do Flex, podendo a partir desse ponto ter um comportamento
comum ao Java, ou seja, a execução do código volta a ser top-down e
left–right para atender as regras de negócio.
Criando o serviço back-end
Se tudo ocorreu bem, seu ambiente de desenvolvimento deve estar bem
parecido com a figura 4.
O serviço back-end Java para aplicações Flex, é uma implementação J2EE
comum, ou seja, trata-se de uma aplicação Java para web JSP/Servlet.
Neste caso, vamos adicionar um gerenciador de beans enterprise, o
Spring 2.5.6. Para essa adição, é necessário um descritor applicationContext.xml e suas dependências. As configurações desse podem ser melhor
detalhadas no projeto disponível para download.
Aqui nos podemos perceber que o Flex já gerou alguns arquivos necessários para uma aplicação web Flex. Não convém mexer nesses arquivos
porque eles vão ser sobrescritos todas as vezes que o Adobe Flex Builder
compilar o seu projeto.
Configurando os serviços java
O Projeto aplicacao_java é um projeto Java EE comum, e aqui vamos
permitir a adição do Spring para o tratamento do MVC, que disponibilizará uma camada de controle como Destino Remoto e do BlazeDs
que fará com que o mesmo Destino Remoto seja disponibilizado
42 www.mundoj.com.br
No projeto aplicacao_java, dentro de WEB-INF, temos alguns arquivos
*.xml de configuração, e esses arquivos vão dizer ao BlazeDs qual é a
forma de comunicação, canal e o cast de classe com o Flex (embora neste
artigo utiliza-se o AMF3, existem também outros formatos).
Quem irá de fato distribuir a sua aplicação e disponibilizar os serviços
para o Flex é o Spring, portanto, vamos falar de cada arquivo separadamente, e dar uma atenção especial ao services-config.xml
$SJBOEPBQMJDBÎÜFTSJDBTDPN"EPCF'MFYF+BWB
Listagem 1 services-config.xml.
<?xml version=”1.0” encoding=”UTF-8”?>
<services-config>
<services>
<service-include file-path=”remoting-config.xml” />
<service-include file-path=”messaging-config.xml” />
<service-include file-path=”proxy-config.xml” />
<default-channels>
<channel ref=”my-amf”/>
</default-channels>
</services>
Figura 4. Configuração do workspace.
Os códigos desses arquivos podem ser encontrados na Seção de downloads no site da revista Mundoj.
Existem outras formas de disponibilizá-los, caso não se esteja usando
Spring. Procure pela marcação destination em /flex/remoting-config.xml .
Esta tag pode disponibilizar uma classe Java como Destino Remoto.
Quase pronto! Falta pouco para os projetos configurados conversarem
entre si e, a partir daqui, o desenvolvedor pode tranquilamente criar e
testar os métodos do lado Java para garantir que as regras de negócio
sejam atendidas com testes unitários. No Flex, preocupe-se somente com
os componentes de visualização.
Para os desenvolvedores que não conhecem bem o Flex, recomendo
alguma literatura focada no assunto.
Configuração dos canais de comunicação
Dentro de /WEB-INF/flex em aplicação_java vamos encontrar os arquivos
*.xml do BlazeDs necessários para conseguir fazer a ligação com o Adobe
Flex. Desses arquivos, somente precisamos nos atentar para o servicesconfig.xml. Agora como utilizamos o Spring como framework MVC, então,
precisamos informar ao BlazeDs que essa comunicação agora é gerenciada pelo Spring. Mudando o path original do endpoint do descritor
services-config.xml.
Na descrição services-config.xml , existem algumas tags, que referenciam
os canais de comunicação.
<channels>
<channel-definition id=”my-amf”
class=”mx.messaging.channels.AMFChannel”>
<endpoint url=”http://{server.name}:{server.port}/{context.root}/
spring/messagebroker/amf” class=”flex.messaging.endpoints.AMFEndpoint”/>
<properties>
<polling-enabled>false</polling-enabled>
</properties>
</channel-definition>
<channel-definition id=”my-polling-amf”
class=”mx.messaging.channels.AMFChannel”>
<endpoint url=”http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling” class=”flex.messaging.endpoints.AMFEndpoint”/>
<properties>
<polling-enabled>true</polling-enabled>
<polling-interval-seconds>4</polling-interval-seconds>
</properties>
</channel-definition>
</channels>
<logging>
<target class=”flex.messaging.log.ConsoleTarget” level=”Error”>
<properties>
<prefix>[BlazeDS] </prefix>
<includeDate>false</includeDate>
<includeTime>false</includeTime>
<includeLevel>false</includeLevel>
<includeCategory>false</includeCategory>
</properties>
<filters>
<pattern>Endpoint.*</pattern>
<pattern>Service.*</pattern>
<pattern>Configuration</pattern>
</filters>
</target>
</logging>
<system>
<redeploy>
<enabled>false</enabled>
</redeploy>
</system>
</services-config>
O próximo passo, é configurar o MVC do Spring. A Listagem 2 mostra
como deve ficar o seu web.xml
43
$SJBOEPBQMJDBÎÜFTSJDBTDPN"EPCF'MFYF+BWB
Listagem 2. web.xml aplicação_java.
Listagem 3. ( flex-servlet.xml).
<?xml version=”1.0” encoding=”UTF-8”?>
<web-app xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns=”http://java.sun.com/xml/ns/javaee” xmlns:web=”http://java.sun.
com/xml/ns/javaee/web-app_2_5.xsd” xsi:schemaLocation=”http://java.sun.
com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”
id=”WebApp_ID” version=”2.5”>
<?xml version=”1.0” encoding=”UTF-8”?>
<display-name>aplicacao_java</display-name>
<beans xmlns=”http://www.springframework.org/schema/beans”
xmlns:flex=”http://www.springframework.org/schema/flex”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:context=”http://www.springframework.org/schema/context”
xsi:schemaLocation=”
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/flex
http://www.springframework.org/schema/flex/spring-flex-1.0.xsd”>
<bean class=”org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping”/>
<!-- The front controller of this Spring Web application, responsible for
handling all application requests-->
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/flex-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<bean class=”org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter” />
<context:annotation-config />
<!-- procura por controladores anotados para flex -->
<context:component-scan
base-package=”com.aula.flex”
annotation-config=”true” />
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>20</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<flex:message-broker
services-config-path=”WEB-INF/flex/services-config.xml”>
<flex:mapping pattern=”/messagebroker/*” />
</flex:message-broker>
</beans>
Implementações
</web-app>
Um novo arquivo do Spring precisa ser adicionado, é um descritor exclusivamente para o MVC do Spring. A Listagem 3 mostra como deve ser:
44 www.mundoj.com.br
No arquivo Index.mxml (main da aplicacao_flex), vamos declarar alguns
componentes que fazem o RPC e outros componentes visuais para entrada e exibição de dados.
$SJBOEPBQMJDBÎÜFTSJDBTDPN"EPCF'MFYF+BWB
Listagem 4. ( Main da aplicacao_flex Index.mxml).
<?xml version=”1.0” encoding=”utf-8”?>
<mx:Application horizontalAlign=”center” verticalAlign=”middle”
layout=”horizontal”
xmlns:mx=”http://www.adobe.com/2006/mxml” >
<mx:Script>
<![CDATA[
import models.Pessoa;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
public function submit():void{
var pessoa:Pessoa = new Pessoa;
pessoa.nome = txtNome.text;
pessoa.dtNascimento = txtDtNascimento.selectedDate;
pessoa.email = txtEmail.text;
servicoJava.getOperation(‘submit’).send(pessoa);
}
public function aconteceuFalha(evento:FaultEvent):void{
Alert.show(evento.fault.faultString);
}
public function aconteceuSucesso(evento:ResultEvent):void{
Alert.show(‘objeto: \n’ + ObjectUtil.toString(evento.result) );
}
]]>
</mx:Script>
<mx:RemoteObject id=”servicoJava” destination=”servicoJavaCtrl”>
<mx:method name=”submit” fault=”{aconteceuFalha(event)}”
result=”{aconteceuSucesso(event)}” />
</mx:RemoteObject>
<mx:Panel width=”467”>
<mx:Form width=”100%”>
<mx:FormItem label=”Entre com seu nome:” width=”100%”>
<mx:TextInput id=”txtNome” width=”100%” />
</mx:FormItem>
<mx:FormItem width=”100%”>
<mx:DateField id=”txtDtNascimento” />
</mx:FormItem>
<mx:FormItem width=”100%” label=”Entre com seu email:”>
<mx:TextInput id=”txtEmail” width=”100%” />
</mx:FormItem>
</mx:Form>
<mx:ControlBar>
<mx:Button label=”enviar” click=”{submit()}” />
</mx:ControlBar>
</mx:Panel>
</mx:Application>
Note que, nessa marcação MXML, temos alguns componentes instanciados que são representações literais de classes AS3. Também há um corpo
de códigos em AS3 dentro da tag mx:Script (essa tag define um escopo
AS3 dentro de um MXML). Agora, vamos explicar um pouco sobre o que
cada componente faz, para ficar mais claro o entendimento deste artigo.
t 0DPNQPOFOUF"QQMJDBUJPO
Esse componente é similar ao método main() de uma aplicação
Java. A partir desse ponto é que todas as classes AS3 deverão ser
instanciadas. Um projeto Flex deve conter apenas um Application.
t 0DPNQPOFOUF3FNPUF0CKFDU
Esse componente é responsável por fazer as invocações das classes
remotas disponíveis em algum do servidor back-end. Neste caso,
esperando por classes java.
Atributo id
nome da instância do componente
Atributo destination
nome da instância do destino remoto
t 0DPNQPOFOUF.FUIPE
Esse componente é filho de RemoteObject e apenas serve para mapear
os métodos assinados que estarão disponíveis na classe destination. Para
cada instância de mx:method, é requerido dois outros métodos em AS3
que vão receber dois tipos de eventos:
evento:FaultEvent
Quando acontece alguma falha no servidor
evento:ResultEvent
Quando o serviço executou a operação
t 0DPNQPOFOUF1BOFM
Esse componente simplesmente exibe uma janela.
t 0DPNQPOFOUF'PSN
Esse componente organiza elementos de formulários.
t 0DPNQPOFOUF'PSN*UFN
Simplesmente exibe um item para o formulário.
t 0DPNQPOFOUF5FYU*OQVU
Exibe um item de entrada de texto.
t 0DPNQPOFOUF#VUUPO
Exibe um botão.
Isso é bem básico, mas vamos entrar com valores simples, construir um
objeto e passar esse objeto como argumento para um método de uma
classe Java que esteja disponibilizada como Destino Remoto e, a partir
daí, o desenvolvedor pode executar operações, como fazer a persistência
com o banco de dados. Provavelmente, o desenvolvedor vai perceber que
as classes persistentes ficam do lado Java. Agora é necessário espelhar as
entidades para o Flex, e assim, trabalharemos com os mesmos objetos dos
dois lados. Isso caracteriza o CAST de AMF para Java, feito pelo BlazeDs.
No Projeto aplicacao_flex, clique com o botão direito do mouse, New /
ActionScript Class e crie uma classe Pessoa, que contenha os mesmos
atributos e seja similar a entidade Pessoa.java, conforme a Listagem 2.
Listagem 5. Representação AS3 da modelo Pessoa.java.
Figura 5. Resultado dessa marcação mxml, compilada para *.swf.
package models
{
[RemoteClass(alias=” com.aula.flex.models.Pessoa”)]
[Bindable]
public class Pessoa
{ // construtor
public function Pessoa(){
}
public var id:Number;
public var nome:String;
public var dtNascimento:Date;
public var email:String;
}
}
45
$SJBOEPBQMJDBÎÜFTSJDBTDPN"EPCF'MFYF+BWB
É importante observar a anotação do Flex [RemoteClass(alias="com.
javaflex.models.Pessoa")]. Ela é responsável por fazer a “amarração”
entre a classe Pessoa.as e a entidade persistente Pessoa.java. Note que
as duas classes devem ter os mesmos atributos, seguindo as suas normas
declarativas de cada linguagem.
Agora vamos à classe que somente o Flex deve conhecer. No seu projeto
aplicacao_java, crie uma classe com o mesmo nome do destination que
você colocou na sua invocação RPC, conforme a Listagem 3.
Listagem 8. Implementação do Serviço de Pessoa.
package com.aula.flex.dao.ui;
import com.aula.flex.models.Pessoa;
@Service // anotação do Spring
public class PessoaDaoImp implements PessoaDaoUI {
public Pessoa add(Pessoa pessoa) throws Exception {
System.out.println(“Persistencia com Hibernate”);
Listagem 6. Modelo Pessoa.java.
System.out.println(“persistiu Pessoa: “ + pessoa.getNome() );
package com.aula.flex.models.Pessoa;
public class Pessoa{
private Integer id;
private String nome;
private Date dtNascimento;
private String email;
// getters and setters omitidos
}
return pessoa;
}
}
Listagem 9. Classe disponibilizada como Destino Remoto para
o flex.
package com.aula.flex.ctrls;
Listagem 7. Interface de Serviços de Pessoa.
import org.springframework.context.ApplicationContext;
import org.springframework.flex.remoting.RemotingDestination;
package com.aula.flex.dao.ui;
import org.springframework.stereotype.Controller;
import com.aula.flex.models.Pessoa;
import org.springframework.web.context.support.WebApplicationContex-
@Transactional// anotação do Spring
tUtils;
public interface PessoaDaoUI {
import com.javaflex.dao.ui.PessoaDaoUI;
public Pessoa add(Pessoa pessoa) throws Exception;
}
O Spring vai usar IoC para garantir que os serviços de persistência estejam
disponíveis nos métodos que o Flex irá invocar através dos controladores
@RemotingDestination.
import com.javaflex.models.Pessoa;
import flex.messaging.FlexContext;
@Controller
@RemotingDestination
public class ServicoJavaCtrl {
/*
Esta classe Java recebe duas anotações:
t !$POUSPMMFS
O MVC do Spring define que essa classe é um controlador (um bean
que pode ser acessado a partir de uma visão qualquer).
t !3FNPUJOH%FTUJOBUJPO
Essa anotação do pacote Spring-Flex determina que essa classe é
um Destino Remoto e que será disponibilizada para invocações
RPC. A marcação @RemotingDestination possui um parâmetro que
o desenvolvedor pode definir qual será o nome do destino remoto.
Este nome é o mesmo na construção do objeto para o RPC do Flex:
<mx:RemoteObject id="servicoJava" destination="servicoJavaCtrl">
* O AMF do Flex só deve conhecer essa camada de classe
* a partir daqui, é puramente codigo java.
* */
public Pessoa submit(Pessoa pessoa) throws Exception{
// procura o contexto Flex dentro do spring
ApplicationContext ctx = WebApplicationContextUtils.
getWebApplicationContext( FlexContext.getServletContext() );
// injeção de dependencia do spring
final PessoaDaoUI pessoaDao = (PessoaDaoUI) ctx.getBean(“pessoaDaoImp”);
// chamada a persistencia com o hibernate
return pessoaDao.doRegraSalvar(pessoa);
Se não fornecer nenhum nome, o próprio nome da classe será o nome do
destino remoto.
Repare que o nome do método na aplicação Java (submit) deve ser
exatamente o mesmo nome do método que está descrito no MXML da
aplicacao_flex, e obrigatoriamente os métodos devem possuir a mesma
assinatura.
Para rodar a sua aplicação, inicie a aplicacao_java no servidor Tomcat.
Depois, volte ao projeto aplicacao_flex e clique com botão direito no
main (Index.mxml ) / Run Application.
46 www.mundoj.com.br
}
}
Conclusão
O objetivo deste artigo é mostrar como é feita a comunicação do Adobe Flex para o Java e vice-versa. A base dessa comunicação é o AMF,
formato disponibilizado pela própria Adobe. Mais especificamente para
um formato Java EE, utilizamos o framework BlazeDs. Sua configuração
$SJBOEPBQMJDBÎÜFTSJDBTDPN"EPCF'MFYF+BWB
é bem básica, mas usamos aqui o auxílio do Spring, para disponibilizar
classes como destinos remotos com a ajuda das suas anotações fugindo
um pouco de marcações xml.
Dessa forma, é dever do desenvolvedor implementar os seus casos de
uso, e buscar aprender um pouco mais sobre as tecnologias abordadas
aqui. Fora mais conhecimento da linguagem, ainda falta abordar assuntos
como transações, segurança, e falar mais sobre o próprio modelo MVC da
camada Flex.
Com esse exemplo, foi mostrado um pouco sobre o comportamento do
Adobe Flex e como são suas formas de comunicação, sobretudo com a
linguagem Java, o que é meramente um trabalho de configuração.
Obviamente, estes passos poderiam ser explorados com a ausência das
IDE, mas acredito ser um passo desnecessário.
Agradecimentos
A minha querida Renata de Paula, por revisar este artigo e por compreender o tempo gasto necessário para realização dele.
Referências
t4QSJOHIUUQTQSJOHGSBNFXPSLPSH
t"EPCF'MFYIUUQXXXBEPCFDPNnFY
t#MB[F%TIUUQPQFOTPVSDFBEPCFDPNXJLJEJTQMBZCMB[FET#MB[F%4
t)JCFSOBUFIUUQTXXXIJCFSOBUFPSH
t&DMJQTFIUUQXXXFDMJQTFPSHEPXOMPBET
t'MFY#VJMEFSIUUQXXXBEPCFDPNHPnFY@USJBM
t5PNDBUIUUQUPNDBUBQBDIFPSH
t#MB[F%TIUUQPQFOTPVSDFBEPCFDPNXJLJEJTQMBZCMB[FET#MB[F%4
t4QSJOHIUUQXXXTQSJOHTPVSDFPSHEPXOMPBE
t4QSJOH#MB[F%T*OUFHSBUJPOIUUQXXXTQSJOHTPVSDFPSHTQSJOHnFY
t+TPO'BDUPSZIUUQSFQPTJUPSZDPEFIBVTPSHPSHDPEFIBVTKBDLTPOKBDLTPOKBYST
KBDLTPOKBYSTKBS
47
Download