Desenvolvedor Java, C# .Net

Anderson Damasio - Seja bem vindo!

Os desenvolvedores ASP.NET devem aprender ASP.NET MVC?

clock July 12, 2009 15:50 by author Anderson

Muitas discussões dos desenvolvedores sobre se devem usar ou aprender a ASP.NET MVC tem sido recorrente em blogs, Twitter e fóruns nas últimas semanas.  As opiniões variam de não recomendar até ao ponto de que todos os desenvolvedores deveriam aprender. InfoQ tentou resumir um pouco da recente atividade em relação a este tópico.

Rob Conerey (funcionário da Microsoft no time de ASP.NET MVC e criador do SubSonic) explica porque desenvolvedores deveriam aprender ASP.NET MVC, depois de observar questões levantadas na comunidade.

Em sua introdução ele começa descrevendo WebForms como "A Grande Mentira":

WebForms é uma mentira. Sua abstração embrulhada em decepção coberta com molho de mentira servido em um prato cheio de diversão e um truque bem pensado. Nada que você faz com WebForms tem é ver com Web - você deixa ele fazer o trabalho para você.

Isto, amigos, é algo importante (pelo menos para mim): Você está trabalhando em uma mentira. A web não é 'stateful' e trabalha com esta coisa chamada HTML enviada através de fios usando outra coisa chamada HTTP - você precisa sabê-los, amá-los e senti-los nas suas veias.

Rob lista 7 razões para usar ASP.NET MVC ou em suas próprias palavras - 7 Razões Para Parar de Me Chamar De Idiota:

  1. Testabilidade
  2. Controle sobre HTML
  3. Extensibilidade
  4. Faz você pensar
  5. ...Diferentemente: Javascript não enche o saco
  6. Aprendendo novos conceitos
  7. É engraçado

E conclui que:

Ponto proncipal: Eu estou me divertindo novamente ao programar web e acho que é muito motivador, pelo menos para mim e para meus gatos. Ainda uma comparação, com certeza, mas acredito que um pouco mais direto. Você não tem nenhum motivo para não aprender MVC "mas vou permitir que possa ter uma razão ou duas para você continuar com WebForms."

Joe Brinkman (desenvolvedor em tempo integral noDotNetNuke) rapidamente seguiu com uma resposta, criticando Rob por não escolher "UMA BOA razão para aprender MVC", e lista sua própria:

  1. Vai te expor a uma arquitetura diferente
  2. Você será forçado a se tornar intimamente faimilar com HTML e HTTP
  3. MVC promove testes unitários
  4. MVC o fará ver o quanto você ganha por lidar com WebForms

Joe conclui dizendo:

Então em resumo, você deve realmente conferir MVC.  Mas não pelas razões que Rob enumerou.  Você deve explorar MVC porque ao final você pode ter aprendido algo que o fará um programador web melhor, não importa que plataforma você escolha.

Rob e Joe basicamente concordam no mesmo, que desenvolvedores ASP.NET devem aprender ASP.NET MVC, mas discordam no porquê dos argumentos.Karl Seguin no entanto tem uma diferente opinião e pergunta "se ASP.NET é uma solução crua"?:

Ser capaz de escrever sistemas complexos de uma maneira limpa é um bom começo, mas dado onde o desenvolvimento web geralmente se encontra, e outras plataformas em específico, ASP.NET MVC larga muito atrás (Perl sendo a única que eu consigo pensar que é pior).

Há uma pequena questão que uma grande parte do problema é que este é realmente um stack VC - não há pensamento, suporte e ferramentas para o Modelo. Quando você compara as milhares de linhas que você vai acabar escrevendo para seu repositório/dal/linq/nhiberate para outros stacks MVC (que normalmente somente requerem que seus modelos herdem de uma classe), você já está em uma série desvantagem de produtividade. Mas o real impacto é na verdade muito pior - você perde qualquer coesão de propósito através dos controllers e views. Não há maneira de gerar labels HTML de propriedades modelo, ou validação no lado do cliente.
...
Existem algumas boas notícias, e que toda esta "infraestrutura" é reutilizada, que fazem projetos como S#arp Architecture possíveis. No entanto, eu ainda estou cético que estes projetos possam realmente ter sucesso contra frameworks melhor integrados.

 Jeremy D. Miller (um dos criadores do FubuMVC) lista alguns prós e contras:

