CRUD – Flex + Java

Neste post irei demonstrar como criar e executar um simples CRUD utilizando Flex + Java.
A comunicação entre objetos Flex/Java acontece por um protocolo binário denominado de AMF que se encarrega de compactar e transferir os dados. Atualmente temos várias implementações que suportam o protocolo AMF, no exemplo demonstrativo utilizo o BlazeDS para fazer a comunicação Java/Flex.
No fim do post disponibilizo o projeto completo que pode ser facilmente importado e executado.
É necessário que o leitor saiba o básico de programação Web utilizando banco de dados.

Versões utilizadas

  • Adobe Flex Builder 3.0 (build 3.0.2.214193)
  • JDK 1.6.0_18
  • Apache Tomcat 6.0.24
  • BlazeDS 3.2.0.3978
  • MySQL Server 5.1
  • MySQL Query Browser 1.1.17
  • Hibernate 3

Estrutura do Projeto

Preparando o Ambiente

  • Com o Flex Builder 3 instalado vamos importar o projeto que pode ser baixado >>>aqui<<<.
  • Descompacte o projeto em seu Workspace
  • File → Import → Other… → Existing Projects into Workspace → Next → Select Root Directory (Escolha o projeto que foi descompactado no Workspace) → Finish

Adicionando o Tomcat ao Projeto

  • Descompacte o Tomcat seu diretório preferido
  • No Flex Builder 3 clique em: File → New → Other… → Server → Apache → Tomcat v6.0 Server → Next → Adicione o projeto ao lado direito → Finish

Configurando o MySQL

  • Com o MySQL instalado e iniciado crie em sua ferramenta favorita um novo Schema denominado pessoas. Eu particularmente gosto do MySQL Query Browser
  • Login e senha: root que poderá ser alterada no arquivo hibernate.cfg.xml
  • Vamos deixar para o Hibernate a tarefa de criação da tabela. Para isso execute a seguinte classe que está na pasta src_java: br.com.serjaum.util.GerarTabelas.java
  • Clique com o botão direito sobre a classe GerarTabelas.java → Run As → Java Application

Você poderá ver a seguinte saída no Console do Flex Builder 3:

drop table if exists pessoa

create table pessoa (

pessoa_id integer not null auto_increment,

cpf varchar(255),

email varchar(255),

nome varchar(255),

tel_cel varchar(255),

primary key (pessoa_id)

) type=InnoDB

21:22:21,014 INFO SchemaExport:268 – schema export complete

21:22:21,014 INFO DriverManagerConnectionProvider:170 – cleaning up connection pool: jdbc:mysql://localhost/pessoas

Iniciando o Tomcat

  • Na aba Server do Flex Builder 3 clique com o botão direito em cima de Tomcat v6.0 Server at localhost → Start
  • Trecho da saída no Console do Flex Builder 3:

28/04/2010 21:34:16 org.apache.coyote.http11.Http11Protocol start

INFO: Starting Coyote HTTP/1.1 on http-8080

28/04/2010 21:34:16 org.apache.jk.common.ChannelSocket init

INFO: JK: ajp13 listening on /0.0.0.0:8009

28/04/2010 21:34:16 org.apache.jk.server.JkMain start

INFO: Jk running ID=0 time=0/31 config=null

28/04/2010 21:34:16 org.apache.catalina.startup.Catalina start

INFO: Server startup in 3349 ms

Com o Tomcat iniciado podemos executar a nossa aplicação clicando com o botão direito em cima do arquivo crud.mxml: Run as → Flex Application

Aplicação Executada

Pasta com as classes Java

Na pasta com as classes Java encontramos a seguinte estrutura:

MXML → Delegate → Service → DAO → BD

Pasta com os arquivos Flex

A classe ActionScript responsável por representar remotamente a classe Java remota é a Pessoa.as. Todos os atributos presentes na classe Java são definidos na classe Pessoa.as que contém:

[RemoteClass(alias=“br.com.serjaum.model.Pessoa”)].

Pessoa.java

@Entity
@Table(name=”pessoa”)
public class Pessoa implements Serializable {

private static final long serialVersionUID = 2174678509151116408L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name=”pessoa_id”)
private Integer id;

