MasterReplace, é um projeto swing sem nenhuma utilidade aparente. Sua única utilidade, ao menos para mim, é educativa, visando aprender e treinar além de um pouco de Orientação à Objetos, também a manipulação de arquivos.

Este programa altera letras, palavras ou textos em arquivos de texto, convertendo entre sí códigos de base HEXA, HTML ou ALPHA.
Um exemplo mais prático:

Supondo que eu possua um arquivo de 500 mil linhas, e em vários lugares deste arquivo existem letras acentuadas (á, ç, õ, etç), porém eu preciso destas letra em html (&Acute, &ccedil, etç), então eu seleciono um arquivo, escolho as opções “De Alpha” e “Para HTML”, e o programa se vira fazendo as alterações necessárias, sem perder nenhuma outra informação do arquivo.
Imagem da aba de tradução de arquivos, do projeto MasterReplace.

Existe também a possibilidade de “traduzir” trechos de texto, em outra aba é possível digitar um texto qualquer, abaixo é possível selecionar “DE” e “PARA”, e na mesma caixa de texto o programa efetua a tradução.
Imagem da aba de tradução de textos, do projeto MasterReplace

Apesar desta  aparente “inutilidade”, o programa serve como exemplo para muitas outras coisas, principalmente para manipulação de arquivos, que será o foco dos próximos posts relacionados.

Downloads:

JAR (projeto executável – Java 6)
RAR (fontes do projeto – Java 6)

OBS.: Para executar o jar, digite no prompt de comando “java -jar ARQUIVO”, substituindo obviamente a palavra “ARQUIVO” pelo caminho e/ou nome do arquivo.

Aviso: Este post é quase um livro!

Algum tempo atraz, mas precisamente na matéria sobre WindowListener, comentei sobre a lógica necessária para enviar uma Janela Swing para a bandeja do sistema, ou Area de Notificação, ou SystemTray, ou como você gosta de chamar aquele cantinho inferior direito, ao lado do relógio, onde fica um aglomerado de ícones que as vezes nem conhecemos.

Teoricamente tudo é facil, o difícil é apenas implementar a solução ao nosso projeto já finalizado…
Mas vamos parar no pensamento que “tudo é facil”, e seguir em frente com este tutorial que ficou bem grande, e é quase todo código!

Primeiro vamos à lógica necessária:
Se você deseja enviar uma janela para a bandeja do sistema, desista, você nunca vai conseguir isso (ao menos em java), missão impossível.
O que podemos fazer é uma pequena “gambiarra”, invisível aos olhos de meros mortais.
Essa “POG” consiste em:

– Capturar o evento “MINIMIZAR” ou “FECHAR” ou qualquer outra porcaria que você queira.
– Deixar a janela que foi minimizada INVISÍVEL!
– Instanciar uma nova classe que coloca um icone bonitinho ao lado do relógio.
– Colocar um menu flutuante nesse icone (Menu Popup)
– Capturar os eventos de click nos itens deste menu
- Caso o item selecionado seja “Abrir novamente a jenela principal” deve-se deixar o frame principal VISIVEL novamente e “matar” as variáveis utilizadas para criar o icone bonitinho ao lado do relógio.

(mais…)

Realizando um teste básico

O Axis aceita que um Web Service seja chamado via uma requisição HTTP-GET. Portanto, ao digitar um endereço é possível testar o web service. No exemplo deste artigo o endereço é este: http://localhost:8080/axis/Servico.jws?method=soma&valor1=2&valor2=4 .

Como pode-se notar, o endereço é a junção de um namespace, que é o endereço do WebService representado por http://localhost:8080/axis/Servico.jws , a variável method que, como seu nome diz, contém o nome do método que se deseja executar, e uma sequência dos parâmetros deste método. Lembrando que o nome dos parâmetros deve ser o mesmo definido na função da classe.

O resultado da execução é um documento XML com a resposta 6 . Novamente, dependendo do browser não será visivel as tags XML. O XML que retornou na execução está abaixo:

<?xml version=”1.0″ encoding=”UTF-8″?>
<soapenv:Envelope
      xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/”
      xmlns:xsd=”http://www.w3.org/2001/XMLSchema”
      xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”>
<soapenv:Body>
<somaResponse soapenv:encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”>
<somaReturn xsi:type=”xsd:int”>6</somaReturn>
</somaResponse>
</soapenv:Body>
</soapenv:Envelope>

Criando um cliente em Java para acessar o Servidor

O cliente também é uma classe simples, mas exige conhecimento em algumas classes não tão comuns no dia-a-dia.

As classes Service e Call são classes do Axis , portanto, para compilar e executar esta classe é necessário que todo o diretório lib, encontrado dentro do zip do Axis esteja no CLASSPATH da aplicação.

Visto este detalhe, abaixo encontra-se o arquivo fonte do cliente de Web Service. Esta classe fará a conexão ao Web Service para somar 2 com 4 e irá apresentar o resultado 6 na saída padrão.

import org.apache.axis.client.Service;
import org.apache.axis.client.Call;
public class Cliente {
     public static void main(String[] args) throws Exception {
          // Endereço, local onde encontra-se o Web Service
          String local = “http://localhost:8080/axis/Servico.jws”;
         // Criando e configurando o serviço
          Call call = (Call) new Service().createCall();
         // Configurando o endereço.
          call.setTargetEndpointAddress(local);
          // Marcando o método a ser chamado.
          call.setOperationName(“soma”);
          // Parâmetros da função soma.
          Object[] param = new Object[]{new Integer(2),new Integer(4)};
         // Retorno da Função
          Integer ret = (Integer)call.invoke(param);
         // Imprime o resultado: ret = 2 + 4.
          System.out.println(“Resultado da soma : “ + ret);
     }
}

