logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!
Jul 28

Estratégia para lidar com callbacks assíncronos em Silverlight

Escrito por Kelps Sousa em .NET, 1, 4, 6, action, AR, back, BI, blog, C#, class, classe, código, dados, demo, Desenvolvedor, desenvolvedores, Desenvolvimento, Download, err, erro, error, event, Evento, Eventos, exemplo, for, framework, gc, Google, html, IE, if, int, LOB, lógica, map, mg, MSDN, NaN, News, O, on, problema, Projetos, pt, RIA, Ria’s Geral, RoR, S+S, silverlight, Silverlight 4, string, tag, TAT, Tutorial, Twitter, UI, Ved, web, Web Service, web services, WebClient, XP @ 07 28th, 2011 | via http://kelps-sousa.blogspot.com/ | Sem comentários
Kelps Sousa
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Recentemente, conversando com alguns desenvolvedores no trabalho e verificando algumas perguntas publicadas nos fóruns do MSDN, eu notei que ainda há uma dificuldade muito grande tanto de compreensão quanto de implementação para trabalhar com métodos assincronos. Isso se torna um problema particularmente importante em aplicações Silverlight pois todas as chamadas a web services, RIA services, web requests, etc são obrigatoriamente feitos de forma assincrona, não havendo opções para executar essas mesmas operações da forma sincrona e linear ? qual a maioria dos desenvolvedores está acostumada.

Acontece que desenvolvimento assincrono não é difícil e, depois que você aprende e se acostuma, você acaba percebendo que suas aplicações passam a funcionar muito melhor. Sim, não vou argumentar aqui contra o fato de que é necessário se acostumar e que começo seja realmente algo estranho, mas posso garantir que demora pouco tempo para se acostumar e os benefícios são muitos.

Há muitas abordagens e estratégias possíveis para desenvolvimento assíncrono e eu vou apresentar aqui uma delas que é bem simples e que eu usei em praticamente todos os projetos Silverlight em dos quais participei. Essa abordagem não envolve o uso de nenhum framework ou biblioteca externa e pode ser utilizada tranquilamente também em projetos que não sejam Silverlight.

Digamos que você precisa obter o html de uma página web por algum motivo. Uma forma de fazer isso seria criando uma nova instância de WebClient, assinando o evento DownloadStringCompleted e depois chamando o método DownloadString passando a url. Ok, não é difícil, mas é um código repetitivo que poderia facilmente ser reaproveitado ao invés de ser copiado por toda sua aplicação em todo lugar onde você precisar fazer download de uma página. O que eu costumo fazer para esse tipo de chamada é criar um método estático em uma classe utilitária e simplesmente chamar esse método passando, nesse caso, minha url e um ponteiro de callback. É mais fácil mostrar:

public static void HttpGet(string url, Action<string, Exception> callback)     if (!string.IsNullOrWhiteSpace(url))         var client = new WebClient();        client.DownloadStringCompleted += (sender, e) =>             if (callback != null)                 callback(e.Result, e.Error);

        };        client.DownloadStringAsync(new Uri(url));    }}

Quais são as vantagens desse método:

  • para executá-lo não é necessário instanciar nenhuma classe
  • é facil de reutilizar
  • permite que a lógica da minha aplicação fique um pouco mais simples, já que não me obriga a assinar nenhum evento no meu código

Para executar esse método, eu posso usar 2 abordagens.

Abordagem 1 – Delegar o retorno para outro método. Nessa abordagem eu chamo o método HttpGet passando a url desejada e o ponteiro de um método que será executado quando o request for concluído.

private void LoadData()     HttpGet("http://kelps.net", DataLoaded);

private void DataLoaded(string data, Exception error)     if (error == null)         //utiliza os dados retornados na variável "data"

}

Abordagem 2 – Utilizar uma expressão lambda para criar um método anônimo inline no meu código, ao invés de criar uma função separada apenas para processar os dados retornados.

HttpGet("http://twitter.com/kelps", (data, error) =>     if (error == null)         //utiliza os dados retornados na variável "data"

});

A única diferença de funcionamento entre as 2 abordagens acima é que na segunda seria possível utilizar variáveis que estiverem no mesmo escopo da chamada que está sendo feita, ao passo que na primeira seria necessário que essas variáveis fossem globais da classe para que isso funcione. Nos projetos em que trabalho eu costumo utilizar ambas as abordagens, de acordo com o que faz mais sentido em cada situação. Expressões lambda são bem concisas e compactas, mas são claras para qualquer desenvolvedor.

Este foi apenas um pequeno exemplo de como trabalhar com chamadas assincronas sem ficar se perdendo com assinaturas e liberação de eventos. Há outras formas mais complexas e robustas de lidar com isso mas a minha intenção hoje era simplesmente mostrar como dá pra trabalhar de forma simples com código assíncrono, mesmo sem utilizar nenhuma biblioteca externa.



Set 23

Primeiros passos com Spring Roo

Escrito por DClick Team em 1, 2.0, 4, 6, Access, app, apple, Apresentação, AR, arte, Banco de Dados, BI, blog, class, classe, configuração, control, dados, demo, Documentação, Download, Eclipse, engine, err, Ferramenta, flash, Flex, for, framework, free, FullScreen, Geral, git, Google, ide, IE, if, image, int, Java, JPA, kit, Linux, mg, mvc, O, Office, on, Pessoal, pt, referencia, RIA, Ria’s Geral, screen, serviço, Serviços, Spring, Spring Framework, Sun, TAT, Teste, tool, toolkit, tv, Twitter, UI, uint, UX, wave, web, Web Service, web services, window, windows @ 09 23rd, 2010 | via http://blog.dclick.com.br/pt/ | Sem comentários
DClick Team
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Twitter!

Para o pessoal que ficou curioso com o primeiro post sobre o Spring Roo aqui vai mais um post sobre esse assunto.

O que é Spring Roo?

Como a própria documentação do Spring Roo fala, Roo é uma ferramenta fácil e produtiva para construir Enterprise Applications com Java. Com Roo você não precisa aprender uma nova linguagem ou uma nova plataforma, você simplesmente programa em Java. Tudo que você precisa fazer é iniciar o Roo e deixar ele rodando enquanto você programa. Você pode interagir com Roo por linha de comando, mas na maior parte do tempo você apenas vai programar na sua IDE de preferencia. Enquanto você faz alterações no seu projeto Roo determina o que você esta tentando fazer e se encarrega disso para você.

Outra coisa importante sobre Roo é que ele não é usado quando seu projeto esta rodando em produção. Ou seja, você não vai encontrar nenhum jar do Roo no classpath ou Annotation compilada junto com sua classe. Desta forma você pode parar de usar Roo a qualquer momento do seu projeto.

Como instalar Spring Roo?

Antes de qualquer coisa precisamos garantir algumas dependências:

1 – Java 5 ou 6

2 – Maven 2.0.0 ou mais recente

Com as dependências resolvidas podemos instalar Roo com os seguintes passos:

1 – Fazer o download do Spring Roo em http://www.springsource.org/download

2 – Descompacte o arquivo Zip em um diretório de sua escolha, esse diretório será chamado de %ROO_HOME

3 – Se você usa Windows adiciona %ROO_HOMEbin na variável de ambiente %PATH%. Se você utiliza Linux ou Apple crie um link simbólico usando o comando ln -s $ROO_HOME/bin/roo.sh /usr/bin/roo

