terça-feira, 21 de outubro de 2014

JAVA WEB - Hibernate + JPA + MySQL + JBoss AS 7 - Configuração

Como incluir o Hibernate em seu projeto WEB? Como configurá-lo com o JBoss AS 7 utilizando o MySQL como Banco de Dados?
Estou tendo exatamente esta necessidade neste exato momento e não estou encontrando um tutorial simples e didático o suficiente para configurar meu projeto com tais tecnologias de forma rápida e fácil, sendo assim, vou "mastigar" os trechos de tutoriais que encontrei por aí e vou colocar aqui pra você o que absorvi em forma de um SIMPLES passo-a-passo! Vamos lá?

1) Você primeiramente precisará ter o MySql e seu Connector instalado em sua máquina (ou qualquer outro Banco de Dados que queira utilizar).

Clique aqui para baixar o MySQL e depois o instale (Next, Next, Next... rsrsrs porém guarde a senha que você irá fornecer durante a instalação. Iremos precisar dela);
Clique aqui para baixar o MySQL Connector/J e depois o instale (Next, Next, Next... rsrsrsrs).
Clique aqui para baixar o arquivo ".jar" referente ao conector. Usaremos ele mais adiante.

2) Depois de baixar e instalar as ferramentas de Banco de Dados agora precisamos das bibliotecas do Hibernate e do JPA (já vêm inclusas dentro do Hibernate).

Clique aqui para baixar o Hibernate ORM (Model de Objeto Relacional).

3) Você precisará também do Servidor de Aplicação JBoss 7. Baixe e descompacte a versão "JBoss AS 7.1.1.Final".

4) Iremos considerar que você já tem um projeto WEB e quer apenas configurar/adicionar tais tecnologias, PORÉM, se você está criando um projeto também neste exato momento, pode acessar este nosso tutorial onde criamos um projeto WEB do zero para criar seu projeto e depois siga pra o passo 5) deste tutorial. Clique aqui para acessar o tutorial.

5) Descompacte e abra a pasta do Hibernate que você baixou e copie os arquivos ".jar" da pasta "hibernate-release-4.3.6.Final/lib/required" para a pasta "WebContent/WEB-INF/lib" (se esta pasta não existir, crie-a!). Feito isso, clique com o botão direito do mouse em cima do seu projeto, posicione sobre "Build Path" e selecione "Configure Build Path...":


Clique em "Add JARs...", selecione os arquivos que você copiou para a pasta "WebContent/WEB-INF/lib" e clique em "OK":


Clique em "OK".

6) Dentro do diretório do JBoss AS 7 que baixamos anteriormente, na pasta "/modules/com/" crie uma pasta chamada "mysql" e dentro desta pasta crie uma outra chamada "main". Seguindo essa estrutura, dentro da pasta "/modules/com/mysql/main/" crie um arquivo XML chamado "module.xml" com o seguinte conteúdo:

 <?xml version="1.0" encoding="UTF-8"?>  
 <module xmlns="urn:jboss:module:1.1" name="com.mysql">  
   <resources>  
     <resource-root path="mysql-connector-java-5.1.15-bin.jar"/>  
   </resources>  
   <dependencies>  
     <module name="javax.api"/>  
     <module name="javax.transaction.api"/>  
     <module name="javax.servlet.api" optional="true"/>  
   </dependencies>  
 </module>  

Salve o arquivo e dentro da mesma pasta coloque o "mysql-connector-java-5.1.15-bin.jar" que baixamos anteriormente. Note que o arquivo é referenciado no XML acima então o mesmo deve conter exatamente este nome, ou então você pode alterar o XML acima com o nome do arquivo que foi baixado.

7) Abra o arquivo "module.xml" localizado dentro da pasta do JBoss AS 7 no caminho "modules/org/hibernate/main" e adicione dentro da sessão de <dependencies> o seguinte trecho:

 
<module name="com.mysql"/>  
 

O arquivo ficará assim:

 
<module xmlns="urn:jboss:module:1.1" name="org.hibernate">  
   <resources>  
     <resource-root path="hibernate-core-4.0.1.Final.jar"/>  
     <resource-root path="hibernate-commons-annotations-4.0.1.Final.jar"/>  
     <resource-root path="hibernate-entitymanager-4.0.1.Final.jar"/>  
     <resource-root path="hibernate-infinispan-4.0.1.Final.jar"/>  
   </resources>  
   
   <dependencies>  
        
           <module name="com.mysql"/>  
             
     <module name="asm.asm"/>  
     <module name="javax.api"/>  
     <module name="javax.persistence.api"/>  
     <module name="javax.transaction.api"/>  
     <module name="javax.validation.api"/>  
     <module name="org.antlr"/>  
     <module name="org.apache.commons.collections"/>  
     <module name="org.dom4j"/>  
     <module name="org.infinispan" optional="true"/>  
     <module name="org.javassist"/>  
     <module name="org.jboss.as.jpa.hibernate" slot="4" optional="true"/>  
     <module name="org.jboss.logging"/>  
     <module name="org.hibernate.envers" services="import" optional="true"/>  
   </dependencies>  
 </module>  


8) Agora temos que criar nossa Base de Dados antes de continuarmos com as configurações. Essa tarefa é simples. Ao chegar neste ponto você já deve ter instalado o MySQL em seu computador (se ainda não o fez, faça rsrs), sendo assim, abra o MySQL 5.6 Command Line Client, ele irá pedir uma senha que é a mesma que você utilizou no momento da instalação. Forneça a senha e em seguida digite o comando "create database nome_que_vc_quiser_para_o_banco ;" e dê "enter". No meu caso, para este tutorial, utilizarei o nome "ZapZap", deverá aparecer o seguinte comando indicando que a base de dados foi criada:


