Caso de Uso:
Tínhamos que buscar alguns dados de tabelas diferentes para utilizarmos em nosso aplicativo.
Para isso, fizemos um barramento SOA (que não vou postar por motivo de sigilo da empresa...) e conectamos este cliente a ele.
Problemas resolvidos com este código:
Swing: Utilização de tabelas dentro de abas, sem a utilização de containers.
Popular tabelas com array bidimensional de strings
SOA: Transportar strings entre o barramento e o Cliente.
-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.encoding.XMLType;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class Unitizacao implements ActionListener{
JFrame tela = new JFrame();
JTextField TfOdex;
JTable tbData1, tbData2, tbData3, tbData4, tbData5;
JTextArea area6 = new JTextArea();
public static void main(String args[]){
// Cria o Objeto para tirar o swing de um método static
Unitizacao u = new Unitizacao();
u.run();
}
public void run(){
// Tenta utilizar uma biblioteca de aparencia para o Swing
try{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
}catch(Exception e){
area6.setText(e.getMessage());
}
// Layout null para posicionamento manual dos itens
tela.setLayout(null);
// INÍCIO GRUPO DE OBJETOS DO CABEÇALHO
// Objeto do texto Odex
JLabel LbOdex = new JLabel("ODEX");
// Objeto Font para ajustar o tipo, estilo e tamanho da fonte
Font t = new Font("Arial", Font.BOLD, 20);
// Atribuindo o Objeto Font ao Objeto do texto Odex
LbOdex.setFont(t);
// ajustar posição do elemento no JPanel: (coluna, linha, largura, altura)
LbOdex.setBounds(10, 40, 60, 30);
// Objeto da caixa de diálogo
TfOdex = new JTextField("");
// ajustar posição do elemento no JPanel: (coluna, linha, largura, altura)
TfOdex.setBounds(80, 40, 370, 30);
// Objeto do botão Consultar
JButton consulta = new JButton("Consultar");
consulta.setBounds(480, 40, 120, 30);
// Adiciona o listner ao Botão
consulta.addActionListener(this);
// Determina o comando que o listener recebe ao clicar no Botão
consulta.setActionCommand("consultar");
// Objeto do botão Sair
JButton sair = new JButton("Sair");
sair.setBounds(630, 40, 120, 30);
sair.addActionListener(this);
sair.setActionCommand("sair");
// FIM DO GRUPO DE OBJETOS DO CABEÇALHO
// INÍCIO DO GRUPO DE OBJETOS DE ABAS
// Cria o Objeto do conjunto de Abas
JTabbedPane tabelaDePaineis = new JTabbedPane(JTabbedPane.TOP);
tabelaDePaineis.setBounds(0, 100, 800, 500);
// ABA 1
// Objeto da Aba 1
JPanel painel01 = new JPanel(null);
// Objeto da Tabela
tbData1 = new JTable();
tbData1.setBounds(5,5,685,360);
tbData1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
// Crio o objeto do Scroll e coloco a tabela dentro dele.
JScrollPane sc = new JScrollPane(tbData1);
sc.setBounds(5,5,780,430);
// Indica que a scroll bar vertical é necessária
sc.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
// Indica que a scroll bar horizontal é necessária
sc.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// Adiciona a Scroll (com a tabela dentro) no objeto da primeira aba.
painel01.add(sc);
// ABA 2
JPanel painel02 = new JPanel(null);
tbData2 = new JTable();
tbData2.setBounds(5,5,685,360);
tbData2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane sc2 = new JScrollPane(tbData2);
sc2.setBounds(5,5,780,430);
sc2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
sc2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
painel02.add(sc2);
// ABA 3
JPanel painel03 = new JPanel(null);
tbData3 = new JTable();
tbData3.setBounds(5,5,685,360);
tbData3.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane sc3 = new JScrollPane(tbData3);
sc3.setBounds(5,5,780,430);
sc3.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
sc3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
painel03.add(sc3);
// ABA 4
JPanel painel04 = new JPanel(null);
tbData4 = new JTable();
tbData4.setBounds(5,5,685,360);
tbData4.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane sc4 = new JScrollPane(tbData4);
sc4.setBounds(5,5,780,430);
sc4.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
sc4.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
painel04.add(sc4);
// ABA 5
JPanel painel05 = new JPanel(null);
tbData5 = new JTable();
tbData5.setBounds(5,5,685,360);
tbData5.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane sc5 = new JScrollPane(tbData5);
sc5.setBounds(5,5,780,430);
sc5.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
sc5.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
painel05.add(sc5);
// ABA 6 - LOG
JPanel painel06 = new JPanel(null);
area6.setBounds(5,5,685,360);
JScrollPane sc6 = new JScrollPane(area6);
sc6.setBounds(5,5,780,430);
sc6.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
sc6.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
painel06.add(sc6);
// adiciona as abas no objeto de abas
tabelaDePaineis.addTab("Informações",painel01);
tabelaDePaineis.addTab("Detalhes",painel02);
tabelaDePaineis.addTab("MaterialUC",painel03);
tabelaDePaineis.addTab("MaterialCOM",painel04);
tabelaDePaineis.addTab("Serviços",painel05);
tabelaDePaineis.addTab("Log",painel06);
// ADICIONANDO OS OBJETOS AO FRAME
tela.add(LbOdex);
tela.add(TfOdex);
tela.add(consulta);
tela.add(sair);
tela.add(tabelaDePaineis);
// SETANDO DETALHES DO FRAME
tela.setTitle("Unitização");
tela.setSize(800, 600);
tela.setBounds(100,100, 800, 600);
tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setResizable(false);
tela.setVisible(true);
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals("consultar")){
String[][] resposta = null;
// chama o método de conexão, passando o método que será invocado.
resposta = conecta("Informacoes");
// ajusta a tabela com o array retornado pela conexão.
tbData1.setModel(new DefaultTableModel(resposta, new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13"}));
resposta = conecta("Detalhes");
tbData2.setModel(new DefaultTableModel(resposta, new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13"}));
resposta = conecta("MaterialUC");
tbData3.setModel(new DefaultTableModel(resposta, new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13"}));
resposta = conecta("MaterialCOM");
tbData4.setModel(new DefaultTableModel(resposta, new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13"}));
resposta = conecta("Servicos");
tbData5.setModel(new DefaultTableModel(resposta, new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13"}));
}
if(e.getActionCommand().equals("sair")){
System.exit(0);
}
}
public String[][] conecta(String operacao){
String[][] resposta = null;
Service service = new Service();
Call call;
String odex = TfOdex.getText();
try {
call = (Call) service.createCall();
// Atribuindo a URL do Servico
// Importante: é necessário um serviço SOA para conexão
call.setTargetEndpointAddress(new java.net.URL("<<INSERIR AQUI A URL DO BARRAMENTO SOA IMPLEMENTADO>>"));
// Definindo o metodo a ser invocado
call.setOperationName(operacao);
// Definindo os parametros de entrada
call.addParameter("odex", XMLType.XSD_STRING, ParameterMode.IN);
// Definindo o tipo do parametro de retorno
call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_ARRAY);
// Invocando o servico
resposta = (String[][]) call.invoke(new Object[] {odex});
} catch (Exception ex) {
String a = "Serviço "+operacao+" "+ex.getMessage();
area6.setText(a);
}
return resposta;
}
}
Mostrando postagens com marcador JAVA-SOA. Mostrar todas as postagens
Mostrando postagens com marcador JAVA-SOA. Mostrar todas as postagens
sexta-feira, 11 de fevereiro de 2011
segunda-feira, 17 de janeiro de 2011
SOA TomCat-Axis
Guia para implementação de WebServices em Container TomCat:
Introdução:
O objetivo deste guia é mostrar – passo a passo – como implementar um webService, com servidor e cliente, funcional, em ambiente TOMCAT.
Um WebService é qualquer aplicação que é dividia em cliente e servidor.
O Servidor: É a parte do sistema responsável pelo processamento dos dados, CRUD e encaminhamento dentro da rede.
O Cliente pode coletar (do usuário ou de outros aplicativos ou bancos), enviar e/ou receber dados do servidor e/ou apresentar os dados enviados pelo servidor (a usuários ou encaminhar a outras aplicações).
Através dos estudos de caso, notou-se que o Container Tomcat serve para publicar páginas e aplicações web, mas não possui muito suporte sobre o processamento dos serviços. Isso porque, pelo menos para JAVA, o TomCat não disponibiliza API’s necessárias para referência nas aplicações. Assim, o princípio do servidor, de processar dados, não pode ser alcançado pela falta de capacidade de interpretação de componentes necessários.
Foi aferido que existem outros Container’s que mostram mais suporte às aplicações, como o GlassFish e o JBossESB. Destes dois, em específico, o GlassFish mostrou-se o mais simples, apresentando pouco mais que as API’s básicas para uma aplicação CRUD convencionais. O Container JBossESB, por sua vez, além de suportar aplicações JAVA, estende-as com API’s específicas para implementação de barramentos web, auxiliando desde o processo de codificação (ampliando a gama de extensões suportadas pelo Eclipse com JbossTools, por exemplo), passando por automações na comunicação entre clientes e servidores chegando a oferecer até um ambiente gráfico mais eficiente para manipulação dos arquivos que participam do webService. Claro que cada facilidade apresentada por estes outros Container’s implica em tamanho maior do Container e demora significativa no tempo de execução das aplicações.
Ambiente de Trabalho:
O TomCat, sozinho, não possui capacidade de implementar webServices.
Por isso, a Apache disponibiliza um complemento chamado Axis.
Executável TomCat:
Zip com a pasta Axis:
Complemento xerces:
1 – Instale o TomCat normalmente;
2 – Descompacte o zip do Axis;
3 – Mova a pasta "Axis", que encontra-se dentro do diretório webapps do arquivo, para a pasta webapps do TomCat;
4 – Descompactar o zip do xerces;
5 – Mover os arquivos “xercesImpl.jar” e “xml-apis.jar” da pasta xerces para a pasta axis\lib\ (do próprio diretório Axis, descompactado anteriormente).
6 – Criar as seguintes variáveis de ambiente:
(Criar as JAVA, caso ainda não estejam criadas, também.)
AXIS_HOME=C:\axis
AXIS_LIB=%AXIS_HOME%\lib
AXISCLASSPATH=%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging- 1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\jaxrpc.jar
7 – Mover o arquivo tools.jar da pasta lib do JAVA para a pasta lib do Axis, dentro do TomCat.
8 - Pode-se testar se o ambiente está ok abrindo o navegador e digitando a seguinte URL:
Se aparecer a tela do servidor Axis, estará tudo ok.
Desenvolvimento do Servidor:
1 - Abra a IDE e crie a seguinte classe JAVA:
/*
* Esta classe foi desenvolvida para ser referencia de teste para implementação de SOA.
* Este é um arquivo de servidor webService.
* Recebe duas variáveis Inteiras do cliente e devolve a soma delas para o cliente
*/
public class Calculadora {
public int somar( int a, int b ) {
return a + b;
}
}
2 – Salve o arquivo do servidor;
3 – Copie o arquivo do seu contexto para a pasta:
C:\Arquivos de programas\Apache Software Foundation\Tomcat 7.0\webapps\axis\
4 – No Browser, digite a seguinte URL:
Aparecerá a seguinte tela:
Clicando no Link, você verá o arquivo WSDL:
Agora, o servidor TomCat/Axis já possui o arquivo de comunicação pronto, aguardando o envio de dados pelo cliente.
1 – Certifique-se que a IDE possui as Lib’s do Axis.
No Eclipse, para incluir as Lib’s, Basta clicar o botão direito sobre a pasta do projeto -> Propriedades.
JavaBuildPaths -> Libraries -> Add External JAR’s
Selecione todas as JAR’s da pasta LIB do Axis -> OK.
2 – Abra a IDE e crie o seguinte arquivo:
import javax.swing.*;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;
public class Cliente {
public Cliente(){
}
private void invocaServico(String endpointURL, int mensagem1, int mensagem2){
int resposta = 0;
Service service = new Service();
Call call;
try {
call = (Call) service.createCall();
// Atribuindo a URL do Servico
call.setTargetEndpointAddress(new java.net.URL(endpointURL));
// Definindo o metodo a ser invocado
call.setOperationName("somar");
// Definindo os parametros de entrada
call.addParameter("a", XMLType.XSD_INT, ParameterMode.IN);
call.addParameter("b", XMLType.XSD_INT, ParameterMode.IN);
// Definindo o tipo do parametro de retorno
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT);
// Invocando o servico
resposta = (Integer) call.invoke(new Object[] {mensagem1, mensagem2});
// Imprimindo a resposta
JOptionPane.showMessageDialog(null, "Servico invocado...\n" + resposta);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String args[]){
args= new String[3];
// Aqui é colocado o caminho que está indicado no arquivo WSDL.
args[0]="http://localhost:8080/axis/Calculadora.jws?wsdl";
args[1]="4";
args[2]="4";
String endpointURL = null;
int mensagem1 = 0;
int mensagem2 = 0;
if (args.length < 3){
System.out.println("Sintaxe errada. \nInforme a URL e a Mensagem");
System.out.println("Ex: java ClientHelloWorld http://localhost:8080/axis/HelloWorld.jws \"Ola mundo\"");
System.exit(0);
}
try {
//Obtendo a URL do Servico Web
endpointURL = args[0];
//Obtendo a mensagem 1
args[1] = JOptionPane.showInputDialog("Digite o primeiro fator da Soma:");
mensagem1 = Integer.parseInt(args[1]);
//Obtendo a mensagem 2
args[2] = JOptionPane.showInputDialog("Digite o segundo fator da Soma:");
mensagem2 = Integer.parseInt(args[2]);
} catch (Exception ex) {
ex.printStackTrace();
}
//Criando uma instancia da classe ClientHelloWorld
Cliente client = new Cliente();
//Invocando o metodo 'invocaServico'
client.invocaServico(endpointURL, mensagem1, mensagem2);
}
}
3 – Compile e Rode.
Conclusão
1 – O cliente vai solicitar dois números para o usuário;
2 – O usuário irá fornecer e clicar “OK” para cada número;
3 – O cliente irá estabelecer uma conexão através do caminho do arquivo WSDL;
3 – O cliente irá enviar dois parâmetros para o servidor: número 1 e número 2;
4 – O servidor irá receber os parâmetros, efetuar a soma e devolver o resultado;
5 – O cliente irá receber a resposta e mostrar na tela a resposta para sua solicitação.
Esta é uma aplicação básica, podendo apenas trabalhar com:
1 – Sempre precisamos ter o fonte Java disponível;
2 – A classe não pode fazer parte de nenhum pacote;
3 – Não pode utilizar outros tipos, senão os básicos do Java (primitivos, wrappers e String).
Mesmo assim, este modo de aplicação pode muito bem ser utilizada como base para vários clientes enviando e recebendo informações para um servidor com vários métodos de controle, que reenvia para os clientes corretos as informações necessárias.
Assinar:
Postagens (Atom)