4 – Verifique se a Roo foi instalado corretamente, para isso abra o terminal e digite os comando “roo quit”:

(Opcional)

Para trabalhar com Roo é recomendado utilizar SpringSource Tool Suite (STS), uma ferramenta free que usa como base o Eclipse IDE e que tem varias features para trabalhar com Roo, mas você também pode trabalhar com a IDE de sua escolha. Neste e nos próximos posts eu vou utilizar a ferramenta STS.

Visão geral

Em sua atual versão Roo foca em Enterprise application escritas em Java utilizando banco de dados relacional, JPA para persistencia de dados, Spring FrameWork para injeção de dependência e controle de transação, JUnit para testes unitários, Maven para configuração e build e Spring MVC para camada de apresentação.

Outra característica do Spring Roo é que ele não adiciona camadas desnecessárias ao projeto. Normalmente uma aplicação tradicional é composta de uma camada com os DAO’s, uma camada com Serviços, uma camada de Domínio e uma camada de Controle. Já com Spring Roo você vai ter apenas uma camada web e uma camada de entidade (similar a camada de domínio). Porém uma camada de serviço pode ser adicionada se sua aplicação exigir.

Para as próximas releases Spring Roo pretende estender seu suporte para Cloud como Cloud Foundry, Amazon Web Services e Google App Engine. Também pretende dar suporte para Google Web ToolKit (GWT) e Flex.

Agora vamos iniciar nosso primeiro projeto utilizando Spring Roo

Ago 8

Exemplo de WebServices Correios via PHP

Escrito por Gabriel Versallini em 1, 4, 6, action, AR, BI, código, Componente, Componentes, dados, demo, Desenvolvedor, desenvolvedores, for, git, html, IE, if, O, on, PHP, pt, RIA, Ria’s Geral, serviço, site, Teste, UI, Ved, web, Web Service, web services, XML @ 08 8th, 2010 | via http://www.versallini.com.br | Sem comentários
Gabriel Versallini
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Os Web services são componentes que permitem às aplicações enviar e receber dados. Cada aplicação pode ter a sua própria “linguagem”, que é traduzida para uma linguagem universal, o formato XML.

Fala, galera! Este post surgiu através do pedido de um colega que precisava informar o valor do frete de acordo com o serviço de entrega solicitado. No próprio site do Correios podemos encontrar um documento para desenvolvedores. O código a seguir foi criado de acordo com esse arquivo e baseado na necessidade do colega.

Abra o seu editor predileto e digite o código abaixo:

PLAIN TEXT
HTML:
  1. <br />
  2. <html><br />
  3. <head></p>
  4. <p></head><br />
  5. <body></p>
  6. <form action="correios.php" method="post">
  7.     Serviço</p>
  8. <select name="servico">
  9. <option value=""></option>
  10. <option value="41106">PAC</option>
  11. <option value="40010">SEDEX</option>
  12. <option value="40215">SEDEX 10</option>
  13. <option value="40045">SEDEX a Cobrar</option>
  14. <option value="40290">SEDEX HOJE</option>
  15. <option value="81019">e-SEDEX</option>
  16. <option value="44105">MALOTE</option>
  17. </select>
  18. <p> <br />
  19.     CEP de Origem </p>
  20. <input type="text" maxlength="8" name="cepOrigem" size="8" value="">
  21.     <br />
  22.     CEP de Destino: </p>
  23. <input type="text" maxlength="8" name="cepDestino" size="8" value="">
  24.     <br />
  25.     Peso </p>
  26. <select name="peso" size="1">
  27. <option selected value=""></option>
  28. <option value="0.3">0.300</option>
  29. <option value="1">1</option>
  30. <option value="2">2</option>
  31. <option value="3">3</option>
  32. <option value="4">4</option>
  33. <option value="5">5</option>
  34. <option value="6">6</option>
  35. <option value="7">7</option>
  36. <option value="8">8</option>
  37. <option value="9">9</option>
  38. <option value="10">10</option>
  39. </select>
  40. <p> Kg          </p>
  41. <input type="submit" value="Calcular">
  42. <input type="Reset" value="Limpar">
  43.     </form>
  44. <p></body><br />
  45. </html><br />

Agora, salve o arquivo como solicitacao.html e crie um novo documento e digite o código abaixo:

PLAIN TEXT
PHP:
  1. <br />
  2. <?php<br />
  3. // Código do Serviço<br />
  4. $cod_servico = $_REQUEST['servico'];</p>
  5. <p>// CEP de Origem<br />
  6. $cep_origem = $_REQUEST['cepOrigem'];</p>
  7. <p>// CEP de Destino<br />
  8. $cep_destino = $_REQUEST['cepDestino'];</p>
  9. <p>// Peso Estimado<br />
  10. $peso = $_REQUEST['peso'];</p>
  11. <p>// URL de Consulta dos Correios<br />
  12. $correios  = "http://www.correios.com.br/encomendas/precos/calculo.cfm?";<br />
  13. $correios .= servico=".$cod_servico."&#038;cepOrigem=".$cep_origem."";<br />
  14. $correios .= "&#038;cepDestino=".$cep_destino."&#038;peso=".$peso."";<br />
  15. $correios .= "&#038;MaoPropria=N&#038;avisoRecebimento=N&#038;resposta=xml";</p>
  16. <p>// Capta as informações da página dos Correios<br />
  17. $xml = file($correios);</p>
  18. <p>// Trate essas informações conforme desejar.<br />
  19. echo "Versão do arquivo: <b>&#8220;.$xml[2].&#8221;</b><br />&#8220;;<br />
  20. echo &#8220;Código do Serviço: <b>&#8220;.$xml[4].&#8221;</b><br />&#8220;;<br />
  21. echo &#8220;Nome do Serviço: <b>&#8220;.$xml[5].&#8221;</b><br />&#8220;;<br />
  22. echo &#8220;Preço postal: <b>&#8220;.$xml[17].&#8221;</b><br />&#8220;;<br />
  23. ?><br />

Salve esse arquivo como correios.php. Teste e modifique conforme a sua necessidade. Espero ter ajudado, qualquer dúvida comentem.

Um abraço

Ago 8

Revista Easy .net Magazine Edição 3

Escrito por Alexandre Tadashi em .NET, .Net Magazine, 1, 4, 6, AR, arte, Artigo, BI, blog, Blogs, C#, class, cliente, DevMedia, Dica, framework, Google, html, IE, if, image, int, Introdução, mg, O, on, RIA, Ria’s Geral, serviço, Serviços, servidor, silverlight, Tecnologia, Tema, Visual Studio, web, Web Service, web services, XP @ 08 8th, 2010 | via http://alexandretadashi.net/ | Sem comentários
Alexandre Tadashi
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Confira nessa edição da Easy .net Magazine:

• Web Services
• Introdução à T-SQL
• C#
• .NET Framework
 
Nesta edição colaborei com o artigo que apresenta o tema Web Services, que são serviços que podem ser disponibilizados para serem acessados através da Web a partir de outras aplicações. Veremos como criar Web Services (a parte servidora) e também como consumir serviços (a parte cliente), usando tecnologias .NET e o Visual Studio.

Link para o artigo: Web Services
Link para a revista: Easy .net Magazine Edição 3

Ago 5

Entendendo o Flash Remoting