9) Agora iremos criar a conexão entre o JBoss e sua Base de Dados MySQL. Para isso, abra o arquivo "standalone.xml" localizado na pasta "/standalone/configuration/" do JBoss. Localize dentro do arquivo a tag "<datasources>" (no plural) e logo abaixo dela insira o seguinte código:

 
<datasource jta="false" jndi-name="java:jboss/datasources/zapzap_datasource"   
               pool-name="zapzap_datasource" enabled="true" use-ccm="false">  
    <connection-url>jdbc:mysql://localhost:3306/ZapZap</connection-url>  
    <driver-class>com.mysql.jdbc.Driver</driver-class>  
    <driver>mysql</driver>  
    <security>  
        <user-name>root</user-name>  
        <password>root</password>  
    </security>  
</datasource>
  

Trocando "ZapZap" pelo nome que você deu na criação da sua Base de Dados e "zapzap_datasource" por um nome qualquer que identifique esta conexão (lembrando que este "nome qualquer" será utilizado mais tarde).
Ainda dentro da sessão "<datasources>" (no plural rsrs), você encontrará a sessão "<drivers>" (também no plural), dentro dela, coloque o seguinte trecho de código:

 
<driver name="mysql" module="com.mysql">  
    <xa-datasource-class>com.mysql.jdbc.Driver</xa-datasource-class>  
</driver>
  

10) Toda a configuração na parte do JBoss está concluída, agora vamos ao projeto. Crie um arquivo chamado "persistence.xml" contendo o código abaixo e salve-o no diretório "/src/META-INF/" dentro do diretório principal de seu projeto (se o diretório "META-INF" não existir, crie-o. Se o mesmo estiver em outra localização, mova-o).

 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence  
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">  
   
      <persistence-unit name="zapzap" transaction-type="RESOURCE_LOCAL">  
           <provider>org.hibernate.ejb.HibernatePersistence</provider>
           <non-jta-data-source>java:jboss/datasources/zapzap_datasource</non-jta-data-source>  
          
           <class>com.jonathan.zapzapws.util.hibernate.EntityManagerUtil</class>  
           <class>com.jonathan.zapzapws.model.CriticasSugestoesModel</class>  
             
           <properties>  
                <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />  
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />  
                <property name="hibernate.format_sql" value="true" />  
                <property name="hibernate.show_sql" value="true" />  
                <property name="hibernate.hbm2ddl.auto" value="update" />  
           </properties>  
   </persistence-unit>  
 </persistence>
  

Faça as seguintes alterações:

* Na tag "persistence-unit" altere o valor do atributo "name" de "zapzap" para qualquer outro identificador que você queira, sabendo que utilizaremos este identificador mais tarde;

* O valor da tag "non-jta-data-source" será o caminho do data-source que definimos no arquivo "standalone.xml" do JBoss no passo 9) deste tutorial.

* As tags "class" que inserimos serve para mapear as classes que se utilizarão do contexto Hibernate/JPA para injeção do EntityManager e para mapeamento das entidades do Banco de Dados. A classe EntityManagerUtil será utilizada para fornecer o EntityManager em nosso projeto e a classe CriticasSugestoesModel será utilizada para testar nossa configuração criando uma tabela e inserindo dados na base de dados. (criaremos essas classes no próximo passo).

* A propriedade "hibernate.transaction.jta.platform" tem o valor padrão pra quando se está utilizando o JBoss como Servidor de Aplicação e gerenciador de transações. Mude para o equivalente ao Servidor de Aplicação que você está usando.

* A propriedade "hibernate.hbm2ddl.auto" está definido como "update" (que atualiza o banco de dados automaticamente de acordo com as entidades criadas no código) apenas para testarmos. Em desenvolvimento eu desencorajo fortemente o seu uso e encorajo definir o valor para "validate" que valida as entidades definidas no código de acordo com o banco.

11) Crie uma classe chamada "EntityManagerUtil" que será responsável por fornecer o EntityManager para nossa aplicação. Segue o código simples da classe:

 
 public class EntityManagerUtil {  
   
      /** entity */  
      private static final EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("zapzap");  
   
      /** @return the entity */  
      public static EntityManager getEntity() {  
           return entityManagerFactory.createEntityManager();  
      }  
 }  


Crie uma classe chamada "CriticasSugestoesModel" que será nossa entidade de testes do banco de dados. Segue o código da classe:


 //Indica que é uma entidade do banco de dados 
 @Entity  
 //Define o nome da tabela do banco correspondente
 @Table(name="criticas_sugestoes")  
 public class CriticasSugestoesModel{  
   
      /** id */
      //Indica que está é a chave primária da tabela  
      @Id 
      //Nome da coluna correspondente
      @Column(name="id")  
      private Long id;  
        
      /** texto */
      //Nome da coluna correspondente
      @Column(name="texto")  
      private String texto;  
        
      @Override  
      public String toString() {  
           return this.userId.toString();  
      }  
        
      @Override  
      public boolean equals(Object obj) {  
           if(obj != null && obj instanceof CriticasSugestoesModel){  
                if(((CriticasSugestoesModel)obj).getId() != null && ((CriticasSugestoesModel)obj).getId().equals(this.id)){  
                     return true;  
                }  
           }  
             
           return false;  
      }  
        
        
        
        
      /**  
       * @return the id  
       */  
      public Long getId() {  
           return id;  
      }  
   
      /**  
       * @param id the id to set  
       */  
      public void setId(Long id) {  
           this.id = id;  
      }  
   
      /**  
       * @return the texto  
       */  
      public String getTexto() {  
           return texto;  
      }  
   
      /**  
       * @param texto the texto to set  
       */  
      public void setTexto(String texto) {  
           this.texto = texto;  
      }  
 }  
   