Este código está dentro de um arquivo chamado Cliente.java, após compilar e executar esta classe exibirá o resultado ” Resultado da soma: 6 “ como desejado.

O framework do Axis trata a primitiva int e a classe wrapper Integer como sendo iguais. Portanto, tanto faz usar uma ou outra. Neste exemplo, foi criado o Web Service com dois parâmetros int e aqui no cliente estamos usando dois parâmetros Integer .

Como pode-se notar, o framework do Axis abstrai qualquer trabalho com XML, evitando que o desenvolvedor necessite conhecer a sintaxe do XML do SOAP.

 

E com isso, chegamos ao fim deste tutorial, boa sorte no desenvolvimento do seu webservice!

Implementando um Web Service simples

O objetivo é aprender, então será criado um serviço bem simples. O serviço é a soma de duas variáveis inteiras retornando o resultado. Este exemplo poderá servir para qualquer outra implementação. Abaixo está a classe implementada. O nome do arquivo é Servico.java:

public class Servico {
      public int soma(int valor1, int valor2) {
            return valor1 + valor2;
      }
}

Agora só falta disponibilizá-lo no nosso servidor para o mundo acessar. E, para fazer isso, deve-se alterar o nome do arquivo de Servico.java para Servico.jws, coloca-lo no diretório: CATALINA_HOME / webapps / axis / e iniciar o servidor, se ele já não estiver iniciado. Se já estiver iniciado, o seu Web Service está publicado.

Os arquivos. jws são lidos pelo Axis e representam Java Web Services. O Axis se baseará nesses arquivos (. jws) para criar os arquivos de definição WSDL. Todos os métodos públicos existentes nessas classes serão automaticamente disponibilizados para terceiros.

Criar documentos XML é demorado e, muitas vezes, chato. Gerar o WSDL é uma característica muito relevante na escolha de uma implementação de SOAP e o Axis é um dos poucos frameworks que conseguem fazer essa façanha de maneira transparente para o desenvolvedor. É por esse motivo que ele é altamente recomendado na construção de Web Services.

Para acessar o Web Service criado basta abrir um navegador e ir ao endereço: http://localhost:8080/axis/Servico.jws . Da mesma forma que os outros dois Web Services foram vistos, este também terá um link para ver a especificação WSDL, e novamente poderá ser visto ou não dependendo do seu navegador.

O arquivo WSDL da classe Servico ficará como abaixo:

<?xml version=”1.0″ encoding=”UTF-8″?>
<wsdl:definitions targetNamespace=”http://localhost:8080/axis/Servico.jws”   
       xmlns=”http://schemas.xmlsoap.org/wsdl/”   
       xmlns:apachesoap=”http://xml.apache.org/xml-soap”   
       xmlns:impl=”http://localhost:8080/axis/Servico.jws”   
       xmlns:intf=”http://localhost:8080/axis/Servico.jws”   
       xmlns:soapenc=”http://schemas.xmlsoap.org/soap/encoding/”   
       xmlns:wsdl=”http://schemas.xmlsoap.org/wsdl/”   
       xmlns:wsdlsoap=”http://schemas.xmlsoap.org/wsdl/soap/”   
       xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>  
    <wsdl:message name=”somaRequest”>  
<wsdl:part name=”valor1″ type=”xsd:int”/>  
<wsdl:part name=”valor2″ type=”xsd:int”/>  
   </wsdl:message>  
   <wsdl:message name=”somaResponse”>  
<wsdl:part name=”somaReturn” type=”xsd:int”/>  
   </wsdl:message>  
   <wsdl:portType name=”Servico”>  
     <wsdl:operation name=”soma” parameterOrder=”valor1 valor2″>  
<wsdl:input message=”impl:somaRequest” name=”somaRequest”/>  
       <wsdl:output message=”impl:somaResponse” name=”somaResponse”/>  
     </wsdl:operation>  
   </wsdl:portType>  
<wsdl:binding name=”ServicoSoapBinding” type=”impl:Servico”>  
<wsdlsoap:binding style=”rpc” transport=”http://schemas.xmlsoap.org/soap/http”/>  
     <wsdl:operation name=”soma”>  
       <wsdlsoap:operation soapAction=”"/>  
       <wsdl:input name=”somaRequest”>  
         <wsdlsoap:body encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”   
             namespace=”http://DefaultNamespace” use=”encoded”/>  
       </wsdl:input>  
       <wsdl:output name=”somaResponse”>  
         <wsdlsoap:body encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”   
             namespace=”http://localhost:8080/axis/Servico.jws” use=”encoded”/>  
       </wsdl:output>  
     </wsdl:operation>  
   </wsdl:binding>  
   <wsdl:service name=”ServicoService”>  
<wsdl:port binding=”impl:ServicoSoapBinding” name=”Servico”>  
<wsdlsoap:address location=”http://localhost:8080/axis/Servico.jws”/>  
     </wsdl:port>  
   </wsdl:service>  
</wsdl:definitions>  

 

Analisar este arquivo é essencial para entender a profundidade da implementação. Uma das linhas mais importantes para este arquivo é a 19ª linha, onde define-se o nome do método e o nome de seus parâmetros. Eles deverão ser de conhecimento público para que as interfaces cliente consigam se comunicar com o Web Service.

O que são Controladores ou Modificadores de Acesso?
Com certeza você já os viu, aqui mesmo neste blog. O projeto JSF, jReMSN, Hibernate e até mesmo o projeto Webservice estão cheios deles, mas o que são?

  • default
  • public
  • private
  • protected
  • final
  • abstract

Como pode ver, essas são palavras que sempre nos acompanham nas declarações de classes, métodos e variáveis, aqui vamos ver uma breve descrição de cada uma.

(mais…)

Próxima Página »