CONTRAS:
"o framework MVC não é eficiente a não ser que você planeje arregaçar as mangas e produzir uma infraestrutura específica para seu projeto para preencher no "M", atingir melhor testabilidade, sincronização de tela mais fácil, e HTML helpers mais produtivos"

...
PRÓS:
É muito fácil e direto para pegar o framework MVC pelos chifres e customizar para seu benefício.

Jeremy conclui dizendo:

Eu fico com a afirmação que o ASP.Net MVC framework, no fim das contas, é uma melhor maneira de construir aplicações web que a "abstração embrulhada em decepção coberta com molho de mentira servido em um prato cheio de diversão e um truque bem pensado,"  mas neste ponto é provavelmente uma ferramenta restrita para amigos que sejam do tipo "early adopters"

Jeffrey Palermo (atualmente escrevendo o livro “ASP.NET MVC in action”) declara que “Você não deve usar ASP.NET MVC se…”:

  • Você não esta muito confortável com polimorfismo
  • Você não deseja escrever no topo de um framework
  • Você utiliza controles de terceiros para muito da interface de usu?rio
  • Você é contra utilizar bibliotecas open-source

Mas continua com:

O framework ASP.NET MVC é um framework facilitador.  Não é um framework que "pega na sua mão".   Não é um framework “ASP.NET 101” .  Você tem controle total sobre tudo.  Padrões de interface de usuário no espaço da Web não são tão padronizados para que nós possamos abandonar controles para usar frameworks que trabalham de uma maneira "padrão".   Acesso a dados alcançou este ponto onde nós sabemos que precisamos Criar, Ler, Atualizar e Apagar, cascateando persistência, lazy loading, etc.   Existe muitos mapeadores objeto-relacional (ORM) que suportam as operações comuns, e muitos desenvolvedores estão satisfeitos desistindo do controle completo sobre o acesso a dados devido a forma parecida que os ORMs líderes trabalham (Hibernate/NHibernate).

Existem é claro muitos outros que expressaram as suas opiniões, mas InfoQ acha que as acima resumem muitos dos argumentos a favor e contra de aprender/usar ASP.NET MVC.


Coteúdo do Site: http://www.infoq.com/br/news/2009/05/should-devs-learn-aspnetmvc
Postado por Jon Arild Tørresdal , traduzido por André Pantalião em 12 Mai 2009 05:06 PM

 
Sites relacionados ao assunto:
  1. Criando um aplicativo de Filme usando Banco de Dados:
    Stephen Walther desenvolve uma aplicação do início ao fim em ASP.NET MVC. Este tutorial é uma ótima introdução para as pessoas ques estão querendo aprender ASP.NET MVC Framework e que querem ter uma noção do processo de construção.
  2. Entendendo: Models, Views e Controllers:
    Confuso sobre Models, Views e Controllers? Neste tutorial, Stephen Walther introduz as diferentes camadas de uma aplicação ASP.NET MVC.
  3. Entendendo: Controllers, Controller Actions, and Action Results:
    Stephen Walther introduz os Controllers do ASP.NET MVC. Você aprenderá a criar novos controllers e retornar resultados diferentes para cada tipos de ação.
  4. Resumo sobre ASP.NET MVC Routing:
    Stephen Walther mostra como o ASP.NET MVC mapeia os request do Navegador.
  5. Prevenir ataques de JavaScript Injection:
    Este tutorial explica como você pode facilmente derrotar estes tipos de ataques codificando seu HTML.
  6. Criando HTML Helpers Customizado:
    O objetivo deste tutorial é mostrar como você pode criar HTML Helpers personalizada que você pode usar no seu projeto MVC. Você pode reduzir a quantidade de digitação de tags HTML.
  7. Exibindo uma tabela de banco de dados:
    Neste tutorial, demonstrar dois modos de exibição de um conjunto de registos de dados. Demonstra dois métodos de formatação de registro em uma tabela HTML.
  8. Autenticando usuários com Forms Authentication:
    Aprenda a usar o atributo [Authorize] para proteger determinadas páginas MVC na sua aplicação. Você aprenderá como usar o "Web Site Administration Tool" para criar e gerenciar users e roles.