Altere seu arquivo "persistence.xml" com o caminho correto das classes criadas acima.

12) Pronto! Para testar sua configuração inicie seu Servidor de Aplicação, execute seu projeto e utilize o seguinte trecho de código:

     
     CriticasSugestoesModel critica = new CriticasSugestoesModel();  
     EntityManager em = EntityManagerUtil.getEntity();  
             
      em.getTransaction().begin();  
             
      try {  
           critica.setTexto("Testando");  
           critica.setId(new Long(1));  
                  
           em.persist(critica);  
           em.getTransaction().commit();  
      } catch (Exception e) {  
           em.getTransaction().rollback();  
      }            
      em.close();  
   




É isso aí!! Se tudo ocorreu bem e você seguiu todo o passo-a-passo, certamente terá em mãos uma aplicação WEB configurada para utilizar os frameworks Hibernate e JPA com Base de Dados MySQL gerenciados em um Servidor de Aplicação JBoss!

domingo, 12 de outubro de 2014

Android - Iniciando com Google Maps

Como incluir mapas em minha aplicação? O que devo fazer para trabalhar com o Google Maps? Como faço para traçar rotas e customizar marcadores no mapa? Parece ser simples, mas não é! Resumindo, nós iremos instalar e configurar o Google Play Services SDK, registrar seu aplicativo no Google Developers APIs Console para obter a chave da API de sua aplicação, configurar o arquivo "AndroidManifest.xml" de acordo com o exigido pela Google, e adicionar o mapa em sua aplicação!

Sem mais enrolação, vamos ao passo-a-passo!


1) Neste tutorial vamos considerar que você já tem uma aplicação e quer apenas incluir mapas nela, sendo assim, não irei abordar a criação de uma nova aplicação. Caso você ainda não tenha uma aplicação e pretende criar uma nova aplicação neste momento para utilização do Google Maps, você pode seguir o nosso tutorial de como criar uma nova aplicação Android aqui. Também estaremos considerando que você está utilizando o ADT Eclipse IDE para desenvolver, que já vem com o SDK Android. Se você não está utilizando o ADT Eclipse IDE, você pode fazer o download e instalação seguindo o tutorial da própria Google para isso.

2) O Google Maps Android é disponibilizado como parte do Google Play Service SDK, sendo assim, vamos adicionar o Google Play Services como biblioteca em nossa aplicação. Para isso, clique com o botão direito do mouse na área livre do Package Explorer e selecione "import..." como mostra a imagem abaixo:


Feito isso, na próxima tela que se segue, expanda a opção Android e selecione "Existing Android Code Into Workspace" como mostrado abaixo:



Agora indique o caminho da biblioteca que fica dentro da pasta do SDK Android que vem junto com o ADT Eclipse ou que você baixou separadamente no passo 1) deste tutorial. A biblioteca do Google Play Services fica no diretorio "sdk/extras/google/google_play_services/libproject":



Feito isso, a biblioteca aparecerá "checkada" na wisard. Certifique-se de marcar a opção "Copy projects into worspace" e clique em "Finish":



A biblioteca deverá ter sido importada e agora estará sendo mostrada no Package Explorer junto com seu projeto. Agora para utilizar esta biblioteca dentro do seu projeto é necessário referenciá-la. Para isso, clique com o botão direito em seu projeto e selecione "Properties":



Nas opções do menu da esquerda escolha Android e desça a barra de rolagem até o fim para mostrar a opção de adicionar bibliotecas externas. Clique em "Add...":



Na tela que irá abrir, selecione a opção "google-play-services_lib" e clique em OK:



A biblioteca deverá ser mostrada na lista de bibliotecas externas utilizadas em seu projeto. Clique em "OK" para que o projeto seja atualizado contendo a referencia para a nova biblioteca:



3) Vamos adicionar o versionamento de nossa biblioteca em nossa aplicação. Para isso inclua o seguinte trecho de código dentro da sessão "<application>" do arquivo "AndroidManifest.xml" de sua aplicação:


  <meta-data   
    android:name="com.google.android.gms.version"  
    android:value="@integer/google_play_services_version"/>  

4) Para acessar o Google Maps Server com o Google Maps API você precisa adicionar uma chave de API em sua aplicação. Essa chave é gratuita, você pode utilizá-la em qualquer aplicação sua que utilize o Google Maps, e ela suporta um número ilimitado de usuários. Para adquirir sua chave, clique aqui para abrir o Console de APIs do Google (vale lembrar que você precisa ter uma conta de usuário na Google. Caso não tenha, crie uma. É gratuita!).

Antes de continuarmos, vamos esclarecer algumas coisas. 
Todas as aplicações Android devem ser assinaladas com um certificado digital para que você tenha uma chave privada de sua aplicação. Pelo fato desse certificado ser único ele fornece um jeito de identificar o seu aplicativo. Isso permite, de forma muito útil, rastrear sua aplicação em sistemas como o Google Play Store e o uso de recursos por sua aplicação como o Google Maps Server. Chaves da API do Google Maps são "linkadas com um específico par certificado/pacote. Nós precisamos apenas de uma chave para cada certificado, não importando quantos usuários teremos em nossa aplicação. Aplicativos que usam o mesmo certificado podem utilizar a mesma chave, mas o bom é registrar cada aplicativo com seu próprio certificado. (fonte dessas informações aqui). 