Escrito por Jose Carlos Fiel em 1, 4, 6, action, Actionscript, Adobe, Adobe Flex, AMF, amfphp, api, AR, Artigo, BI, blog, class, cliente, código, dados, Desenvolvedor, desenvolvedores, flash, Flash Player, Flash Remoting, Flex, for, framework, Frameworks, html, IE, if, image, int, Linha de Código, mg, O, on, Outros, PHP, player, problema, Projetos, pt, Remoting, RIA, Ria’s Geral, servidor, Sugestões, Sun, tag, UI, Ved, web, Web Service, web services, XML, XP, zend, Zend Amf, Zend Framework @ 08 5th, 2010 | via http://blog.josecarlosfiel.com.br | 1 comentário
Jose Carlos Fiel
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



Hoje não trago nenhuma linha de código a vocês, mas sim um assunto interessante para entender como funciona o Flash Remoting na teoria.

O que é Flash Remoting?

Quando você está usando XML para enviar dados para sua aplicação cliente, muitos dos dados que você está transferindo não é absolutamente necessário. Pense em todos os caracteres extras que estão em um documento XML. Pense em quantas vezes você tem que enviar os atributos e nós, bem como ambas as tags início e tags de fim. XML é um formato grande, mas há uma grande sobrecarga no processamento desde documento.

Action Message Format

Action Message Format (AMF) funciona através de HTTP, como o XML, mas em vez de enviar diversas informações extras, o AMF envia as informações essenciais retirando estes caracteres desnecessários, ou seja é serializado dentro de um formato binário que usa bem menos banda e espaço do que um mesmo dado enviado com XML.

Isso torna útil quando você envia muitos dados. Em vez de enviar várias tags redundantes em XML, você está enviando pequenos registros AMF serializados.

Outro benefício do AMF é, que este é um tipo de dados nativo do Flash Player. Com isso o Flash Player não tem que fazer um “parse” dos resultados para obter as informações. Eles estão disponíveis no Flash Player como objetos nativos do ActionScript logo que é recebido através do servidor.

Flash Remoting usa AMF para expor objetos e web services em um servidor de aplicação, como se fossem objetos ActionScript locais. O único problema é que para usar AMF você tem que trabalhar com objetos no PHP. O gateway AMF ajuda a traduzir esses objetos PHP em objetos ActionScript no Flash Player. Com isso, você pode criar seus próprios objetos tipados no PHP e manter uma cópia destes objetos tipados no ActionScript.

Flash Remoting e o Zend Framework

Você já deve saber que recentemente a Adobe fez uma parceria com a Zend para fornecer suporte para o Flash Remoting com AMF no Zend Framework. Existem outros projetos como este, incluindo o AMFPHP para outros frameworks PHP, mas Zend AMF tem constante suporte para Flash Remoting. O Zend Framework é um robusto framework para PHP que pode ser usado para projetos muitos complexos. Para alguns desenvolvedores PHP qual apenas quer conectar PHP com Flex pode ser um caminhão de pedra para matar uma mosca. Você não precisa usar todo o Zend Framework, ou alterar a estrutura do seu projeto para usar o Zend AMF. Zend AMF baseia-se em um pequeno, mas poderoso, pacote que pode ser facilmente integrado a qualquer projeto PHP.

–

Por hoje é isso! O artigo original vocês podem acessar aqui. Espero que tenham gostado e sinta-se a vontade de deixar sugestões ou críticas.

Jul 4

Características – Microsoft Silverlight 4 & Adobe Flex 4

Escrito por Robson Fernandes em .NET, 1, 2.0, 3d, 4, 6, action, Actionscript, ActionScript 3, Adobe, Adobe Air, Adobe Flex, Adobe Flex - 3, Adobe Flex - Core, Air, Android, Animação, app, AR, BI, Blend, builder 4, C#, Catalyst, class, ColdFusion, control, Controls, css, Data Binding, Data Service, Data Services, DataGrid, Desenvolvedor, desenvolvedores, Desenvolvimento, Design, Desktop, Dica, DRM, encode, encoder, err, Estilo, event, expression, Expression Blend, Ferramenta, flash, flash builder, Flash Builder 4, flash media, Flash Media Server, Flash Player, Flash Remoting, Flex, Flex 4, for, Google, html, ide, IE, if, image, imagens, int, interface, internet, Java, Javascript, layout, Linux, Mac, Mercado, Microsoft, Microsoft Expression, Microsoft Silverlight, MXML, NaN, O, on, Opinião, Partilha, Pessoal, photoshop, PHP, player, print, programação, pt, Remoting, RIA, Ria’s Geral, Rich Internet Application, ruby, runtime, server, silverlight, Silverlight - Core, Silverlight 3, Silverlight 4, Soap, socket, streaming, surface, swf, tag, Tecnologia, tool, UI, UX, Ved, Vídeo, Visual Studio, Visual Studio 2010, WCF, web, Web Service, web services, window, windows, XAML, XML, XP @ 07 4th, 2010 | via http://www.riasoftware.com.br/blog/ | 2 comentários
Robson Fernandes
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

INTRODUÇÃO

Boa noite Galera!

Hoje gostaria de compartilhar com vocês, uma postagem com as principais características, das mais comentadas tecnologias de desenvolvimento de aplicações RIA(Rich Internet Applications) do mercado, o Microsoft Silverlight e o Adobe Flex.
São ao todo 20 características destacadas, sendo que elas foram aplicadas nas últimas versões das plataformas destacadas.
Gostaria da opinião de vocês, meus amigos leitores e desenvolvedores, até mesmo para que possam avaliar o conteúdo, caso eu tenha descrito algo errado. Lembrando que a intenção desta postagem, não é denegrir nenhuma tecnologia, mas sim, apresentar suas características!


