ago 17 2008

O modo Google de ser

Categoria: Google, PessoalVinícius Sandim @ 12:28

Não é atoa que o Google é uma das empresas de maior valor de mercado no mundo, depois de já te ouvido falar que enviaram aspirinas a um usuário que estava reclamando que a gigante de buscas da internet estava lhe dando dor de cabeça, hoje, quando eu estava alterando os meus e-mails da empresa, me deparei com uma mensagem no Gmail.

“Você não recebeu nenhum e-mail. Nossos servidores estão se sentindo rejeitados.” Veja…

Hahahah… é impressionante como que uma empresa do tamanho do Google, e que não tem nenhum contato pessoal com a maioria de seus clientes, consegue manter o ar humano do negócio, apresentado em pequenos detalhes em seus produtos, e eu, entusiasta do termo “Menos é Mais”, não poderia deixar passar essa.


ago 14 2008

Primeiro livro sobre Flex em Português-Brasil

Categoria: Flex, Livros, NovidadesVinícius Sandim @ 22:07

Amanhã, dia 15/08, é o lançamento oficial do primeiro livro sobre Flex do Brasil. O autor é Daniel Schmitz, e em 180 páginas, ele aborda diversos assuntos referentes ao framework:

  • Linguagem MXML
  • Liguagem ActionSctipt 3.0
  • Trabalhando com Data/Hora
  • Trabalhando com Strings
  • Trabalhando com Arrays
  • Efeitos Visuais
  • O SDK
  • Exemplos práticos

Isso é um passo muito importante para o Brasil, e eu gostaria de dar os parabéns a editora brasport que fez a publicação do livro, e ao Daniel pela iniciativa ,e principalmente pela “acabativa” do livro. rsrs…

AdobeFlexBuilder3


ago 09 2008

Integrando Adobe Flex - FluorineFx - C#.net (Parte 2/2)

Categoria: C#.net, Flex, FluorineFxVinícius Sandim @ 14:47

[ Assista agora a palestra sobre este post realizada durante a Flex Mania 2009 ]

Olá pessoal, hoje finalmente vou postar a segunda parte do artigo, neste post vamos utilizar os nossos métodos Insere e Lista, criados anteriormente no asp.net.

Então vamos lá…

1 - Crie um projeto no Flex do tipo Flex Project e nomeie como IntegracaoFlex.

2 - Crie uma pasta chamada mapeamento dentro da pasta src do projeto. (Botão direito do mouse sobre a pasta src New>Folder). O Flex interpreta esta pasta como um package, é um conceito muito parecido com o das Namespaces no Visual Studio. Dentro desta pasta vamos mapear as nossas classes criadas no asp.net, como no nosso exemplo temos uma classe só, a Pessoa, vamos implementa-la.

3 - Crie uma nova classe dentro de nossa pasta/package mapeamento, dê o nome de Pessoa, este nome deve ser idêntico ao da classe criada anteriormente no asp.net. (Botão direito sobre a pasta mapeamento New>ActionScript Class), preencha apenas o campo Name com o valor Pessoa.

4 - Agora vamos implementar apenas os atributos da nossa classe criada no asp.net, portanto deixe a classe pessoa da seguinte maneira:

package mapeamento
{
    [RemoteClass(alias="IntegracaoFlex.Pessoa")]
    public class Pessoa
    {
        private var _id_Pessoa:int;        
        public function get Id_Pessoa():int { return this._id_Pessoa; }        
        public function set Id_Pessoa(valor:int):void { this._id_Pessoa = valor; }
        
        private var _nome:String;        
        public function get Nome():String { return this._nome; }        
        public function set Nome(valor:String):void { this._nome = valor; }
        
        private var _telefone:String;
        public function get Telefone():String { return this._telefone; }        
        public function set Telefone(valor:String):void { this._telefone = valor; }        
        
        public function Pessoa()
        {
            
        }        
    }
}

Desta forma temos a classe Pessoa com os atibutos Id_Pessoa, Nome e Telefone, note que o conceito para o desenvolvimento dos nossos atributos é muito parecido com a do C#.net, ou seja, temos as palavras reservadas get e set para que o complilador entenda que determinada function é um atributo da classe, e não uma function convencional.

Assim como no nome da classe, o nome dos atributos também devem ser idênticos no C#.net e no ActionScript, inclusive os tipos, para que o fluorine fa’xa a serialização C#.net>ActionScript corretamente. Veja mais na documentação oficial do fluorine a tabela completa de serialização.