@Column(name=”nome”)
private String nome;

@Column(name=”email”)
private String email;

@Column(name=”cpf”)
private String cpf;

@Column(name=”tel_cel”)
private String telefoneCelular;

// get’s/set’s

}

Pessoa.as

[Bindable]
[RemoteClass(alias=”br.com.serjaum.modelo.Pessoa”)]

public class Pessoa {

public function Pessoa(){

}

public var id:int;
public var nome:String;
public var cpf:String;
public var email:String;
public var telefoneCelular:String;

}

Invocando Serviços Remotos

Para que aconteça a invocação remota dos serviços Java temos que declarar no arquivo remoting-config.xml as classes que serão acessadas remotamente. Neste caso teremos somente a classe PessoaDelegate que é responsável por invocar os serviços Java disponibilizados.

remoting-config.xml

<destination id=“pessoaDelegate”>

<properties>

<source>br.com.serjaum.delegate.PessoaDelegate</source>

</properties>

</destination>

BlazeDS

O arquivo remoting-config.xml faz parte do BlazeDS que é composto por toda a pasta WEB-INF.

Assim que baixamos e descompactamos o BlazeDS encontramos o arquivo blazeds.war que contém as pastas WEB-INF e META-INF. Para que a integração Java/Flex aconteça devemos adicionar a pasta WEB-INF ao projeto.

Jars

Tanto os jars Java quanto os jars Flex que acompanham o BlazeDS estão na pasta lib da aplicação.

crud.mxml

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml&#8221; layout=”absolute” backgroundImage=”images/fundo.jpg”>
<mx:Style>
Application {
background-color:””;
background-image:””;
padding: 0px;
}
</mx:Style>

<mx:TitleWindow x=”307″ y=”38″ width=”640″ height=”244″ layout=”absolute” title=”CRUD Flex + Java”>
<mx:Button id=”botaoRemover” label=”Remover” click=”this.invocarFormRemover()” x=”155.5″ y=”76″ width=”124.5″ height=”46″/>
<mx:Button id=”botaoAtualizar” x=”464″ y=”76″ label=”Atualizar” click=”this.invocarFormAtualizar()” width=”116″ height=”46″/>
<mx:Button id=”botaoInserir” x=”20″ y=”76″ label=”Inserir” click=”this.invocarFormSalvar()” width=”103.5″ height=”46″/>
<mx:Button id=”botaoPesquisar” x=”315″ y=”76″ label=”Pesquisar” click=”this.invocarFormPesquisar()” width=”119″ height=”46″/>

<mx:Script>
<![CDATA[
import mx.managers.PopUpManager;

private function invocarFormSalvar():void {
var popupSalvaForm : salva_form = new salva_form();
PopUpManager.addPopUp(popupSalvaForm, this, true );
PopUpManager.centerPopUp(popupSalvaForm);
}

private function invocarFormAtualizar():void {
var popupAtualizaForm : atualiza_form = new atualiza_form();
PopUpManager.addPopUp(popupAtualizaForm, this, true );
PopUpManager.centerPopUp(popupAtualizaForm);
}

private function invocarFormPesquisar():void {
var popupPesquisaForm : pesquisa_form = new pesquisa_form();
PopUpManager.addPopUp(popupPesquisaForm, this, true );
PopUpManager.centerPopUp(popupPesquisaForm);
}

private function invocarFormRemover():void {
var popupRemoverForm : remove_form = new remove_form();
PopUpManager.addPopUp(popupRemoverForm, this, true );
PopUpManager.centerPopUp(popupRemoverForm);
}

]]>
</mx:Script>
</mx:TitleWindow>
</mx:Application>

salva_form.mxml

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml&#8221; layout=”absolute” width=”1120″ height=”664″>

<mx:RemoteObject id=”servico” destination=”pessoaDelegate” showBusyCursor=”true” result=”handleLoadResult(event)”/>

<mx:TitleWindow x=”307″ y=”38″ width=”600″ height=”448″ layout=”absolute”
close=”PopUpManager.removePopUp(this)”
title=”Adicionar contato”
showCloseButton=”true”
creationComplete=”listaTodasPessoas()”>