Abaixo, segue a tabela:

  Tecnologias   Adobe Flex 4   Microsoft Silverlight 4
 
  Runtime   - Flash Player 10.1   - Silverlight 4.0.5
  Aplicações
  Multi-Plataforma
  - Windows
  - MacOS
  - Linux
  - Solaris
  - Google Android
  - Windows
  - MacOS
  - Windows Phone 7
  - XBox 360
  - Microsoft Surface
  Animação – Timeline   - Frame-by-Frame   - Baseada em tempo
  - Frame-by-Frame
  3D   - Baseado em simulação de
    perspectiva X, Y e Z.
  - Baseado em simulação de
    perspectiva X, Y e Z.
  Aplicações baseadas em
  Desktop 2.0
  - Adobe Air   - Silverlight OOB
  Modelo de programação   - Orientado a Objetos   - Orientado a Objetos
  Linguagem de interfaces   - Baseado em XML, o MXML   - Baseado em XML, o XAML
  Linguagem base – Client   - ActionScript 3

  - C#
  - VB.NET
  - IronRuby
  - IronPython

  Linguagens utilizadas com   frequência – Server/Side   - Java
  - PHP
  - ColdFusion
  - C#

  - C#
  - VB.NET
  - PHP

  Arquivo executável binário   - Arquivo SWF

  - Arquivo XAP

  Característica da plataforma   - Data Binding
  - Event Handling
  - Layout
  - Navigation
  - Controls
  - DataGrid
  - Data Visualization
  - Styling
  - Câmera e Microfone
  - Suporte Offiline DRM
  - Peer-assisted P2P
  - Print Suport
  - Right-to-Left Text
  - HTML hosting
  - Aceleração de Hardware

  - Data Binding
  - Event Handling
  - Layout
  - Navigation
  - Controls
  - DataGrid
  - Data Visualization
  - Theming
  - Câmera e Microfone
  - Suporte Offiline DRM
  - Multicast Streaming
  - Print Suport
  - Right-to-Left Text
  - HTML hosting
  - Aceleração de Hardware
  - COM Interop
  - Multi-Threading

  Ferramentas de   desenvolvimento   - Flash Builder 4   - Microsoft Visual Studio 2010
  Ferramentas de design

  - Adobe Flash CS5
  - Adobe Catalyst CS5

  - Microsoft Expression Blend 4
  - Microsoft Expression Design 4
  Integração com outras
  ferramentas de design
  - Adobe PhotoShop CS5
  - Adobe Illustrator CS5
  - Adobe Fireworks CS5
  - Adobe PhotoShop CS5
  - Adobe Illustrator CS5
  Linguagens baseadas
  em estilos
  - CSS   - XAML
  Suporte a Imagens   - Todos os formatos   - PNG
  - JPG
  Acesso remoto   - HTTP
  - Socket
  - Web Services
  - Remoting
  - HTTP
  - Socket
  - Web Services
  - WCF
  Data Services   - Flash Remoting
  - Bynary e Soap Services
  - WCF Services
  - Bynary e Soap Services
  Manipulação de vídeo   - Tipos de arquivos(FLV, F4V)
  - Tool: Adobe Media Encoder
  - Suporte a DRM
  - Tipos de arquivos(WMV, F4V)
  - Tool: Expression Media Encoder
  - Suporte a DRM
  Distribuição de vídeo   -Adobe Flash Media Server   -Microsoft IIS Media Services

Obrigado pessoal!

Abs.

Robson Fernandes


Mai 21

Pós Graduação UNA- Engenharia de Software Centrada em Métodos Ágeis

Escrito por Edgard Davidson em 1, 4, 6, Access, Adobe, Adobe Flex, Agile, Air, análise, app, AR, Arquitetura, auto, back, Banco de Dados, bar, BI, break, busca, camp, class, classe, classes, cliente, código, configuração, control, css, css3, cultura, Curso, dados, Desenvolvimento, Desenvolvimento de Software, Desenvolvimento RIA, Desenvolvimento Web, Design, Desktop, development, Draw, err, Estilo, Experiência do Usuário, Ferramenta, Flex, for, Formação, framework, Frameworks, geo, gestão, git, Google, Gráfico, guias, html, html5, ide, IE, if, image, int, interface, internet, Java, JavaFX, Javascript, JQuery, map, maps, Mercado, Mercado de Trabalho, mg, mvc, NaN, O, on, Opinião, Orientação, Orientação a Objetos, polimorfismo, print, problema, problemas, processo, produto, programação, Projetos, prototipação, prototipagem, protótipo, prova, pt, Qualidade de Software, rails, Reflection, RIA, Ria’s Geral, Rich Internet Application, ruby, ruby on rails, Scrum, silverlight, site, socket, Software, Sun, tag, Tecnologia, Tema, Teste, Testes Automatizados, Twitter, UI, UML, usabilidade, utf8, validação, Vários, web, Web Service, web services, Workshop, xhtml, XP @ 05 21st, 2010 | via http://edgarddavidson.com | Sem comentários
Edgard Davidson
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Pós Graduação em Engenharia de Software Centrada em Métodos Ágeis

Objetivo do Curso

O curso de pós-graduação lato sensu em Engenharia de Software Centrada em Métodos Ágeis tem como objetivo principal especializar profissionais para o desenvolvimento de softwares de qualidade. Este curso busca capacitar os participantes para uma visão abrangente e atualizada de engenharia de software e, em especial, capacitá-los em métodos ágeis focalizando nas tecnologias correntes para o desenvolvimento de software. O curso contempla tópicos como métodos ágeis, programação orientada a objetos, padrões de projeto, engenharia de requisitos ágeis , usabilidade, arquitetura e teste de software bem com o desenvolvimento aplicações WEB e RIA (Rich Internet Application). Durante o curso, os alunos exercitarão práticas ágeis integradas às outras disciplinas, proporcionando a transversalidade de conhecimento entre os conteúdos. No final, o aluno estará capacitado a implantar, integrar, liderar equipes ágeis de desenvolvimento de software aplicando técnicas e tecnologias atuais de mercado.

Público Alvo

Profissionais de nível superior das áreas de Sistemas de Informação, Ciência da Computação, Análise e Desenvolvimento de Sistemas e Engenharia que atuam no mercado e que desejam se especializar no desenvolvimento de software com qualidade, flexibilidade e visando o máximo retorno sobre o investimento nos projetos de software, ampliando seus conhecimentos nas metodologias, tecnologias e processos que suportam o desenvolvimento ágil de software.

Resultados Esperados

O resultado esperado do curso é que no final o aluno esteja capacitado a:

  • Identificar quais são as vantagens e desvantagem de se adotar uma abordagem formal ou ágil para desenvolvimento de software.
  • Implantar processos ágeis em equipes de desenvolvimento de softwares, aplicando práticas ágeis no dia a dia do desenvolvimento e possibilitando que o conceito de auto-gerenciamento funcione.
  • Liderar equipes que utilizam métodos ágeis de desenvolvimento.
  • Gerenciar projetos com práticas ágeis como o Scrum.
  • Desenvolver projetos de software em um em equipes ágeis com tecnologias Web e de Rich Internet Application (RIA)
  • Ser um profissional crítico, formador de opinião, que entenda de tecnologia, e que estejam capacitados a integrar equipes ágeis contribuindo para a melhoria da qualidade de software nacional.
  • Agregar valor no produto de software por meio da Integração disciplinas de engenharia de requisitos, usabilidade, padrões de projeto, arquitetura e teste de software

Diferenciais do Curso

Entre os principais diferenciais do curso de Engenharia de Software Centrada em Métodos Ágeis da UNA está no seu corpo docente, composto por professores com ampla vivência no mercado de trabalho, sua grade curricular composta de disciplinas teóricas e práticas, com conteúdo em acordo com as exigências do mercado, sintonizado com o pensamento ágil, e, sobretudo, que é o único curso pós graduação lato senso em Engenharia de Software de Belo Horizonte totalmente focado na filosofia ágil.

Estrutura Curricular

(mais...)

Set 5

Vídeos .NET to FLEX CRUD

Escrito por Edgard Davidson em .NET, CRUD, Flex, Vídeo, Vídeos, web services @ 09 5th, 2009 | via http://edgarddavidson.com | Sem comentários
Edgard Davidson
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Olá pessoal!!

Outro dia estava atrás de vídeos que mostravam exemplos de como desenvolver uma aplicação em flex.  Encontrei uma série de 5 vídeos que mostram, por completo, como criar um CRUD em flex e .net. Esses vídeos foram bastante úteis para mim quando estava iniciando na tecnologia. Para quem está aprendendo vale a pena assistir.  Show de bola. O vídeos estão em inglês, mas se você não é um “lord inlgês” acho que dá para entender assim mesmo.

Visão Geral

Veja o restante dos vídeos…

Parte 1 de 5

Parte 2 de 5

Parte 3 de 5

Parte 4 de 4

Parte 5 de 5

Ago 31