5 - Agora vamos realmente fazer o mapeamento dos objetos ActionScript>C#.net, para isso, crie um arquivo XML dentro da pasta src do nosso projeto e dê o nome de services-config.xml (Botão direito do mouse sobre a pasta src New>File). Preencha o campo File name com o valor services-config.xml. Deixe o arquivo da seguinte maneira:

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
 
    <services> 
 
        <service id="remoting-service" 
            class="flex.messaging.services.RemotingService" 
            messageTypes="flex.messaging.messages.RemotingMessage">
 
            <destination id="fluorine">
            
                <channels> 
                    <channel ref="my-amf"/>
                </channels> 
                
                <properties> 
                    <source>*</source> 
                </properties> 
                
            </destination> 
            
        </service> 
        
    </services> 
 
    <channels> 
    
        <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint uri="http://localhost:3024/Negocio/Gateway.aspx" 
                class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
        
    </channels> 
    
</services-config>

Agora execute o seu website criado no VisualStudio anteriormente, ele deverá exibir a lista de arquivos encontrados, isso acontece por que não temos uma página Default.aspx, clique sobre a página Gateway.aspx no navegador, ele abrirá uma pagina em branco, pois não temos nada de interface na Gateway.aspx, o que precisamos agora é do endereço dessa página, copie na barra de endereços do  navegador, deve ser algo parecido com (http://localhost:3024/Negocio/Gateway.aspx), o que vai alterar é apenas o número da porta gerado pelo servidor web do VisualStudio, e coloque o endereço na tag uri do atributo endpoint, para este endereço de sua página Gateway no arquivo XML criado agora.

6 - Agora para finalizarmos o mapeamento, precisamos informar ao compilador do Flex que a configuração de serviços remotos que utilizamos em nosso projeto é o arquivo services-config.xlm, para isso, vá até o Flex Navigator, clique com o botão direito do mouse sobre o projeto IntegracaoFlex>Properties, ele abrirá a janela de propriedades de seu projeto, vá até o menu FlexCompiler e deixe o campo Additional compiler arguments com o seguinte valor:

-locale en_US -services services-config.xml

7 - Pronto, o nosso projeto está configurado e vai enxergar a nossa classe no asp.net, agora vamos testar.

8 - Abra o arquivo principal de nosso projeto, o IntegracaoFlex.mxml e adicione uma tag <mx:Script></mx:Script>.

Dentro da tag importe os seguintes packages:

import mx.collections.ArrayCollection;
import mx.rpc.remoting.mxml.RemoteObject;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;            
import mx.controls.Alert;            
import mapeamento.Pessoa;

Logo abaixo, crie duas functions:

/**
 * Prepara um objeto remoto para executar um método no asp.net.
**/
private function preparaRemoteObj(fncFalha:Function, fncOk:Function = null):RemoteObject{
    //Instancia um objeto remoto pegando as configurações do nosso arquivo services-config.xml
    var remoteObj:RemoteObject = new RemoteObject("fluorine"); //<destination id="fluorine">
    remoteObj.source = "IntegracaoFlex.Pessoa"; // Namespace.NomeDaClasse no ASP.net
    remoteObj.showBusyCursor = true; // Exibe o relogio no lugar do cursor durante a requisição
    
    //Adiciona o evento falha na lista de eventos do ojeto remoto
    remoteObj.addEventListener(FaultEvent.FAULT, fncFalha); 
    
    //Verifica se é null porque nem sempre um método vai retornar algum valor.
    if (fncOk != null)  
        //Adiciona a funcao passada como parametro neste método,
        //ela é responsável por tratar o retorno do método asp.net
        remoteObj.addEventListener(ResultEvent.RESULT, fncOk);  
                                                               
    
    return remoteObj; //retorna o objeto remoto configurado.
}
 
/**
 * Tratamento de erro do método executado no asp.net.
**/
private function rstFalha(evt:FaultEvent):void{
    Alert.show("Ocorreu o seguinte erro ao tentar executar o método:\n" + 
    evt.fault.message, "Erro");
}

A function preparaRemoteObj instancia um objeto do tipo RemoteObject e o configura para executar os métodos do asp.net. (vide comentários)

A function rstFalha trata um possível erro durante a chamada do método asp.net.

TESTANDO O MÉTODO INSERE

9 - Como vocês devem ter visto, por enquanto não executamos nenhum método do asp.net ainda, vamos fazer isto agora. Primeiramente vamos testar o método Insere criado anteriormente chamando-o em um evento click de um button, portanto adicione 3 componentes Label, 3 componentes TextInput e 1 componente Button. Renomeie os componentes da seguinte forma:

TextInputs: txtId_Pessoa, txtNome, txtTelefone

Button: btnInserir

10 - Agora vamos criar mais duas functions dentro de nossa tag <mx:Script></mx:Script>:

/**
 * Tratamento do retorno do método Insere executado no asp.net.
**/
private function rstSucessoInsere(evt:ResultEvent):void{
    if (evt.result != null){
        Alert.show("Método executado com sucesso!\n\n" + 
        (evt.result as String), "Ok");
    }
}
 
/**
 * Evento click do botão Inserir.
**/
private function btnInserir_click(evt:MouseEvent):void{
    if (evt.type == MouseEvent.CLICK){
        
        //Configura a Pessoa
        var pessoa:Pessoa = new Pessoa;
        pessoa.Id_Pessoa = int(txtId_Pessoa.text);
        pessoa.Nome = txtNome.text;
        pessoa.Telefone = txtTelefone.text;
        
        //Executa o método no asp.net
        var remoteObj:RemoteObject = preparaRemoteObj(rstFalha, rstSucessoInsere);                    
        remoteObj.getOperation("Insere").send(pessoa);
    }
}

11 - Agora adicione a tag click="btnInserir_click(event);" no button btnInserir, ele ficará da seguinte forma:

<mx:Button x="167" y="96" 
    label="Inserir" 
    id="btnInserir" 
    click="btnInserir_click(event);"/>

12 - Para testarmos a aplicação, primeiramente execute o website no visual studio, depois compile o projeto no flex. O navegador será aberto, preencha os campos e clique sobre o botão Inserir. Vocé deverá ver uma mensagem na tela com dos dados do cliente inserido. Caso ocorreu algum erro, verifique se todos os passos foram feitos corretamente.

TESTANDO O MÉTODO LISTA

13 - Finalmente vamos testar o nosso método Lista que retorna um List<Pessoa> do asp.net. Para isso adicione 1 componente DataGrid e 1 Componente Button. Renomeie os componentes da seguinte forma:

DataGrid: grdPessoas

Button: btnLista

14 - Edite as colunas do DataGrid deixando-as da seguinte forma:

<mx:DataGrid y="42" width="489" right="10" id="grdPessoas" height="200">
    <mx:columns>
        <mx:DataGridColumn headerText="Id" dataField="Id_Pessoa" width="20"/>
        <mx:DataGridColumn headerText="Nome" dataField="Nome" width="40"/>
        <mx:DataGridColumn headerText="Telefone" dataField="Telefone" width="40"/>
    </mx:columns>
</mx:DataGrid>

Note que o atributo dataField deve ser idêntico ao atributo da classe Pessoa que será retornado.

15 - Agora vamos criar duas functions para a execução do evento, uma é para o click do botao btnLista, e outra para tratar  retorno do método:
 
/**
 * Tratamento do retorno do método Lista executado no asp.net.
**/
private function rstSucessoLista(evt:ResultEvent):void{
    if (evt.result != null){
        grdPessoas.dataProvider = (evt.result as ArrayCollection);
    }
}
 
/**
 * Evento click do botao Lista
**/
private function btnListar_click(evt:MouseEvent):void{
    if (evt.type == MouseEvent.CLICK){
        
        //Executa o método no asp.net
        var remoteObj:RemoteObject = preparaRemoteObj(rstFalha, rstSucessoLista);                    
        remoteObj.getOperation("Lista").send();
    }
}

 
16 - Finalmente adicionamos a tag click no botao btnLista assim como foi feito no btnInserir, deixando-o da seguibte forma:
 
<mx:Button y="12" right="10"
    label="Listar"  
    id="btnListar" 
    click="btnListar_click(event);"/>

 
17 - Para testar, caso a aplicação web não esteja rodando, execute-a no VisualStudio, depois compile o Flex para roda-la. Clique sobre o botão Listar, note que o grid será populado com os dados que inserimos na lista do asp.net.
Bom pessoal, é isso, um tutorial básico para integração do flex com o .net, executando métodos que esperam parâmetros complexos, e retornam lista. Espero ter ajudado, qualquer dúvida é só deixar um comentário.
 
Até a próxima.