5) Sendo assim, vamos criar a assinatura digital de nosso aplicativo para assim obter a chave necessária para utilizar o Google Maps.

Existem dois tipo de assinatura, em modo Debug e em modo Release. Em modo Debug você assina quando ainda está desenvolvendo sua aplicação (nosso caso) e em modo Release é feito quando você finalmente irá distribuir sua aplicação na loja. Vale ressaltar que você não conseguirá distribuir seu aplicativo na loja com uma assinatura no modo Debug. Vamos abordar a assinatura no modo Debug.

Como estamos utilizando o Eclipse ADT, essa tarefa será simples e indolor! 
Selecione seu projeto e na barra de menu clique em File e selecione Export...:


Na tela que se segue selecione o projeto ao qual você quer gerar a assinatura e clique em Next. Marque a opção "Create a new keystore", escolha onde quer salvar sua chave e forneça a senha de utilização da mesma:


Ao clicar em Next será aberta uma tela no qual você deverá fornecer várias informações. Alias é apenas o nome pelo qual você identificará essa assinatura nas demais vezes que a for utilizar; Password e Confirm você coloca a mesma senha criada no passo anterior; Validity (years) será a validade dessa assinatura em anos; First and Last Name coloca-se o nome e ultimo nome do desenvolvedor(a). As outras informações são opcionais:


Clique em Next e na próxima tela escolha onde você quer salvar o arquivo ".apk" de seu aplicativo. Ao selecionar o local aparecerá a informação "Certificate expires in XX years." Clique em Finish e sua assinatura estará gerada! Simples, não?

6) A chave da API Google Maps é baseada em uma informação do certificado digital de sua aplicação chamada SHA-1 fingerprint que pelo fato de ser um texto único o Google Maps o utiliza para identificar sua aplicação. 

Para recuperar o valor do SHA-1 fingerprint de nossa assinatura digital (criada no model debug) localize o arquivo "debug.keystore" que está localizado No Linux em "~/.android/" e no Windows em "C:/Users/seu_nome_de_usuario/.android/":


Abra o terminal de comandos e execute o seguinte comando:

 keytool -list -v -keystore "caminho_do_arquivo" -alias androiddebugkey -storepass android -keypass android  

Você verá algo parecido com isso:


O certificado SHA-1 fingerprint é o valor da linha iniciada com SHA1. Guarde-a pois iremos utilizá-la mais adiante.

7) Voltando ao Console de APIs do Google, clique em "Create Project", dê um nome ao projeto (sugiro o mesmo nome da aplicação) e clique em "Create":


Espere a tela de Overview de seu projeto carregar e no menu da esquerda expanda a opção APIs & auth e selecione APIs. Procure na lista de APIs no centro da tela a opção Google Maps Android API v2 e no lado direito clique em OFF para que fique ON ativando assim a Google Maps API v2 para este projeto:

 
Neste momento, ela deverá ser mostrada no topo da lista na sessão de APIs ativadas.
Agora, na mesma aba APIs & auth, selecione o menu Credentials e clique em "Create new Key":


Na tela que se segue, digite o valor da chave SHA-1 fingerprint que recuperamos no passo 6) seguido de ";" (ponto-e-vírgula) e o pacote do seu aplicativo (recupere do atributo package do arquivo "AndroidManifest.xml" de sua aplicação:





Feito isso clique em Create. Na tela que se segue, o Console de APIs da Google mostrará como resposta alguns dados, dentre eles a API Key da sua aplicação:


Agora, para incluir tal chave dinamicamente em nossa aplicação, apenas inclua o trecho de código abaixo logo antes de fechar a tag "</application>" em seu arquivo "AndroidManifest.xml" referente à sua aplicação:



 <meta-data  
             android:name="com.google.android.maps.v2.API_KEY"  
             android:value="SUA_API_KEY_AQUI"/>  

8) Para o perfeito funcionamento do Google Maps em nossa aplicação, precisamos deixar explicito em nosso aquivo "AndroidManifest.xml" algumas permissões que o usuário deverá ceder para utilizar o Google Maps através de seu aplicativo. Adicione o seguinte trecho de código no arquivo "AndroidManifest.xml" referente à sua aplicação, logo acima da tag de abertura "<application>" (acima, não dentro):



 <!-- Usada pela API para baixar os mapas do servidor da API Google Maps -->  
 <uses-permission android:name="android.permission.INTERNET"/>  
 <!-- Para permitir à API verificar a conexão antes de tentar baixar os mapas -->  
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
 <!-- Para permitir à API guardar cache de mapas no armazenamento externo -->  
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
 <!-- Permite à API usar o wifi ou 3G ou ambos para determinar a localização -->  
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>  
 <!-- Permite à API utilizar o GPS para determinar a localização -->  
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

 <!-- Indica a utilização da versão 2 do OpenGL para renderização dos mapas -->
 <uses-feature android:glEsVersion="0x00020000" android:required="true"/> 

9) Pronto! Agora toda a configuração está pronto e nós podemos adicionar mapas em nossa aplicação!


Para adicionar um mapa em sua aplicação, no arquivo XML de layout onde você quer adicionar um mapa, adicione o seguinte componente:


 10) Feito isso, compile e execute sua aplicação. Onde você colocou o trecho acima deverá aparecer um mapa! Para aprender a manipular o mapa, definir rotas, fazer marcações e etc, dê uma olhada no próximo tutorial com o título "Android - Trabalhando com Google Maps".