Introdução ao RMI

clock April 17, 2009 15:27 by author Anderson
Introdução á Computação Distribuida com RMI

A tecnologia RMI - Remote Method Invocation (Invocação de Métodos Remotos), foi primeiramente introduzida no Java, no JDK versão 1.1, elevando a programação para redes em um patamar mais elevado. Apesar do RMI ser relativamente fácil, ele põe o desenvolvedor Java frente à um novo paradigma, o mundo da computação de objetos distribuídos. Este guia prático vai lhe introduzir à esta tecnologia versátil, que melhorou muito desde sua primeira versão.

Objetivo

O principal objetivo para os criadores (designers) do RMI era permitir os programadores a desenvolverem programas distribuídos em Java com a mesma sintaxe e semântica usada em programas não-distribuídos. Para isso, eles tiveram que mapear cuidadosamente como classes Java e objetos trabalham em uma única Java Virtual Machine (JVM) para um novo modelo de como as classes e objetos trabalhariam num ambiente distribuído de computação (múltiplas JVMs). Os arquitetos do RMI tentaram fazer com que o uso dos objetos distribuídos em Java fosse similar ao uso de objetos Java locais. Esta seção introduz a arquitetura RMI da perspectiva dos objetos Java remotos distribuídos, e explora as diferenças de comportamento com objetos locais. A arquitetura RMI define como os objetos se comportam, como e quando exceções podem ocorrer, como a memória é gerenciada e como os parâmetros são passados e retornados de métodos remotos.

Arquitetura Java RMI

A arquitetura RMI estende a segurança e robustez da arquitetura Java para o mundo da computação distribuída.

Interfaces: O coração do RMI

A arquitetura RMI é baseada em um importante princípio: a definição do comportamento e a implementação do comportamento são conceitos separados. RMI permite que o código que define o comportamento e o código que implementa o comportamento permanecerem separados e rodarem em JVMs separadas. Em RMI, a definição do serviço remoto é codificada usando uma interface Java. A implementação do serviço remoto é codificada em uma classe. Logo, a chave para se entender o RMI é lembrar que as interfaces definem o comportamento e as classes definem a implementação. A classe que implementa o comportamento roda do lado do servidor RMI. A classe que roda no cliente atua como um Proxy para o serviço remoto. Veja o seguinte diagrama: O programa cliente faz chamadas de métodos pelo objeto Proxy, o RMI envia a requisição para a JVM remota e redireciona para a implementação. Qualquer valor retornado pela implementação é devolvido ao Proxy e então ao programa cliente.

Arquitetura de Camadas do RMI

Com o entendimento da arquitetura RMI num alto nível, vamos dar uma breve olhada na sua implementação. A implementação do RMI é essencialmente feita de três camadas de abstração. A camada Stub e Skeleton está abaixo dos olhos do desenvolvedor. Esta camada intercepta as chamadas de métodos feitas pelo cliente para que a variável de referência da interface redirecione essas chamadas para o serviço RMI remoto. A próxima camada é a Remote Reference Layer. Esta camada sabe como interpretar e gerencias referências feitas dos clientes para os objetos do serviço remoto. A conexão do cliente ao servidor é Unicast (uma-para-um). A camada de transporte é baseada nas conexões TCP/IP entre as maquinas em uma rede. Usando essa arquitetura de camadas, cada uma das camadas poderia ser facilmente melhorada ou substituída sem afetar o resto do sistema. Por exemplo, a camada de transporte poderia ser substituída por uma camada que implemente conexões UDP/IP, sem afetar as camadas superiores.

Nomeando Objetos Remotos