<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.List;
import mx.managers.PopUpManager;
import objetos.Pessoa;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;

[Bindable]
private var message:String;

[Bindable]
private var pessoas:ArrayCollection = new ArrayCollection();

[Bindable]
private var pessoa:Pessoa = new Pessoa();

public function limparCampos():void {
campo_nome.text = “”;
campo_cpf.text = “”;
campo_email.text = “”;
campo_cel.text = “”;
}

private function handleLoadResult(ev:ResultEvent):void {
pessoas = ev.result as ArrayCollection;
}

private function handleFault(ev:FaultEvent):void {
message = “Erro: ” + ev.fault.faultCode + ” \n ”
+ “Detalhe: ” + ev.fault.faultDetail + ” \n ”
+ “Mensagem: ” + ev.fault.faultString;
}

public function listaTodasPessoas():void {
servico.getPessoas();
}

public function salvarPessoa():void {
pessoa.nome = campo_nome.text;
pessoa.cpf = campo_cpf.text;
pessoa.email = campo_email.text;
pessoa.telefoneCelular = campo_cel.text;

if(pessoa.nome!= “” && pessoa.cpf != “” && pessoa.email != “” && pessoa.telefoneCelular != “”){
servico.save(pessoa);
Alert.show(“Pessoa inserida com sucesso”, “Inserir”, Alert.OK, null, null, null, Alert.OK);
limparCampos();
listaTodasPessoas();
}else{
Alert.show(“Preencha todos os campos”, “Alerta”, Alert.OK, null, null, null, Alert.OK);
}
}

]]>
</mx:Script>

<mx:Button id=”botaoSalvar” x=”29″ y=”153″ click=”salvarPessoa()” label=”Inserir” width=”93.5″ height=”26″/>

<mx:DataGrid x=”20″ y=”201″ width=”515″ height=”197″ dataProvider=”{pessoas}”>
<mx:columns>
<mx:DataGridColumn headerText=”Nome ” dataField=”nome”/>
<mx:DataGridColumn headerText=”CPF ” dataField=”cpf”/>
<mx:DataGridColumn headerText=”E-mail ” dataField=”email”/>
<mx:DataGridColumn headerText=”Celular ” dataField=”telefoneCelular”/>
</mx:columns>
</mx:DataGrid>

<mx:Label x=”29″ y=”22″ text=”Nome”/>
<mx:TextInput id=”campo_nome” x=”114″ y=”20″ width=”298″/>
<mx:Label x=”29″ y=”50″ text=”CPF”/>
<mx:TextInput id=”campo_cpf” x=”114″ y=”48″ width=”129″/>
<mx:Label x=”29″ y=”80″ text=”E-mail”/>
<mx:TextInput id=”campo_email” x=”114″ y=”78″ width=”298″/>
<mx:Label x=”29″ y=”114″ text=”Cel. “/>
<mx:TextInput id=”campo_cel” x=”114″ y=”112″ width=”129″/>
</mx:TitleWindow>

<mx:StringValidator source=”{campo_nome}” property=”text” required=”false” />
<mx:StringValidator source=”{campo_cpf}” property=”text” required=”false” />
<mx:StringValidator source=”{campo_cel}” property=”text” required=”false” />
<mx:EmailValidator  source=”{campo_email}” property=”text” required=”false” />
</mx:Application>

remove_form.mxml

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml&#8221; layout=”absolute” width=”1120″ height=”664″>

<mx:RemoteObject id=”servico” destination=”pessoaHandler” showBusyCursor=”true” result=”handleLoadResult(event)”/>

<mx:TitleWindow x=”307″ y=”38″ width=”600″ height=”366″ layout=”absolute”
close=”PopUpManager.removePopUp(this);”
title=”Remover contato”
showCloseButton=”true”
creationComplete=”listaTodasPessoas()”>

<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.List;
import mx.managers.PopUpManager;
import objetos.Pessoa;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;

[Bindable]
private var pessoas:ArrayCollection = new ArrayCollection();

[Bindable]
private var message:String;

[Bindable]
private var pessoa:Pessoa = new Pessoa();