CRUD com Flex e Java

Escrito por Edgard Davidson em CRUD, Flex, Glassfish, Hibernate, Java, JAX-WS, web services @ 08 31st, 2009 | via http://edgarddavidson.com | Sem comentários
Edgard Davidson
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

O objetivo deste post e demonstrar um CRUD (Create, Retrieve, Update e Delete) feito em Flex e Java. A tecnologia utilizada é a seguinte:  do lado do servidor temos:  JAVA EE, Hibernate, JAX-WS e Glassfish. Do lado do cliente temos o Flex consumindo o webservices Java.

Esse post é continuação do anterior onde falei sobre paginação com datagrid. Agora será demonstrado como inserir, alterar, excluir.

A figura 1 ilustra a interface principal do exemplo.

Tela 11

Figura 1

Para iniciar a criar a aplicação servidor, será mostrado passo a passo como criar a aplicação no Netbeans 6.5.1.

Abra o NetBeans clique em “Novo Projeto”, em seguida escolha a categoria “Java Web” em seguida o projeto “Aplicação Web” conforme ilustrado na figura 2.  O projeto está sendo criado dessa forma porque será uma aplicação web que publicará um serviço web.

tela 1

Figura 2

O próximo passo no Wizard do NetBeans é criar um nome para o projeto. No caso deste exemplo, o projeto foi nomeado como “CrudServidor”. O local do projeto poderá ser o caminho padrão do NetBeans ou outro que você indicar.

tela 2

Figura 3

Como estamos criando uma aplicação Web, então será necessário indicar qual servidor de aplicação web será utilizado pelo projeto que está sendo criado. Conforme a figura 4, o servidor escolhida foi o GlassFish v2, mas nada impede de você escolher outro como tomcat, jboss, etc. No mais deixe os outros campos como estão.

tela 3

Figura 4

Na próxima tela do wizard (Figura 5), será necessário indicar quais frameworks serão utilizados pelo novo projeto. Nesse caso, será utilizado apenas o Hibernate 3.2.5. Fazendo isso o Netbeans já adiciona todos os ponto jar’s necessários para o hibernate, evitando que você tenha que indicar manualmente.  Na figura 5 do wizard também é necessário indicar para qual banco de dados o Hibernate será configurado. Poderia ter criado um novo banco de dados. Se esse projeto fosse para construir uma aplicação real teríamos que criar um novo banco, mas como isso é um exemplo, foi utilizado o “banco sample” que vem junto com a IDE do Netbeans. Então configura conforme figura 5. Neste ponto o seu projeto está criado no Netbeans.

Tela 4

Figura 5

Agora,  configurado o banco, será necessário criar um novo arquivo de mapeamento do Hibernate e POJOS de banco de dados. Para isso clique com o botão direito do mouse sobre a pasta “Pacotes de código fonte” do seu projeto, em seguida clique em novo e encontre o termo “Novo arquivo de mapeamento do Hibernate e POJOS de banco de dados.” Será aberta a tela conforme figura 6. O próximo passo é criar o hibernate.cfg.xml. Esse arquivo contém as informações necessárias para que o Hibernate se conecte ao banco de dados. Nessa tela do wizard (Figura 6), será necessário escolher as tabelas para que o wizard crie um mapeamento por meio de engenharia reversa. Nesse exemplo será mapeado apenas a tabela “Customer”.

Tela 6

Figura 6

A figura 7 mostra a tela do wizard onde será configurado para onde as classes de entidade, ou seja, as classes que mapeiam as tabelas do banco de dados serão geradas. Neste ponto é possível informar se você que criar o mapeamento utilizando anotation ou xml. Nesse projeto foi escolhida a estratégia de criar um arquivo XML de mapeamento objeto relacional para cada classe de entidade. No mais as classes geradas e seus respectivos arquivos de mapeamento com a extensão “.hbm.xml” serão gerados dentro do pacote entidade que foi previamente criado dentro da pasta source do projeto.

Tela 7

Figura 7

Em seguida (Figura 8), será necessário adicionar ao seu projeto um novo serviço web. Esse serviço web será a sua classe de fachada que irá publicar um web services com uma lista de métodos disponíveis para ser consumidos por qualquer aplicação cliente. Nesse projeto o nome do serviço Web é ControleCustomer. Entenda a classe de fachada com um classe que implementa as regras de negócio de um caso de uso, então se tivéssemos um caso de uso chamado “Getão de Customer”, então a classe ControleCustomer implementaria as suas regras. Note que a classe ControleCustomer  será gerada dentro do pacote chamado “controle” que foi previamente criado.

Tela 8

Figura 8

Bem, seguido todos os passos acima, espera-se que o seu projeto tenha a estrutura como ilustrado na figura 9.

Tela 9

Figura 9

A primeira classe gerada foi a classe de entidade Customer. Essa classe foi gerada automaticamente por engenharia reversa com descrito acima.
Segue o código da classe

package entidade;
// Generated 27/08/2009 21:14:32 by Hibernate Tools 3.2.1.GA

/**
 * Customer generated by hbm2java
 */
public class Customer  implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

     private int customerId;
          private String zip;
     private String name;
     private String addressline1;
     private String addressline2;
     private String city;
     private String state;
     private String phone;
     private String fax;
     private String email;
     private Integer creditLimit;

    public Customer() {
    }

    public Customer(int customerId, String zip) {
        this.customerId = customerId;
        this.zip = zip;
    }
    public Customer(int customerId, String zip, String name, String addressline1, String addressline2, String city, String state, String phone, String fax, String email, Integer creditLimit) {
       this.customerId = customerId;
       this.zip = zip;
       this.name = name;
       this.addressline1 = addressline1;
       this.addressline2 = addressline2;
       this.city = city;
       this.state = state;
       this.phone = phone;
       this.fax = fax;
       this.email = email;
       this.creditLimit = creditLimit;
    }

    public int getCustomerId() {
        return this.customerId;
    }

    public void setCustomerId(int customerId) {
        this.customerId = customerId;
    }

    public String getZip() {
        return this.zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public String getAddressline1() {
        return this.addressline1;
    }

    public void setAddressline1(String addressline1) {
        this.addressline1 = addressline1;
    }
    public String getAddressline2() {
        return this.addressline2;
    }

    public void setAddressline2(String addressline2) {
        this.addressline2 = addressline2;
    }
    public String getCity() {
        return this.city;
    }

    public void setCity(String city) {
        this.city = city;
    }
    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }
    public String getPhone() {
        return this.phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getFax() {
        return this.fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }
    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    public Integer getCreditLimit() {
        return this.creditLimit;
    }

    public void setCreditLimit(Integer creditLimit) {
        this.creditLimit = creditLimit;
    }
}

Agora a classe de fachada ControleCustomer que também é o webservices.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import entidade.Customer;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
import persistente.GenericDAO;
import persistente.GenericException;

/**
 *
 * @author Edgard Davidson
 */
@WebService()
public class ControleCustomer {

    private GenericDAO dao = new GenericDAO();

    @WebMethod
    public void inserirCustomer(Customer customer) throws GenericException {
        // Tratar aqui alguma regra de negócio
        dao.save(customer);
    }

    @WebMethod
    public void alterarCustomer(Customer customer) throws GenericException {
        // Tratar aqui alguma regra de negócio
        dao.update(customer);
    }