Como um cliente acha o serviço remoto RMI? Os clientes acham os serviços remotos usando o serviço de nomeação ou diretório (naming or directory). Isso parece um pouco redundante, mas o serviço de nomeação ou diretório roda como um endereço bem formado (host:port). O RMI pode usar diferentes tipos de serviços de diretório, incluindo o JNDI. O próprio RMI inclue um simples serviço, chamado de RMI Registry. O RMI Registry roda em cada maquina que hospeda o serviço remoto, por definição na porta 1099. Numa máquina host, um programa servidor cria um serviço remoto, primeiramente criando o objeto que implemente aquele serviço. Em seguida ele exporta aquele objeto para o RMI. Quando o objeto é exportado o RMI cria um serviço que aguarda as conexões do cliente. O servidor registra o objeto no RMI Registry, com um nome público. No lado do cliente o RMI Registry é acessado através da classe estática Naming. Ela provém o método lookup( ), que o cliente usa para requisitar o registro. Esse método aceita a URL que especifica o nome do servidor e o nome do serviço desejado. O método retorna uma referência remota para o objeto do serviço. A URL é formada como seguinte:

rmi://<host_name>[:port_number]/<service_name>  

Usando o RMI

Agora vamos trabalhar com um sistema que realmente implementa um sistema com RMI. Vamos criar um aplicativo simples, cliente e servidor, que executa métodos do objeto remoto. Para tanto não necessitamos de duas máquinas distintas ou com IP distintos. O exemplo pode ser rodado na mesma máquina, pois o RMI sabe como trabalhar com isso, mesmo que o host e o cliente sejam na mesma localidade. Um sistema RMI é composto de várias partes:

  • Definição das interfaces para os serviços remotos
  • Implementações dos serviços remotos
  • Arquivos de Stub e Skeletons
  • Um servidor para hospedar os serviços remotos
  • Um serviço de RMI Naming que permite o cliente achar os serviços remotos
  • Um provedor de arquivos de classes (servidor http ou ftp)
  • Um programa cliente que necessita os serviços remotos
    Criando seu aplicativo com RMI
    Agora iremos, de fato, criar um sistema que implemente o RMI, utilizando-se de um programa cliente e um programa servidor. Não utilizaremos um servidor FTP ou HTTP, no entanto utilizaremos os programas na mesma máquina e uma mesma estrutura de diretórios. Os passos a serem seguidos agora são:
  • Escrever e compilar o código Java da interface
  • Escrever e compilar o código Java das implementações das classes
  • Gerar as classes Stub e Skeleton das classes de implementação Crie um diretório para salvar todos os seus arquivos de projeto. Você pode fazer o download do código fonte usado nesse tutorial.
    Interfaces
    O primeiro passo, como dito, será criar a interface e compilá-la. A interface define todas as funcionalidades remotas oferecidas pelo serviço. Nomeio o arquivo como: Mensageiro.java.
    1. import java.rmi.Remote;   
    2. import java.rmi.RemoteException;   
    3.   
    4. public interface Mensageiro extends Remote {   
    5.   
    6.     public void enviarMensagem( String msg ) throws RemoteException;   
    7.     public String lerMensagem() throws RemoteException;   
    8. }  

    Perceba que esta interface estende a classe Remote, e cada assinatura de método declara as funcionalidades do serviço, e que podem gerar uma exceção RemoteException. Salve este arquivo (Mensageiro.java) no seu diretório e compile, com a seguinte linha de comando:
    1. javac Mensageiro.java  

    Implementação
    Agora, você deverá escrever a implementação para o serviço remoto, ou seja, o código a ser executado no ambiente remoto. Nomeia o arquivo como: MensageiroImpl.java.
    1. import java.rmi.RemoteException;   
    2. import java.rmi.server.UnicastRemoteObject;   
    3.   
    4. public class MensageiroImpl extends UnicastRemoteObject implements Mensageiro {   
    5.   
    6.     public MensageiroImpl() throws RemoteException {   
    7.         super();   
    8.     }   
    9.   
    10.     public void enviarMensagem( String msg ) throws RemoteException {   
    11.         System.out.println( msg );   
    12.     }   
    13.   
    14.     public String lerMensagem() throws RemoteException {   
    15.         return "This is not a Hello World! message";   
    16.     }   
    17. }  

    Salve este arquivo (MensageiroImpl.java) no seu diretório e compile, com a seguinte linha de comando:
    1. javac MensageiroImpl.java  

    Observe que a classe se utiliza (estende) da classe UnicastRemoteObject para linkar com o sistema RMI. Neste exemplo a classe estende a classe UnicastRemoteObject diretamente. Isto não é realmente necessário, mas essa discusão fica para uma próxima etapa. Quando uma classe estende a classe UnicastRemoteObject, ele deve prover um construtor que declare que ele pode lançar uma exceção RemoteException, pois quando o método super( ) é chamado, ele ativa o código em UnicastRemoteObject, que executa o link RMI e a iniciação do objeto remoto.
    Stubs e Skeletons
    Gere os arquivos Stubs e Skeletons da classe de implementação que roda no servidor. Para tanto, execute o comando rmic, compilador RMI do JDK.
    1. rmic MensageiroImpl  

    Após a execução deste comando, você deveria ver no seu diretório os arquivos Mensageiro_Stub.class, Mensageiro_Skeleton.class. Servidor O serviço remoto RMI deve ser hospedado em um processo servidor. A classe MensageiroServer é um servidor bem simples, que provê serviços essenciais. Salve o arquivo como: MensageiroServer.java.
    1. import java.rmi.Naming;   
    2.   
    3. public class MensageiroServer {   
    4.   
    5.     public MensageiroServer() {   
    6.         try {   
    7.             Mensageiro m = new MensageiroImpl();   
    8.             Naming.rebind("rmi://localhost:1099/MensageiroService", m);   
    9.         }   
    10.         catch( Exception e ) {   
    11.             System.out.println( "Trouble: " + e );   
    12.         }   
    13.     }   
    14.   
    15.     public static void main(String[] args) {   
    16.         new MensageiroServer();   
    17.     }   
    18. }  

    Salve este arquivo (MensageiroServer.java) no seu diretório e compile, com a seguinte linha de comando: > javac MensageiroServer.java
    Cliente
    O código fonte para o cliente é o seguinte. Salve o arquivo como: MensageiroClient.java.
    1. import java.rmi.Naming;   
    2. import java.rmi.RemoteException;   
    3. import java.rmi.NotBoundException;   
    4. import java.net.MalformedURLException;   
    5.   
    6. public class MensageiroClient {   
    7.   
    8.     public static void main( String args[] ) {   
    9.         try {   
    10.             Mensageiro m = (Mensageiro) Naming.lookup( "rmi://localhost/MensageiroService" );   
    11.             System.out.println( m.lerMensagem() );   
    12.             m.enviarMensagem( "Hello World!" );   
    13.         }   
    14.         catch( MalformedURLException e ) {   
    15.             System.out.println();   
    16.             System.out.println( "MalformedURLException: " + e.toString() );   
    17.         }   
    18.         catch( RemoteException e ) {   
    19.             System.out.println();   
    20.             System.out.println( "RemoteException: " + e.toString() );   
    21.         }   
    22.         catch( NotBoundException e ) {   
    23.             System.out.println();   
    24.             System.out.println( "NotBoundException: " + e.toString() );   
    25.         }   
    26.         catch( Exception e ) {   
    27.             System.out.println();   
    28.             System.out.println( "Exception: " + e.toString() );   
    29.         }   
    30.     }   
    31. }  

    Salve este arquivo (MensageiroClient.java) no seu diretório e compile, com a seguinte linha de comando:
    1. javac MensageiroClient.java  

    Rodando o sistema RMI
    Agora que todos os arquivos do projeto de exemplo foram criados e devidamente compilados, estamos prontos para rodar o sistema! Você precisará abrir três diferentes consoles do MS-DOS no seu Windows, ou outro, caso utilize um diferente sistema operacional. Em um dos consoles vai rodar o programa servidor, no outro o cliente e no terceiro o RMI Registry. Inicie com o RMI Registry. Você deve estar no mesmo diretório em que estão gravados seus arquivos para rodar o aplicativo. Execute a seguinte linha de comando:
    1. rmiregistry  

    Isso irá iniciar o RMI Registry e rodá-lo. No segundo console vamos executar o programa servidor. Você deve estar no mesmo diretório em que estão gravados seus arquivos para rodar o aplicativo. Execute o seguinte comando:
    1. java MensageiroServer  

    Isso irá iniciar, carregar a implementação na memória e esperar pela conexão cliente. No último console, rode o programa cliente. Você deve estar no mesmo diretório em que estão gravados seus arquivos para rodar o aplicativo. Excute o comando:
    1. java MensageiroClient  

    Se tudo correr bem, que é o que esperamos e o que deveria acontecer, a seguinte saída será gerada nos consoles 2 (servidor) e 3 (cliente). No console 2 (servidor):
    1. Hellow World!  

    No console 3 (cliente):
    1. This is not a Hello World! message  

    É isso aí. Você acabou de criar um sistema utilizando a tecnologia RMI. Apesar de você ter rodado os programas na mesma máquina, o RMI usa a pilha de rede TCP/IP para se comunicar entre as três diferentes instâncias da JVM. Espero que tenham gostado e aprendido com esse pequeno exemplo de como se usar o RMI.

  • Fonte:Daniel Destro



    XStream: Trabalhando com facilmente XML em Java

    clock April 17, 2009 15:15 by author Anderson
    Introdução

    Partindo do pressuposto que o leitor já conhece XML e sua importância, este artigo pretende abordar como usar XStream para realizar mapeamento de objetos Java para Documentos XML e vice-versa. Também serão citadas as vantagens e limitações desta ferramenta.

    Caminhos para trabalhar com Java e XML

    Existem diversas formas de se trabalhar com XML e Java, dentre elas, SAX, DOM, Digester. Cada uma serve ao seu propósito. Por exemplo, SAX é estremamente eficiente na leitura de arquivos. DOM, por sua vez oferece um melhor controle da estrutura hierárquica dos documentos XML, sendo mais adequado para a escrita de documentos para os quais não se tem total domínio da estrutura (esquema). Finalmente, Digester oferece uma forma interessante de mapear documentos XML para objetos Java e vice-versa. Entretanto, exige que o mapeamento seja manualmente configurado. E com vocês, XStream! XStream é uma outra forma de realiazar pontes XML-Java. Suas principais características, citadas na página oficial, são:

  • Facilidade de uso. Geralmente só se precisa conhecer uma classe.
  • Não é necessário configurar o mapeamento manualmente. XStream se baseia no mecanismo de Reflection pelo qual é possivel descobir dinamicamente quais os atributos de uma classe Java e os respectivos valores de seus objetos.
  • XML legível e mais compacto que a serialização nativa de Java.
  • Não exige que os objetos sigam alguma regra em particular.
  • Suporta referências duplicadas e circulares dos objetos.
  • Pode ser integrada com outras APIs.
  • A estratégia de conversão pode ser configurada.
  • Realiza uma avaliação prévia se o documento XML não está mal-formado, exibindo eventuais mensagens de erros. A próxima seção abordará um exemplo de como XStream pode ser usado.
    Exemplo passo a passo
    Inicialmente é necessário baixar o arquivo xstream*.jar e o xpp3*.jar em aqui. Na época que este artigo foi escrito, a versões mais novas eram a xstream-1.01 e xpp3-1.1.3.3_min respectivamente. Já mandou baixar? Ótimo. Enquanto você espera o download, pode dar uma expiadinha do problema a ser ilustrado. Suponha que se queira construir uma Agenda Eletrônica Pessoal. Imagine uma agenda para celular. Deseja-se facilidade, eficiência, portabilidade, integração com outros sistemas, e tal. Decide-se então guardar os contatos em XML. Esses contatos são lista de pessoas, que possuem nome, email e um telefone comercial. Esse telefone comercial contém um número para o DDD e o número local. Passa isso, constrói-se as seguintes classes Java:
    1. public class Pessoa {   
    2.     private String nome;   
    3.     private String email;   
    4.     private Telefone foneComercial;   
    5.            
    6.         // métodos Setters e Getters   
    7. }   
    8.   
    9. public class Telefone {   
    10.     int ddd;   
    11.     String numero;          
    12.         // métodos Setters e Getters    
    13. }  

    Ok, até aqui tudo bem. Mas e aí, como uso XStream? Tá saltando uma resposta quentinha na próxima seção. A essas horas, mesmo usando modem, é provável que já tenha terminado de baixar os arquivos. Coloque-os em seu classpath e volte aqui.
    Exemplo passo a passo

    1. import java.util.ArrayList;   
    2. import java.util.List;   
    3.   
    4. import com.thoughtworks.xstream.XStream;   
    5.   
    6. public class TesteXStream {   
    7.     public static void main(String[] args) {   
    8.         // Criando um objeto XStream           
    9.         XStream xstream = new XStream();   
    10.   
    11.         // Criando alguns dados   
    12.         Pessoa vinci = new Pessoa();   
    13.         vinci.setNome("Vinci Pegoretti Amorim");   
    14.         vinci.setEmail("vinci_amorim@yahoo.com.br");   
    15.   
    16.         Telefone foneDoVinci = new Telefone();   
    17.         foneDoVinci.setDdd(55);   
    18.         foneDoVinci.setNumero("5555 5555");   
    19.   
    20.         vinci.setFoneComercial(foneDoVinci);   
    21.         List contatos = new ArrayList(1);   
    22.         contatos.add(vinci);   
    23.   
    24.         // Passando os dados de Objetos Java para XML   
    25.         String contatosEmXML = xstream.toXML(contatos);   
    26.   
    27.         System.out.println("\nContatos em XML:");   
    28.         System.out.println(contatosEmXML);   
    29.   
    30.         // Passando os dados de XML para Objetos Java   
    31.         List amigos = (List) xstream.fromXML(contatosEmXML);   
    32.         Pessoa amigo = (Pessoa) amigos.get(0);   
    33.         Telefone foneDoAmigo = amigo.getFoneComercial();   
    34.   
    35.         System.out.println("\nAmigo como Objeto Java:");   
    36.         System.out.println("Nome: " + amigo.getNome());   
    37.         System.out.println(   
    38.             "Fone Comercial: ("  
    39.                 + foneDoAmigo.getDdd()   
    40.                 + ") "  
    41.                 + foneDoAmigo.getNumero());   
    42.     }   
    43. }  

    Primeiro é necessário importar a classe com.thoughtworks.xstream.XStream e criar um objeto para ela. Depois, deve-se implementar um código como o seguinte:
    1. String mensagemEmXML = xstream.toXML(objetoRaiz);  

    Feito isso, seus dados são passados para XML. Rodando o testeXStream espera-se obter a saída abaixo:
    1. Contatos em XML:   
    2. <list>   
    3.   <Pessoa>   
    4.     <email>vinci_amorim@yahoo.com.br</email>   
    5.     <foneComercial class="Telefone">   
    6.       <ddd>55</ddd>   
    7.       <numero>5555 5555</numero>   
    8.     </foneComercial>   
    9.     <nome>Vinci Pegoretti Amorim</nome>   
    10.   </Pessoa>   
    11. </list>   
    12.   
    13. Amigo como Objeto Java:   
    14. Nome: Vinci Pegoretti Amorim   
    15. Fone Comercial: (555555 5555  

    Se você já conhece outras formas de mapeamento Java-XML certamente estará impressionado com a facilidade de XStream. Mas algumas vezes você pode querer mapear nomes para as tags diferentes do nome da classe. Para fazer isso com XStream basta, após a criação do seu objeto da classe XStream, escrever:
    1. xstream.alias("nomeDoObjetoEmXML", NomeDoObjetoEmJava);  

    Para este caso podería-se fazer algo como:
    1. xstream.alias("contato", Pessoa.class);   
    2. xstream.alias("telefone", Telefone.class);   
    3. xstream.alias("lista", ArrayList.class);  

    A nova saída seria:
    1. Contatos em XML:   
    2. <lista>   
    3.   <contato>   
    4.     <email>vinci_amorim@yahoo.com.br</email>   
    5.     <foneComercial>   
    6.       <ddd>55</ddd>   
    7.       <numero>5555 5555</numero>   
    8.     </foneComercial>   
    9.     <nome>Vinci Pegoretti Amorim</nome>   
    10.   </contato>   
    11. </lista>   
    12.   
    13. Amigo como Objeto Java:   
    14. Nome: Vinci Pegoretti Amorim   
    15. Fone Comercial: (555555 5555  

    Para a maioria dos casos, este conhecimento já é o suficiente. Mas uma visita ao site oficial sempre é recomendado.
    Conclusões
    Como nem tudo são flores, XStream possui algumas limitações. Por exemplo, o texto "Blá" e os atributos do XML abaixo são simplesmente igorados.
    1. <pessoa id="5" sexo="masculino"> Blá   
    2.   <email>vinci_amorim@yahoo.com.br</email>   
    3.   <foneComercial>   
    4.     <ddd>31</ddd>   
    5.     <numero>3899 1994</numero>   
    6.   </foneComercial>   
    7.   <nome>Vinci Pegoretti Amorim</nome>   
    8. </pessoa>  

    Entretando, em situações onde se tem domínio sobre a estrutura a ser usada, isso não representa grandes problemas. Vai trabalhar com XML? A sugestão é: tente usar XStream. Se não for possível, tente outra. Se você entendeu como usar XStream e onde é recomendado o seu uso, a missão foi cumprida. Abraços e até a próxima.
  •  


    Fonte:www.guj.com.br - Vinci Pegoretti Amorim



    Vazamento de memória no Java

    clock April 17, 2009 14:57 by author Anderson
    Introdução

    Garbage Collector == adeus vazamento de memória? Neste pequenino artigo, vamos mostrar como o Garbage Collector não tem como perceber sempre que você não está usando alguma coisa! Isto é, vai ocorrer um "pseudo" vazamento de memória, ou como conhecemos, memory leak. Claro que esse memory leak pode ser evitado. Aqui você vai aprender a ter um poquinho mais de cautela!

    Código

    Vou direto para o exemplo mais clássico! Simulando uma pilha com array de Objects!

    Sutil. não? Imagine que você populou a sua pilha com 1000 objetos. Depois você começou a dar pop, até esvaziar! Tudo ok? Como você viu, não! Você NÃO está mais utilizando aqueles elementos da pilha, e quem esta utilizando a sua classe provavelmente também não está mais, mas mesmo assim você tem referência para aqueles 1000 objetos, enforcando a memória da sua virtual machine, e fazendo o garbage collector de bobo! Para corrigir isso, é mais que óbvio:

    Com este null, o objeto pode ser coletado! Você acha que isto só acontece com arrays, e que você esta a salvo já que usa a poderosa collections framework? Doce ilusão!

    Ok, ok, sei que você poderia usar aqui o java.util.Stack, mas o que eu queria era ilustrar que você não está salvo disto acontecer, especialmente quando mexe com coleções e arrays! Sei que este exemplo que acabo de dar, o cara teria de ser beeeem descuidado, já que o push dele não sobreescreve um elemento que já existir, ele faz pior, ele adiciona no meio!!!!! Quem conhece a ArrayList sabe disso! Portanto, muito cuidado! Se você está mexendo em uma coleção, e utilizando algo para apontar um dos objetos, pense se você precisa manter os outros na coleção!

    Conclusão

    O Garbage Collector é o seu melhor amigo, mas pode deixar você com alguns vícios. Este tipo de problema aparece em inúmeras situações. Você já pode ter implementado algo que "vazasse" memória assim, e nunca percebeu, já que era pequeno. Em uma aplicação grande, isso pode matar a sua JVM! Em um futuro próximo, estamos lançando o tutorial sobre o Garbage Collector básico. E mais para frente, um sobre Weak, Soft e Phantom references do pacote java.lang.ref. É um tópico MUITO interessante para quem gosta de saber como o java realmente funciona!


    Fonte: www.guj.com.br - Paulo Silveira



    Compartilhe aqui!

    .

    Anderson Damasio

    Desenvolvedor Java e .Net C# atuando na área desde 2004.

    Tags para Pesquisa

    Seja um membro

    Sign in