[Bindable]
private var idToRemove:int;

public function limparCampos():void {
campo_nome.text = “”;
}

public function listaTodasPessoas():void {
servico.getPessoas();
}

private function handleLoadResult(ev:ResultEvent):void {
pessoas = ev.result as ArrayCollection;
}

private function handleFault(ev:FaultEvent):void {
message = “Erro: ” + ev.fault.faultCode + ” \n ”
+ “Detalhe: ” + ev.fault.faultDetail + ” \n ”
+ “Mensagem: ” + ev.fault.faultString;
}

private function atribuiIdToRemove():void {
idToRemove = dataGrid.selectedItem.id;
}

private function removerPessoa(idPessoa:int):void{
if(dataGrid.selectedItem.id != 0){
servico.remove(idPessoa);
Alert.show(“Pessoa removida com sucesso”, “Remover”, Alert.OK, null, null, null, Alert.OK);
limparCampos();
listaTodasPessoas();
}else{
Alert.show(“Nenhuma pessoa encontrada”, “Mensagem”, Alert.OK, null, null, null, Alert.OK);
}
}

]]>

</mx:Script>

<mx:Button id=”botaoRemover” x=”32.5″ y=”286″ click=”removerPessoa(idToRemove)” enabled=”{dataGrid.selectedIndex != -1}” label=”Remover” width=”90.5″ height=”22″/>

<mx:DataGrid
id=”dataGrid”
x=”32.5″ y=”61″ width=”515″ height=”217″
dataProvider=”{pessoas}”
click=”atribuiIdToRemove();”
toolTip=”Selecione uma pessoa e clique em Remover”
doubleClickEnabled=”true”>

<mx:columns>
<mx:DataGridColumn headerText=”Nome ” dataField=”nome”/>
<mx:DataGridColumn headerText=”CPF ” dataField=”cpf”/>
<mx:DataGridColumn headerText=”E-mail ” dataField=”email”/>
<mx:DataGridColumn headerText=”Celular ” dataField=”telefoneCelular”/>
</mx:columns>
</mx:DataGrid>

<mx:Label x=”29″ y=”22″ text=”Nome”/>
<mx:TextInput id=”campo_nome” text=”{dataGrid.selectedItem.nome}” x=”114″ y=”20″ width=”298″/>
</mx:TitleWindow>

</mx:Application>

pesquisa_form.mxml

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml&#8221; layout=”absolute” width=”1120″ height=”664″>

<mx:RemoteObject id=”servico” destination=”pessoaHandler” showBusyCursor=”true” result=”handleLoadResult(event)”/>

<mx:TitleWindow x=”307″ y=”38″ width=”601″ height=”467″ layout=”absolute”
title=”Pesquisar contato”
close=”PopUpManager.removePopUp(this)”
showCloseButton=”true”>

<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.List;
import mx.managers.PopUpManager;
import objetos.Pessoa;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;

[Bindable]
private var pessoas:ArrayCollection = new ArrayCollection();

[Bindable]
private var pessoa:Pessoa = new Pessoa();

public function limparCampos():void {
campo_nome.text = “”;
}

public function listaTodasPessoas():void {
servico.getPessoas();
}

private function handleLoadResult(ev:ResultEvent):void {
pessoas = ev.result as ArrayCollection;
}

public function pesquisar(nome:String) : void {
pessoas = servico.getPessoasByNome(nome) as ArrayCollection;
}

]]>

</mx:Script>

<mx:DataGrid
id=”dataGrid”
x=”32.5″ y=”61″ width=”515″ height=”217″
dataProvider=”{pessoas}”
doubleClickEnabled=”true”>

<mx:columns>
<mx:DataGridColumn headerText=”Nome ” dataField=”nome”/>
<mx:DataGridColumn headerText=”CPF ” dataField=”cpf”/>
<mx:DataGridColumn headerText=”E-mail ” dataField=”email”/>
<mx:DataGridColumn headerText=”Celular ” dataField=”telefoneCelular”/>
</mx:columns>
</mx:DataGrid>