    @WebMethod
    public void exlcuirCustomer(Customer customer) throws GenericException {
        // Tratar aqui alguma regra de negócio
        dao.delete(customer);
    }

    @WebMethod
    @SuppressWarnings("unchecked")
    public List obterObjetosCustomer(String campo, String pesquisa, int indice, int maximo) throws GenericException {
        // Tratar aqui alguma regra de negócio
        Customer customer = new Customer();
        return  dao.loadObjects(campo, pesquisa, customer, indice, maximo);
    }

    @WebMethod
    public long obterQuantidadeObjetosCustomer(String campo, String pesquisa) throws GenericException {
        // Tratar aqui alguma regra de negócio
        Customer customer = new Customer();
        return dao.getCountObjects(campo, pesquisa, customer);
    }
}

As demais classes e arquivos XML de configuração estão empacotados para download no final do post.

Agora segue o código fonte Flex:
Primeiro a código fonte da aplicação principal.




	
		 0)
					var temp1:int=this.indice + 1;
				var temp2:int=this.indice + this.maximo;
				if (temp2 > this.qtdeObjetos)
					temp2=this.qtdeObjetos;
				lbPag.text=temp1.toString() + " - " + temp2.toString() + " de " + this.qtdeObjetos.toString();
			}

			private function onResultObterObjetosCustomer(event:ResultEvent):void
			{
				var acTemp:ArrayCollection=new ArrayCollection();
				var i:int;
				acTemp=event.result as ArrayCollection;
				AC.removeAll();
				var customer:Customer;

				if (event.result != null)
				{
					if (acTemp == null)
					{
						this.controleBotoesPaginacao(1);
						customer=new Customer();
						customer.customerId=event.result.customerId;
						customer.name=event.result.name;
						customer.city=event.result.city;
						customer.state=event.result.state;
						customer.zip=event.result.zip;
						customer.email=event.result.email;

						AC.addItem(customer);
					}

					if (acTemp != null)
					{
						this.controleBotoesPaginacao(acTemp.length);
						for (i=0; i < acTemp.length; i++)
						{
							customer=new Customer();

							customer.customerId=acTemp.getItemAt(i).customerId;
							customer.name=acTemp.getItemAt(i).name;
							customer.city=acTemp.getItemAt(i).city;
							customer.state=acTemp.getItemAt(i).state;
							customer.zip=acTemp.getItemAt(i).zip;
							customer.email=acTemp.getItemAt(i).email;

							AC.addItem(customer);
						}
					}
				}
				else
					this.controleBotoesPaginacao(0);
			}

			private function onResultExcluirCustomer(event:ResultEvent):void
			{
				AC.removeItemAt(gridCustomer.selectedIndex);
				AC.refresh();
				Alert.show('Excluido com sucesso!', "Mensagem");
			}

			private function onResultObterQuantidadeObjetosCustomer(event:ResultEvent):void
			{
				this.qtdeObjetos=event.result as int;
				srv.obterObjetosCustomer(comboBoxFiltro.selectedItem, campoBusca.text, indice, maximo);
			}

			private function onFault(event:FaultEvent):void
			{
				if (event.fault.rootCause == null)
					Alert.show("MOTIVO:\n" + event.fault.faultString + " \n\nDESCRIÇÃO:\n" + event.fault.faultDetail, "ERRO: " + event.fault.faultCode);
				else
					Alert.show("MOTIVO:\n" + event.fault.message + " \n\nDESCRIÇÃO:\n" + event.fault.faultDetail, "ERRO: " + event.fault.faultCode);
			}

			private function inicio_Click():void
			{
				this.indice=0;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}

			private function retroceder_Click():void
			{
				if ((this.indice - nsMaximo.value) <= 0)
					this.indice=0;
				else
					this.indice=this.indice - nsMaximo.value;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}

			private function avancar_Click():void
			{
				this.indice=this.indice + nsMaximo.value;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}

			private function fim_Click():void
			{
				this.indice=this.qtdeObjetos - nsMaximo.value;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}
		]]>
	
	
		
		
		
		
		
		
		
		
	
	

		
			
				
					
					
					
					
					
					
				
			
			
				
				
				
				
				
				
				
				
			
			
				
					name
					cyte
					state
					zip
					email
				
			
			
			
		
		
			
			
			
			
			
		
	


Agora o fonte da tela de cadstro.




	
		
	
		
		
		
		
	

	
		
			
		
		
			
		
		
			
		
		
			
		
		
			
		
			
	
		
		
		
		
	

A figura 11 é print da tela de cadastro de usuário

Tela 12

Figura 11

Segue o código fonte do lado servidor feito em Java. CrudServidor

Segue o código fonte do lado cliente feito em Flex. CrudCliente

Ago 23

Paginação com Datagrid

Escrito por Edgard Davidson em Flex, Glassfish, Hibernate, Java, JAX-WS, web services @ 08 23rd, 2009 | via http://edgarddavidson.com | Sem comentários
Edgard Davidson
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Olá!

Quando trabalhamos com aplicações centrada em banco de dados podemos ter algumas dificuldades quando a quantidade de registros nas tabelas começam a crescer. Já vi várias aplicações que trabalham bem desde que não possua muitos registros para serem retornados do banco de dados. Isso normalmente é devido a uma análise não muito cuidadosa. O resultado disso é DataGrids, List, ComboBox que tem que receber centenas ou milhares de registros o que com o passar do tempo, quanto mais registros são inseridos no banco de dados, mais lenta fica a aplicação.

Paginação_DataGrid

Paginação com DataGrid

Quando desenvolvemos aplicações que rodarão na internet isso passa a ser um agravante ainda maior. Pensando nisso várias aplicações desenvolvidas para a Web já foram construídas pensando nesse tipo de agravante.  Contundo, já é comum você entrar em um site que tem um grid como resultado de uma busca e esse resultado ser paginado em várias páginas. O próprio Google é um exemplo disto. Pense bem, se o resultado da busca foi um milhão de registros, para que tenho que mostrar tudo de um vez para o meu usuário, ele não vai dar conta de ver mesmo, então eu pagino.

Bom isso é muito bonito, muito legal e você já deve estar convencido, mas e aí, como fazer isso em Flex? Os componentes que vem como padrão no  Flex Builder não implementam esse tipo de recurso nativamente. Então pensando nisso criei este post com o objetivo demonstrar a utilização de paginação em Datagrid no Flex. Será demonstrado um como paginar dados de uma tabela simples utilizando do lado do servidor Java + Web services com JAX-WS + Hibernate +  Glassfish, desenvolvido no NetBeans 6.5.1. Para facilitar as coisar utilizei o banco de dados “sample” que já vem no NetBeans.

Bom, os detalhes de Java, JAX-WS, webservices, SOAP, WSDL, Hiberante vou deixar para outro post. Neste vou mostrar a paginação. Outro dia estava procurando algum exemplo de como fazer essa paginação, então encontrei o blog do Eduardo Kraus onde tinha um exemplo de Paginação de resultados em DataGrig que quase me atendeu para o que eu precisava. Essencialmente, eu aproveitei a função de Timer que ele implementou e a idéia é claro.