É isso aí!! Se tudo ocorreu bem e você seguiu todo o passo-a-passo, certamente terá em mãos um Aplicativo que utiliza mapas da API do Google Maps!!

sexta-feira, 3 de outubro de 2014

JAVA WEB - Iniciando Com Web Service RESTful

Como construir um Web Service com arquitetura "RESTful" simples e fácil? Do que preciso?
Com a necessidade de desenvolver um simples Web Service que se utilizasse das facilidades da utilização da arquitetura "RESTful", fui em busca de tutoriais e percebendo que temos poucas opções de tutoriais para desenvolvimento simples com esta ferramenta em português, resolvi criar esse passo-a-passo para auxiliar quem tem a necessidade de desenvolver algo simples, rápido e fácil com REST.

Sem mais enrolação, vamos ao passo-a-passo!!


PRÉ-REQUISITOS:

* Para este tutorial faça o download da IDE Eclipse para desenvolvedores JAVA EE.

* Também iremos utilizar o framework Jersey/JAX-RS que, de forma resumida, é uma especificação API JAVA para implementação de Web Services REST utilizando anotações (annotations). Faça o download da distribuição Jersey AQUI.

* Precisamos também de qualquer "Web Container" para gerenciamento de nossa aplicação. Você pode utilizar qualquer um disponível no mercado como Apache TomCat, JBoss ou até mesmo o Google App Engine. Neste tutorial utilizarei o JBoss AS 7 que além de ser um dos mais "poderosos" é totalmente free. Você pode baixar o JBoss Aplication Server 7 AQUI.

* Certifique-se de ter o JAVA instalado em sua máquina. Caso não o tenha, baixe e instale o JAVA Development Kit 7 (JDK).


INICIANDO:

1) Na IDE Eclipse, Clique em "File", posicione o mouse sobre "New" e selecione "Dynamic Web Project":


2) Na tela que se segue, dê um nome para seu projeto. No meu caso, como estou aproveitando a necessidade de criar um Web Service para uma de minhas aplicações Android que se chama ZapZap Commedy (lançada em breve rsrs) para criar o tutorial, juntarei o útil ao agradável e na medida que vou desenvolvendo, vou incrementando o tutorial. Sendo assim, nomearei o meu projeto como ZapZap-WS. As demais configurações, siga a imagem abaixo:


3) Clique em "Next" por duas vezes e na última tela de "setup" do projeto marque a opção "Generate web.xml deployment descriptor" para que o arquivo "web.xml" referente à descrição e configuração de nosso projeto seja criado automaticamente e clique em "Finish":


4) Copie todos os arquivos ".jar" das pastas "jaxrs-ri/api, jaxrs-ri/ext e jaxrs-ri/lib" referentes ao Jersey/JAX-RS ao qual foi disponibilizado o link para download na sessão de "pré-requisitos" deste tutorial, para a pasta "WebContent/WEB-INF/lib":


5) Defina o pacote principal de sua aplicação clicando na pasta "src" de seu projeto com o botão direito do mouse, posicione o mouse na opção "new" e selecione "package". Lembre-se que no padrão WEB, o pacote principal de uma aplicação deve ser composto de "com.empresa.projeto", porém como nem todas as pessoas que decidem construir um Web Service tem uma empresa, sugiro utilizar seu nome ou sobrenome. No meu caso ficará assim:


6) Dentro do pacote principal de seu projeto, crie uma classe simples chamada "HelloWorld.java" a qual utilizaremos para exemplificar as chamadas a serviços REST. Para entender melhor o que faremos nessa classe, precisamos relembrar o que significa cada "Annotation" (anotação) do Jersey que utilizaremos neste tutorial. Para isso, segue abaixo o código fonte da classe implementada comentado com explicações do que cada "Annotation" significa:

 import javax.ws.rs.GET;  
 import javax.ws.rs.Path;  
 import javax.ws.rs.Produces;  
 import javax.ws.rs.core.MediaType;  

 /**  
  * @author jonathan.s.santos  
  *  
  * @version 03/10/2014  
  * @project ZapZap-WS  
  */  
 //Assim como todo link é formado por "schema://host/path" (http://www.abobrinha.com/path)   
 //com a anotação "@path" definimos o "path" (caminho) que será incluso após o host   
 //para acessar esta classe.  
 @Path("/helloworld")  
 public class HelloWorld{  
        
      //Este método será acessado via método "GET". Lembre-se, em protocolo HTTP o método  
      //"GET" é utilizado para buscar coisas, o "PUT" para incluir, o "POST" para editar   
      //e "DELETE" para excluir.  
      @GET  
      //Indica que este método, ao ser chamado, retornará um texto comum.  
      @Produces(MediaType.TEXT_PLAIN)  
      public String helloWordTexto() {  
       return "Hello Word!! (texto)";  
      }  
   
      //Este método será acessado via método "GET".  
      @GET  
      //Indica que este método, ao ser chamado, retornará um XML.  
      @Produces(MediaType.TEXT_XML)  
      public String helloWordXML() {  
       return "<?xml version=\"1.0\"?> "  
                 + "<hello> Hello Word!! (xml) </hello>";  
      }  
   
      //Este método será acessado via método "GET".  
      @GET  
      //Indica que este método, ao ser chamado, retornará um HTML.  
      @Produces(MediaType.TEXT_HTML)  
      public String helloWordHTML() {  
       return "<html>"  
                      + "<title>Hello Word</title> "  
                      + "<body>"  
                           + "<h1>Hello Word (html)</h1>"  
                      + "</body>"  
                 + "</html> ";  
      }  
 }  
   