<mx:Label x=”29″ y=”22″ text=”Digite o nome” width=”96″/>
<mx:TextInput id=”campo_nome” toolTip=”Digite parte do nome e clique em Buscar” x=”133″ y=”20″ width=”320″/>

<mx:Label x=”32.5″ y=”295″ text=”Nome”/>
<mx:TextInput id=”campo_nome0″ enabled=”false” x=”117.5″ y=”293″ width=”364″ text=”{dataGrid.selectedItem.nome}”/>
<mx:Label x=”32.5″ y=”323″ text=”CPF”/>
<mx:TextInput id=”campo_cpf” enabled=”false” x=”117.5″ y=”321″ width=”129″ text=”{dataGrid.selectedItem.cpf}”/>
<mx:Label x=”32.5″ y=”353″ text=”E-mail”/>
<mx:TextInput id=”campo_email” enabled=”false” x=”117.5″ y=”351″ width=”291″ text=”{dataGrid.selectedItem.email}”/>
<mx:Label x=”32.5″ y=”387″ text=”Cel. “/>
<mx:TextInput id=”campo_cel” enabled=”false” x=”117.5″ y=”385″ width=”129″ text=”{dataGrid.selectedItem.telefoneCelular}”/>

<mx:Button x=”461″ y=”20″ label=”Buscar” click=”pesquisar(campo_nome.text);” width=”86.5″/>
</mx:TitleWindow>

</mx:Application>

atualiza_form.mxml

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml&#8221; layout=”absolute” width=”1120″ height=”664″>

<mx:RemoteObject id=”servico” destination=”pessoaHandler” showBusyCursor=”true” result=”handleLoadResult(event)”/>

<mx:TitleWindow x=”307″ y=”38″ width=”600″ height=”448″ layout=”absolute”
close=”PopUpManager.removePopUp(this);”
title=”Atualizar dados”
showCloseButton=”true”
creationComplete=”listaTodasPessoas()”>

<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.List;
import mx.managers.PopUpManager;
import objetos.Pessoa;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;

[Bindable]
private var pessoas:ArrayCollection = new ArrayCollection();

[Bindable]
private var pessoa:Pessoa = new Pessoa();

private function handleLoadResult(ev:ResultEvent):void {
pessoas = ev.result as ArrayCollection;
}

public function listaTodasPessoas():void {
servico.getPessoas();
}

public function atualizarPessoa():void {
pessoa.id = dataGrid.selectedItem.id;
pessoa.nome = campo_nome.text;
pessoa.cpf = campo_cpf.text;
pessoa.email = campo_email.text;
pessoa.telefoneCelular = campo_cel.text;

if(campo_nome != null && campo_cpf != null && campo_email != null && campo_cel != null){
servico.merge(pessoa);
Alert.show(“Dados atualizados com sucesso”, “Atualização”, Alert.OK, null, null, null, Alert.OK);
listaTodasPessoas();
}else{
Alert.show(“Preencha todos os campos”, “Mensagem”, Alert.OK, null, null, null, Alert.OK);
}
}

]]>
</mx:Script>

<mx:Button id=”botaoAtualizar” x=”29″ y=”151″ click=”atualizarPessoa()” enabled=”{dataGrid.selectedIndex != -1}” label=”Atualizar” width=”104.5″ height=”22″/>

<mx:DataGrid id=”dataGrid” x=”20″ y=”181″ width=”515″ height=”217″
dataProvider=”{pessoas}”
toolTip=”Selecione uma pessoa para atualização”>

<mx:columns>
<mx:DataGridColumn headerText=”Nome ” dataField=”nome”/>
<mx:DataGridColumn headerText=”CPF ” dataField=”cpf”/>
<mx:DataGridColumn headerText=”E-mail ” dataField=”email”/>
<mx:DataGridColumn headerText=”Celular ” dataField=”telefoneCelular”/>
</mx:columns>
</mx:DataGrid>