Então vamos lá.
Primeiramente será apresentado as classes Java do lado do servidor. A classe Customer abaixo é um POJO  gerado automaticamente pela ferramenta de engenharia reversa para Hibernate contida no NetBeans. A classe Customer reflete a tabela Customer do banco de dados Sample também presente como exemplo no NetBean 6.5.1.  Então, como a classe Customer é uma classe de entidade, ou seja, é uma classe que será persistida em banco de dados, ele tem os mesmos atributos da sua tabela associada e seus respectivos métodos getters e setters.

package entidade;
// Generated 23/08/2009 17:52:56 by Hibernate Tools 3.2.1.GA

/**
 * Customer generated by hbm2java
 */
public class Customer  implements java.io.Serializable {
    private static final long serialVersionUID = 6638932814548400382L;

     private int customerId;
     private char discountCode;
     private String zip;
     private String name;
     private String addressline1;
     private String addressline2;
     private String city;
     private String state;
     private String phone;
     private String fax;
     private String email;
     private Integer creditLimit;

    public Customer() {
    }

    public Customer(int customerId, char discountCode, String zip) {
        this.customerId = customerId;
        this.discountCode = discountCode;
        this.zip = zip;
    }
    public Customer(int customerId, char discountCode, String zip, String name, String addressline1, String addressline2, String city, String state, String phone, String fax, String email, Integer creditLimit) {
       this.customerId = customerId;
       this.discountCode = discountCode;
       this.zip = zip;
       this.name = name;
       this.addressline1 = addressline1;
       this.addressline2 = addressline2;
       this.city = city;
       this.state = state;
       this.phone = phone;
       this.fax = fax;
       this.email = email;
       this.creditLimit = creditLimit;
    }

    public int getCustomerId() {
        return this.customerId;
    }

    public void setCustomerId(int customerId) {
        this.customerId = customerId;
    }
    public char getDiscountCode() {
        return this.discountCode;
    }

    public void setDiscountCode(char discountCode) {
        this.discountCode = discountCode;
    }
    public String getZip() {
        return this.zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public String getAddressline1() {
        return this.addressline1;
    }

    public void setAddressline1(String addressline1) {
        this.addressline1 = addressline1;
    }
    public String getAddressline2() {
        return this.addressline2;
    }

    public void setAddressline2(String addressline2) {
        this.addressline2 = addressline2;
    }
    public String getCity() {
        return this.city;
    }

    public void setCity(String city) {
        this.city = city;
    }
    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }
    public String getPhone() {
        return this.phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getFax() {
        return this.fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }
    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    public Integer getCreditLimit() {
        return this.creditLimit;
    }

    public void setCreditLimit(Integer creditLimit) {
        this.creditLimit = creditLimit;
    }
}

Em seguida está o código da classe de controle ControleCustomer. Classes de controle são responsáveis por implementar as regras de negócio da aplicação e também implementando o padrão Facade ou Fachada. Como essa é um exemplo muito simples, não havia nenhuma regra a implementar. Então Segue o código.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import entidade.Customer;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
import persistencia.GenericDAO;
import persistencia.GenericException;

/**
 *
 * @author Edgard Davidson
 */
@WebService()
public class ControleCustomer {
    private GenericDAO dao = new GenericDAO();

    /**
     * Função que retorna uma lista contendo os objetos que enquadrarem nos
     * critérios de filtragem.
     *
     * @param campo nome do campo do banco de dados que será feito a filtro
     * @param pesquisa o termo de pesquisa que será feito no campo selecionado
     * @param indice é o índice do primeiro registro que deverá ser retornado
     * @param maximo quantidade máxima de registror que serão retornados
     * @return retorna uma lista de customer. Essa lista será serializado em XML pelo JAX-WS
     * @throws persistencia.GenericException tratamento genérico de erro
     */
    @WebMethod
    @SuppressWarnings({"unchecked"})
    public List obterObjetosCustomer(String campo, String pesquisa, int indice, int maximo) throws GenericException {
        Customer customer = new Customer();
        return  dao.loadObjects(campo, pesquisa, customer, indice, maximo);
    }

    /**
     * Função que retorna a quantidade de objetos que enquadrarem nos
     * critérios de filtragem.
     *
     * @param campo nome do campo do banco de dados que será feito a filtro
     * @param pesquisa o termo de pesquisa que será feito no campo selecionado
     * @return a quantidade de objetos encontrados
     * @throws persistencia.GenericException tratamento genérico de erro
     */
    @WebMethod
    public long obterQuantidadeObjetosCustomer(String campo, String pesquisa) throws GenericException {
        Customer customer = new Customer();
        return dao.getCountObjects(campo, pesquisa, customer);
    }
}

Note que a classe ControleCustomer possui anotações como @WebMethod e @WebService. Essa classe será disponibilizada por meio de uma WSDL para ser acessado por qualquer outra aplicação cliente.

Existe também uma classe Chamada GenericDao responsável em fazer a comunicação com o framework hibernate. Essa classe implementa as funções que vão de fato recuperar os registros do banco de dados. Então para que você não precise de fazer um select * e voltar um milhão de registros, foi utilizado o Criteria do hibernate para filtrar a quantidade de registro que você deseja retornar. Utilizei também o CreateQuery para saber quantos registros na função getCountObjects. Se você observar depois nos códigos em Flex,  a aplicação irá chamar o método getCountObjects para saber quantos objetos serão retornados, só depois eu chamo o método loadObjects. Bom quando eu implementei isto eu tinha outras opções para chegar mesmo lugar. Se você tiver uma idéia mais interessante comente aí, será bem vindo!

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.util.List;
import org.hibernate.*;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Edgard Davidson
 */
public class GenericDAO {

    private Session session = null;

    public GenericDAO() {
       //  this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    private void createSession(){
       //this.session = HibernateUtil.getSessionFactory().getCurrentSession();
        this.session = HibernateUtil.getSessionFactory().openSession();
    }

     public List loadObjects(String campo, String pesquisa, Object obj, int firstResult, int maxResult) throws GenericException {

        createSession();
        Transaction tx = session.beginTransaction();

        try {
            Criteria criteria = this.session.createCriteria(obj.getClass());
            criteria.add( Restrictions.like(campo.toLowerCase(), pesquisa, MatchMode.START) );

            criteria.setFirstResult(firstResult);
            criteria.setMaxResults(maxResult);

            return criteria.list();
        } catch (HibernateException ex) {
            if ((session != null) && tx.isActive()) {
                tx.rollback();
            }

            throw new GenericException("Ocorreu um erro de pesquisa" + " na classe " + obj.getClass().getSimpleName() + " com a seguinte mensagem de erro:" + ex.getMessage());
        } finally {
            if ((session != null) && session.isOpen()) {
             // tx.commit();
            }
        }
    }