7) Estamos quase lá. Precisamos agora registrar nosso "Servlet" Jersey que tratará as requisições REST ao nosso Web Service. Para isso, abra o arquivo "WebContent/WEB-INF/web.xml" de seu projeto e adicione o seguinte código:

 <?xml version="1.0" encoding="UTF-8"?>  
 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
      xmlns="http://java.sun.com/xml/ns/javaee"   
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"   
      id="WebApp_ID" version="3.0">  
    
  <!-- NOME DO PROJETO A SER EXIBIDO -->  
  <display-name>ZapZap-WS</display-name>  
    
  <!-- DECLARAÇÃO DO SERVLET -->  
  <servlet>  
       <!-- NOME DO SERVLET -->  
   <servlet-name>Web Service REST</servlet-name>  
   <!-- CLASSE JERSEY RESPONSAVEL POR GERENCIAR AS REQUISIÇÕES -->  
   <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>  
   <!-- REGISTRO DE PACOTE PADRÃO DA APLICAÇÃO -->  
   <init-param>  
     <param-name>jersey.config.server.provider.packages</param-name>  
     <param-value>com.jonathan.zapzapws</param-value>  
   </init-param>  
   <!-- ORDEM DE CARREGAMENTO DOS RECURSOS -->  
   <load-on-startup>1</load-on-startup>  
  </servlet>  
    
  <!-- MAPEAMENTO DE REQUISIÇÕES, OU SEJA, DIZEMOS AQUI QUE TUDO  
  QUE FOR REQUISITADO COM O PREFIXO "/res/" SERÁ TRATADO PELO  
  MEU SERVLET DE NOME "Web Service REST" DEFINIFO ACIMA -->  
  <servlet-mapping>  
   <servlet-name>Web Service REST</servlet-name>  
   <url-pattern>/rest/*</url-pattern>  
  </servlet-mapping>  
 </web-app>  

8) Agora devemos apenas adicionar nosso "Application Server" (nesse caso o JBoss AS 7) como gerenciador de contêineres de nossa aplicação. Para isso, primeiramente tornaremos visível a aba de servidores de nossa aplicação selecionando a opção "Window -> Show View -> Servers" no Eclipse como mostra a imagem abaixo:


9) Na aba de servidores aberta, clique dentro com o botão direito do mouse e selecione "New -> Server":



10) Se a opção para adicionar o server JBoss AS 7.1 não estiver disponível, você precisará instalar o JBoss Tools Plugin em seu Eclipse. Se a opção apareceu, passe para o passo 11) deste tutorial. Para instalar o JBoss Tools Plugin em seu Eclipse, selecione "Help -> Eclipse Markeplace..." como mostra a figura abaixo:


Pesquise por "JBoss" e clique na opção "Install" referente ao Eclipse que esteja utilizando. No caso deste tutorial, estamos utilizando o Eclipse Luna.



Após instalar tudo, reinicie seu Eclipse e volte para o passo 9) deste tutorial.

11) Selecione a opção JBoss AS 7.1:


12) Clique em "Next" duas vezes até abrir a tela seguinte. Na tela que se segue, clique em "Browser" e indique o caminho onde você descompactou o arquivo baixado referente ao "JBoss AS 7.1". Selecione a opção "Alternate JRE" e selecione a opção "jre7" se estiver disponível, senão, apenas deixa a opção "Execution Environment" e clique em "Next".



13) Adicione seu projeto ao gerenciador e clique em "Finish":


14) O JBoss AS 7.1 por sua vez, já vem pré-configurado para utilizar os serviços RESTeasy, isso pra quem vai desenvolver Web Services REST com estrutura EASY é ótimo! Porém pra nós, além de desnecessário, causa conflitos de bibliotecas. Para resolver tais conflitos de bibliotecas, devemos configurar nosso JBoss AS 7.1 para não utilizar tais bibliotecas próprias e sim utilizar as bibliotecas do Jersey que incluímos no nosso projeto anteriormente. Para fazer isso, exclua ou comente as seguintes linhas dos seguintes arquivos (número das linhas para mais fácil identificação) em seu JBoss:

Arquivo "jboss-as-7.1.1.Final/modules/javax/ws/rs/api/main/module.xml"

 27 <resource-root path="jboss-jaxrs-api_1.1_spec-1.0.0.Final.jar"/>  

Arquivo "jboss-as-7.1.1.Final/domain/configuration/domain.xml"

 13 <extension module="org.jboss.as.jaxr"/>  
   
 14 <extension module="org.jboss.as.jaxrs"/>  
   
 149 <subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>  
   
 405 <subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>  
   
 679 <subsystem xmlns="urn:jboss:domain:jaxr:1.1">  
 680 <connection-factory jndi-name="java:jboss/jaxr/ConnectionFactory"/>  
 681 </subsystem>  
 682 <subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>  
   
 1029 <subsystem xmlns="urn:jboss:domain:jaxr:1.1">  
 1030 <connection-factory jndi-name="java:jboss/jaxr/ConnectionFactory"/>  
 1031 </subsystem>  
 1032 <subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>  

Arquivo "jboss-as-7.1.1.Final/standalone/configuration/standalone.xml"

 Tudo relacionado à "jaxr" e "jaxrs".  

15) Vamos testar se tudo está funcionando? Clique com o botão direito do mouse em cima do Servidor de Aplicação que acabamos de adicionar e selecione "Start":


15) Aguarde o servidor inicializar. Quando a seguinte instrução aparecer no "console" é porque seu servidor está pronto para ser acessado! (caso não esteja visualizando o console, clique em "Window -> Show View -> Console" para abri-lo.


16) Agora chegou a hora da verdade!! Depois que o servidor já estiver sido inicializado, abra seu navegador de internet e vamos acessar seu WebService. O link de acesso à sua aplicação é composto por "schema://host/path" (já vimos isso anteriormente). Nosso "schema" padrão para protocolo HTTP (utilizado em serviços REST) é o prório "http". O nosso "host", como não hospedamos ainda nosso servidor ele está sendo executado localmente em nossa máquina, por isso o mesmo é "localhost" e a porta de rede ao qual o mesmo deverá está sendo executado é a 8080. O nosso "path" é composto pelo nome do projeto, indice de requisição que definimos no arquivo "web.xml" e o "path" que definimos na nossa classe "HelloWord.java" via anotação. Seguindo essas diretivas, acessamos nosso Web Service pelo link
http://localhost:8080/ZapZap-WS/rest/helloworld:


É isso aí!! Se tudo ocorreu bem e você seguiu todo o passo-a-passo, certamente terá em mãos um Web Service construído com arquitetura REST utilizando as bibliotecas Jersey/JAX-RS!!

Faça o download do código fonte da aplicação AQUI.

quarta-feira, 1 de outubro de 2014

Android - Browser Chamando Aplicação

Como abrir minha aplicação Android através do browser de um dispositivo? E se meu aplicativo não estiver instalado? E se não for um dispositivo com Sistema Operacional Android? Consigo redirecionar para o Google Play Store caso meu aplicativo não esteja instalado?

Sem mais enrolação, vamos ao passo-a-passo!

1) Crie um simples projeto Android com o nome de ProjetoBrowser e nomeie sua Activity principal como MainActivity. Se você tem dificuldades em dar este primeiro passo siga nosso tutorial de como criar um projeto Android aqui.

2) Agora tornaremos nossa Activity principal (MainActivity) acessível pelo browser e deixá-la com a ação de visualização.

Para torná-la acessível por browser adicione as seguintes "category" (categories) dentro da sessão de "<intent-filter>" dentro de sua Activity:

 <category android:name="android.intent.category.DEFAULT" />  
 <category android:name="android.intent.category.BROWSABLE" />  

Mude a ação de sua Activity de "android.intent.action.MAIN" para "android.intent.action.VIEW":

 <action android:name="android.intent.action.VIEW" /> 

Retire a category "<category android:name="android.intent.category.LAUNCHER" />". A declaração de sua Activity no arquivo "AndroidManifest.xml" deverá estar assim:

 <activity  
    android:name=".MainActivity"  
    android:label="@string/app_name" >  
    <intent-filter>  
      <action android:name="android.intent.action.VIEW" />  
      <category android:name="android.intent.category.DEFAULT" />  
      <category android:name="android.intent.category.BROWSABLE" />  
    </intent-filter>  
 </activity>  

3) Agora vamos estabelecer como os browsers invocarão nossa Activity, ou seja, como ela será referenciada pelos browsers.

Um link é composto por um schema, um host e alternativamente por caminhos (schema://host/caminho/). Para que nossa Activity seja acessada por browsers precisamos estabelecer o link que invocará a mesma e como todo link, este também deverá conter tais atributos. O Android facilita esta tarefa ao permitir que estabeleçamos tais atributos através da tag "<data>" declarada dentro da sessão do "<intent-filter>" localizado dentro da declaração de nossa Activity. Para que nossa Activity seja acessada via link "http://www.poc.projetobrowser/open/" inclua o seguinte trecho de código logo abaixo da "category" BROWSABLE antes já definida:

 <data android:scheme="http" android:host="www.poc.projetobrowser" android:path="/open/"/>  

Note que nenhum destes valores são pré-estabelecidos, ou seja, você poderia definir o "schema" como "meuApp", o "host" como "www.abobrinha.com" e o "path" como "/qualquercoisa/" e, assim sendo, sua Activity poderia ser invocada pelo link "meuApp://www.abobrinha.com/qualquercoisa/".

4) Alguns browser, como por exemplo o próprio Chrome, ignoram o "www" em suas requisições e isso pode afetar o funcionamento de nosso projeto. Para que isso não ocorra, adicione outro parâmetro "<data>" substituindo o valor do atributo "host" pelo mesmo porém retirando o "www". Em nosso caso ficará assim:

 <data android:scheme="http" android:host="poc.projetobrowser" android:path="/open/"/>  

Ao final de tudo isso nosso arquivo "AndroidManifest.xml" deverá estar assim:

 <?xml version="1.0" encoding="utf-8"?>  
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
   package="com.poc.projetobrowser"  
   android:versionCode="1"  
   android:versionName="1.0" > 
 
   <uses-sdk  android:minSdkVersion="14"  android:targetSdkVersion="21" /> 
 
   <application  
     android:allowBackup="true"  
     android:icon="@drawable/ic_launcher"  
     android:label="@string/app_name"  
     android:theme="@style/AppTheme" > 
 
     <activity  
       android:name=".MainActivity"  
       android:label="@string/app_name" >
  
       <intent-filter>  
         <action android:name="android.intent.action.VIEW" />  
         <category android:name="android.intent.category.DEFAULT" />  
         <category android:name="android.intent.category.BROWSABLE" /> 
 
         <data android:scheme="http" android:host="www.poc.projetobrowser" android:path="/open/" />  
         <data android:scheme="http" android:host="poc.projetobrowser" android:path="/open/"/>  
       </intent-filter>  

     </activity>  

   </application>  
 </manifest>  

Toda a configuração necessário do lado da aplicação está concluída!! Agora vamos para o lado WEB.

5) Você precisará de um servidor para hospedar sua página HTML para que a mesma fique disponível para ser acessada via browser do dispositivo. Existem vários servidores gratuitos na internet. Eu utilizo o www.bugs3.com que vem satisfazendo as necessidades muito bem.

6) Crie uma simples página HTML com um botão que ao ser clicado invocará sua Activity. Abaixo está o HTML com o botão:


 <html>   
   <head>   
   </head>   
   <body>    
        <button onClick="chamarAplicativo()">Chamar Meu Aplicativo</button>  
   </body>   
</html>   

O código acima apenas criará o botão mostrado abaixo (sem nenhuma ação):


7) Percebemos que ao clicar no botão acima, será chamada uma função "Javascript" que ainda não foi definida. Esta função fará a mágica!! Vamos construí-la começando com a identificação de qual plataforma e Sistema Operacional está renderizando nosso HTML, pois apenas quando o mesmo for aberto em um browser que está rodando dentro de um dispositivo Android que nossa aplicação poderá ser chamada. Fazemos isso da seguinte forma:

 function chamarAplicativo(){   
     var user = navigator.userAgent.toLowerCase();  
     var isAndroid = user.indexOf("android");  
      if(isAndroid > -1){  
           //mágica aqui!!                 
      }  
 }   

8) E aqui está a linha de código obscura em "Javascript" que abre nossa Aplicação de acordo com os parâmetros que definimos anteriormente:

 location.href="intent://poc.projetobrowser/open/#Intent;package=com.poc.projetobrowser;scheme=http;end;";  

9) O que está linha faz? Resumidamente, dispara para o SO Android um "Intent" com o host "poc.projetobrowser", com o caminho "/open/" e o schema "http". Se tal aplicativo não for achado instalado no SO Android, o usuário será direcionado para o Google Play Store em uma busca pelo aplicativo registrado com o valor descrito no atributo "package" na linha acima. Em nosso caso, "com.poc.projetobrowser".

A página HTML completa ficará assim:

 <html>   
      <head>   
        <script type="text/javascript">   
                function chamarAplicativo(){   
                     var user = navigator.userAgent.toLowerCase();  
                     var isAndroid = user.indexOf("android");  
                     if(isAndroid > -1){  
                          location.href="intent://poc.projetobrowser/open/#Intent;package=com.poc.projetobrowser;scheme=http;end;";  
                     }  
                }   
        </script>   
      </head>   
      <body>    
           <button onClick="chamarAplicativo()">Chamar Meu Aplicativo</button>  
      </body>   
  </html>   

Para facilitar o teste de seu aplicativo, sabendo que a parte WEB geralmente não fica para o desenvolvedor Mobile, criei uma página HTML onde você pode passar os dados de configuração de seu aplicativo e chamá-lo através da mesma. A página é mostrada abaixo:

 <html>   
      <head>   
        <script type="text/javascript">   
                function chamarAplicativo(){   
                     var user = navigator.userAgent.toLowerCase();  
                     var isAndroid = user.indexOf("android");  
                     if(isAndroid > -1){  
                          location.href="intent://poc.projetobrowser/open/#Intent;package=com.poc.projetobrowser;scheme=http;end;";  
                     }  
                }   
                function chamarAplicativoTerceiro(){   
                     var user = navigator.userAgent.toLowerCase();  
                     var isAndroid = user.indexOf("android");  
                     if(isAndroid > -1){  
                          var schema = document.getElementById("txt_schema").value;  
                          var host = document.getElementById("txt_host").value;  
                          var path = document.getElementById("txt_path").value;  
                          var inputPackage = document.getElementById("txt_package").value;  
                          location.href="intent://"+host+path+"#Intent;package="+inputPackage+";scheme="+schema+";end;";  
                     }  
                }   
        </script>   
      </head>   
      <body>    
           <div>   
                <form id="form1">   
                     <table width="100%" class="mytable">   
                          <tr>   
                               <td>Schema</td>   
                          </tr>   
                          <tr>   
                               <td><input type="text" id="txt_schema"></td>   
                          </tr>   
                          <tr>   
                               <td>Host</td>   
                          </tr>   
                          <tr>   
                               <td><input type="text" id="txt_host"></td>   
                          </tr>   
                          <tr>   
                               <td>Path</td>   
                          </tr>   
                          <tr>   
                               <td><input type="text" id="txt_path"></td>   
                          </tr>   
                          <tr>   
                               <td>Package (atributo 'package' no arquivo 'AndroidManifest.xml')</td>   
                          </tr>   
                          <tr>   
                               <td><input type="text" id="txt_package"></td>   
                          </tr>   
                     </table>   
                </form>   
           </div>   
           <button onClick="chamarAplicativo()">Aplicativo Tutorial</button>  
           <button onClick="chamarAplicativoTerceiro()">Aplicativo Terceiro</button>  
      </body>   
  </html>   



E pode ser acessada através do link www.jonathan.bugs3.com/android.html. Lembre-se que para funcionar, está página deverá ser acessada do browser de um dispositivo móvel com Sistema Operacional Android.

É isso aí!! Se tudo ocorreu bem e você seguiu todo o passo-a-passo, certamente você terá em mãos uma aplicação que pode ser iniciada através do browser!!

Faça o download do código fonte da aplicação AQUI.