<mx:Label x=”29″ y=”22″ text=”Nome”/>
<mx:TextInput id=”campo_nome” x=”114″ y=”20″  width=”298″ text=”{dataGrid.selectedItem.nome}”/>
<mx:Label x=”29″ y=”50″ text=”CPF”/>
<mx:TextInput id=”campo_cpf” x=”114″ y=”48″ width=”129″ text=”{dataGrid.selectedItem.cpf}”/>
<mx:Label x=”29″ y=”80″ text=”E-mail”/>
<mx:TextInput id=”campo_email” x=”114″ y=”78″ width=”298″ text=”{dataGrid.selectedItem.email}”/>
<mx:Label x=”29″ y=”114″ text=”Cel. “/>
<mx:TextInput id=”campo_cel” x=”114″ y=”112″ width=”129″ text=”{dataGrid.selectedItem.telefoneCelular}”/>
</mx:TitleWindow>

<mx:StringValidator source=”{campo_nome}” property=”text” required=”false” />
<mx:StringValidator source=”{campo_cpf}” property=”text” required=”false” />
<mx:StringValidator source=”{campo_cel}” property=”text” required=”false” />
<mx:EmailValidator  source=”{campo_email}” property=”text” required=”false” />
</mx:Application>

Até o próximo post!

Preparando o Ambiente

  • Com o Flex Builder 3 instalado vamos importar o projeto que pode ser baixado aqui.

  • Descompacte o projeto em seu Workspace

  • File → Import → Other… → Existing Projects into Workspace → Next →

  • Select Root Directory (Escolha o projeto que foi descompactado no Workspace) → Finish

Adicionando o Tomcat ao Projeto

  • Descompacte o Tomcat seu diretório preferido

  • No Flex Builder 3 clique em: File → New → Other… → Server → Apache → Tomcat v6.0 Server → Next → Adicione o projeto ao lado direito → Finish

Configurando o MySQL

  • Com o MySQL instalado e iniciado crie em sua ferramenta favorita um novo Schema denominado pessoas. Eu particularmente gosto do MySQL Query Browser

  • Login e senha: root que poderá ser alterada no arquivo hibernate.cfg.xml

  • Vamos deixar para o Hibernate a tarefa de criação da tabela. Para isso execute a seguinte classe que está na pasta src_java: br.com.serjaum.util.GerarTabelas.java

  • Clique com o botão direito sobre a classe GerarTabelas.java → Run As → Java Application

  • Você poderá ver a seguinte saída no Console do Flex Builder 3:

drop table if exists pessoa

create table pessoa (

pessoa_id integer not null auto_increment,

cpf varchar(255),

email varchar(255),

nome varchar(255),

tel_cel varchar(255),

primary key (pessoa_id)

) type=InnoDB

21:22:21,014 INFO SchemaExport:268 – schema export complete

21:22:21,014 INFO DriverManagerConnectionProvider:170 – cleaning up connection pool: jdbc:mysql://localhost/pessoas

Iniciando o Tomcat

  • Na aba Server do Flex Builder 3 clique com o botão direito em cima de Tomcat v6.0 Server at localhost → Start

  • Trecho da saída no Console do Flex Builder 3:

28/04/2010 21:34:16 org.apache.coyote.http11.Http11Protocol start

INFO: Starting Coyote HTTP/1.1 on http-8080

28/04/2010 21:34:16 org.apache.jk.common.ChannelSocket init

INFO: JK: ajp13 listening on /0.0.0.0:8009

28/04/2010 21:34:16 org.apache.jk.server.JkMain start

INFO: Jk running ID=0 time=0/31 config=null

28/04/2010 21:34:16 org.apache.catalina.startup.Catalina start

INFO: Server startup in 3349 ms

Com o Tomcat iniciado podemos executar a nossa aplicação clicando com o botão direito em cima do arquivo crud.mxml: Run as → Flex Application

Aplicação Executada


7 Comentários on “CRUD – Flex + Java”

  1. Leandro disse:

    Ola gostaria de saber onde encontro o codigo fonte deste projeto para download.

  2. carlos disse:

    como puedo cargar una foto en flex y guardarlo en el servidos usando java, hay ejemplo usando flex y php, pero usando flex y java ninguno.

    puedes darme una ejemplo
    gracias

  3. charly disse:

    version de eclipse usas

  4. george disse:

    parabens era isso que eu procurava obrigado
    sempre que tiver novidade mande para agente
    valew


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s