    public long getCountObjects(String campo, String pesquisa, Object obj) throws GenericException{

        createSession();
        Transaction tx = session.beginTransaction();
        try {
            if (campo == null) {
                campo = "";
            }
            if (pesquisa == null) {
                pesquisa = "";
            }

            String sql = "select count(*) from " + obj.getClass().getName() + " where " + campo + " like '" + pesquisa + "%'";
            Long  count =  (Long) session.createQuery(sql).uniqueResult();
            if (count != null) {
                return count.longValue();
            }
            else {
                return 0;
            }
        } catch (HibernateException ex) {
            if ((session != null) && tx.isActive()) {
                tx.rollback();
            }
            throw new GenericException("Ocorreu um erro de pesquisa" + " na classe " + obj.getClass().getClass().getSimpleName() + " com a seguinte mensagem de erro:" + ex.getMessage());
        } finally {
            if ((session != null) && session.isOpen()) {
             // tx.commit();
            }
        }
    }
}

Bem,  existem outros detalhes como os arquivos xml para configuração do Hibernate, a classe HibernateUtil que irá criar a sessão com o banco,  mas isso vou empacotar para você fazer download no final do texto.  Caso tenha dúvida,  comente esse post que respondo!!

Agora vamos passar para o lado do Cliente, neste caso, implementado em Flex. A primeira coisa a se fazer e saber o endereço do seu WSDL. No meu caso o endereço é http://localhost:8080/appServidor/ControleCustomerService?WSDL. A aplicação precisará do endereço do WSDL do webservices  para saber quais métodos foram publicados, quais objetos serão trafegados etc. Para mais detalhes sobre o funcionamento de SOAP, WSDL e webservices vá ao google folgado(a).

Então, já que eu sei o meu endereço do WDSL eu já importei a classe Customer.  Aquela mesmo que está logo acima em Java. Só que agora ela já está em ActionScript.  O próprio Flex Builder tem uma opção para gerar essa classe automaticamente para você. Data->Import Web Service (WSDL).

/**
 * Customer.as
 * This file was auto-generated from WSDL by the Apache Axis2 generator modified by Adobe
 * Any change made to this file will be overwritten when the code is re-generated.
 */

package entidade{
    import mx.utils.ObjectProxy;
    import flash.utils.ByteArray;
    import mx.rpc.soap.types.*;
    /**
     * Wrapper class for a operation required type
     */

    public class Customer
    {
        /**
         * Constructor, initializes the type class
         */
public function Customer() {}

                   public var addressline1:String;
                   public var addressline2:String;
                   public var city:String;
                   public var creditLimit:Number;
                   public var customerId:Number;
                   public var discountCode:Number;
                   public var email:String;
                   public var fax:String;
                   public var name:String;
                   public var phone:String;
                   public var state:String;
                   public var zip:String;
           	}
      	 }

Em seguida segue o código da aplicação principal.




	
		 0)
					var temp1:int=this.indice + 1;
				var temp2:int=this.indice + this.maximo;
				if (temp2 > this.qtdeObjetos)
					temp2=this.qtdeObjetos;
				lbPag.text=temp1.toString() + " - " + temp2.toString() + " de " + this.qtdeObjetos.toString();
			}

			private function onResultObterObjetosCustomer(event:ResultEvent):void
			{
				var acTemp:ArrayCollection=new ArrayCollection();
				var i:int;
				acTemp=event.result as ArrayCollection;
				AC.removeAll();
				var customer:Customer;

				if (event.result != null)
				{
					if (acTemp == null)
					{
						this.controleBotoesPaginacao(1);
						customer=new Customer();
						customer.customerId=event.result.customerId;
						customer.name=event.result.name;
						customer.city=event.result.city;
						customer.state=event.result.state;
						customer.zip=event.result.zip;
						AC.addItem(customer);
					}

					if (acTemp != null)
					{
						this.controleBotoesPaginacao(acTemp.length);
						for (i=0; i < acTemp.length; i++)
						{

							customer=new Customer();
							customer.customerId=acTemp.getItemAt(i).customerId;
							customer.name=acTemp.getItemAt(i).name;
							customer.city=acTemp.getItemAt(i).city;
							customer.state=acTemp.getItemAt(i).state;
							customer.zip=acTemp.getItemAt(i).zip;
							AC.addItem(customer);
						}
					}
				}
				else
					this.controleBotoesPaginacao(0);
			}

			private function onResultObterQuantidadeObjetosCustomer(event:ResultEvent):void
			{
				this.qtdeObjetos=event.result as int;
				srv.obterObjetosCustomer(comboBoxFiltro.selectedItem, campoBusca.text, indice, maximo, '');
			}

			private function onFault(event:FaultEvent):void
			{
				if (event.fault.rootCause == null)
					Alert.show("MOTIVO:\n" + event.fault.faultString + " \n\nDESCRIÇÃO:\n" + event.fault.faultDetail, "ERRO: " + event.fault.faultCode);
				else
					Alert.show("MOTIVO:\n" + event.fault.message + " \n\nDESCRIÇÃO:\n" + event.fault.faultDetail, "ERRO: " + event.fault.faultCode);
			}

			private function inicio_Click():void
			{
				this.indice=0;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}

			private function retroceder_Click():void
			{
				if ((this.indice - nsMaximo.value) <= 0)
					this.indice=0;
				else
					this.indice=this.indice - nsMaximo.value;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}

			private function avancar_Click():void
			{
				this.indice=this.indice + nsMaximo.value;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}

			private function fim_Click():void
			{
				this.indice=this.qtdeObjetos - nsMaximo.value;
				this.maximo=nsMaximo.value;
				obterObjetosCustomer_Click();
			}
		]]>
	

	
		
		
		
		
	

	
		
			
				
					
					
					
					
					
				
			
			
				
				
				
				
				
				
				
				
			
			
				
					Name
					Cyte
					State
					Zip
				
			
			
			
		
	


Espero que seja útil, apesar de uma ou outra gambiarra…

O lado servidor poderá ser baixado em  appServidor

O lado cliente poderá ser baixado em appCliente

Obs: Para diminuir o tamanho do arquivo para o código do servidor, eu retirei as libs. Mas para você compilar precisará delas: 

antlr-2.7.6.jar
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
commons-collections-2.1.1.jar
commons-logging-1.1.jar
derbyclient.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
hibernate3.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar
hibernate-tools.jar
javassist.jar
jdbc2_0-stdext.jar
jta.jar

Paginação de resultados em DataGrig

« Entradas anteriores |

ACERCA

O que é o RedeRIA ?

O redeRIA não é nada mais que um agregador de feed's que disponibiliza o conteudo de varios blogs e autores ao redor do mundo RIA, actualmente agregamos mais de 2795 entradas vindas de 53 blogs especializados em ria’s, pelo que só fica a ganhar em assinar o feed ou seguir a comunidade no twitter.

Se acha que o seu blog ou um blog de um amigo é interessante e util para os leitores o redeRIA, faça a sua submissão aqui.

Feed: assine já
Twitter: siga-nos

GOOGLE

Votação


Deveria o RedeRia agregar conteúdo em inglês?
Ver Resultados

AUTORES


Eduardo KrausAlexandre TadashiBindableCognitiva SoluçõesDaniel LopesDaniel SchmitzDanielPedrinhaDClick TeamEbercomEdgard DavidsonElvis FernandesErko BrideeFabiel PrestesFábio Batista da SilvaFabio da SilvaFabriccio BernardesFelipe BorellaFlavia MoreiraGabriel VersalliniGabriela T. PerryIgor MusardoJanderson CardosoJoão AugustoJose Carlos FielKelps SousaLeonardo FrançaLucas MarçalLuis MessiasLuiz TarabalMario JuniorMário SantosMauro MartinsPablo SouzaPedro ClaudioreneRia BrazilriaPTRicardo CerqueiraRobson FernandesRodrigo Pereira FragaSaintBrSamuelFacchinelloSergio SouzaSilva DeveloperStefan HorochovecTech CaffeTecinforThiago BuenoVedVinícius SandimWillian ManoXAML Cast

PUBLICIDADE








Powered by Wordpress & msdevstudio.com