JSR 172 – Webservices
Aula 8
Marcio Seiji Oyamada
IWS'2009 - Buenos AiresPage � 67
Webservice
�Fornecer acesso a serviços através da tecnologia html+xml
– Interface para acesso a serviços
– Comunicação
– Interoperabilidade
�Elementos da tecnologia
– SOAP (Simple Object Access Protocol)
– UDDI (Universal Description, Discovery and Integration)
– WSDL (Web Services Description Language)
�Exemplos de webservices
– Amazon
– Yahoo
IWS'2009 - Buenos AiresPage � 68
Webservice + JavaME
IWS'2009 - Buenos AiresPage � 69
JSR 172
�Stub
– Inicializa propriedades para a
chamada remota
– Codifica parâmetros de entrada
– Realiza a chamada do serviço
remoto
– Decodifica o retorno
IWS'2009 - Buenos AiresPage � 70
JSR 172 – Características e Limitações
�Obedece ao padrão WS-I Basic Profile
�Suporta SOAP 1.1
�Suporta qualquer protocolo de transporte
�Suporta os seguintes tipos de dados
– boolean, byte, short, int, long, float, double, String
– arrays de tipos primitivos
– tipos complexos (estruturas contendo tipos primitivos e
complexos)
IWS'2009 - Buenos AiresPage � 71
JSR 172 – Características e Limitações(2)
�Suporta somente mensagens: Document/Literal. Não suporta a representação Encoded
�Não suporta mensagens SOAP com anexos
�Não suporta manipuladores de mensagens
�O dispositivo não pode ser provedor de webservices
�Não suporta UDDI (serviço de descoberta)
IWS'2009 - Buenos AiresPage � 72
Gerador de Stub
�Gera os stubs e classes necessárias para chamar o webservice
– Entrada: Arquivo WSDL
– Saida: conjunto de classes para utilizar o WebService
IWS'2009 - Buenos AiresPage � 73
Gerando stubs
�Plataformas Java -> WTK -> Utilitários -> Gerador de stub
IWS'2009 - Buenos AiresPage � 74
Utilizando o WebService
public class MIDletCalculadora extends MIDlet implements CommandListener, Runnable {
public void commandAction(Command command, Displayable displayable) {
if (displayable == form) {
if (command == okCommand) {
Thread t= new Thread(this);
t.start();
}
}
}
public void run(){
try {
if (service == null) {
service = new WebCalculadora_Stub();
service._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8084/PedagioWebService/WebCalculadora");
}
int resultado = service.soma(10, 20);
Form f= getForm();
f.append(String.valueOf(resultado));
} catch (RemoteException ex) {
ex.printStackTrace();
}
}
//Atenção, demais métodos do MIDlet omitidos
IWS'2009 - Buenos AiresPage � 75
Utilizando o WebService
public class MIDletCalculadora extends MIDlet implements CommandListener, Runnable {
public void commandAction(Command command, Displayable displayable) {
if (displayable == form) {
if (command == okCommand) {
Thread t= new Thread(this);
t.start();
}
}
}
public void run(){
try {
if (service == null) {
service = new WebCalculadora_Stub();
service._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,
"http://localhost:8084/PedagioWebService/WebCalculadora");
}
int resultado = service.soma(10, 20);
Form f= getForm();
f.append(String.valueOf(resultado));
} catch (RemoteException ex) {
ex.printStackTrace();
}
}
//Atenção, demais métodos do MIDlet omitidos
IWS'2009 - Buenos AiresPage � 76
Exercício
�Implemente um MIDlet para acessar o webservice que dado uma origem e um destino, retorna o
número de pedágios e valor total entre a origem e o
destino.
�WSDL
– http://localhost:8084/PedagioWebService/PedagioWebServ
ice?wsdl
WMA – Wireless messaging
API
JSR 120
IWS'2009 - Buenos AiresPage � 78
SMS e MMS
�Método interoperável para troca de mensagens
�Funciona entre diferentes operadoras e tecnologias
�Possibilita o envio de mensagens de até 160
caracteres
�Não é necessário rede internet
�Não é necessário que o dispositivo destino esteja ligado no momento do envio
IWS'2009 - Buenos AiresPage � 79
WMA
�WMA utiliza o Generic Connection Framework
(GCF)
– Aparelhos endereçados pelo número de telefone
– Endereço: “sms://4591000000”
�Possibilita tanto o envio e o recebimento de
mensagens
IWS'2009 - Buenos AiresPage � 80
Classes WMA
�Pacote: javax.wirelles.messaging
�Classes
– Message: representa uma mensagem. Interfaces
TextMessage e BinaryMessage
– MessageConnection: conexão para envio de mensagens.
Métodos send e receive
– MessageListener: interface para tratamento de mensagens
assíncronas
IWS'2009 - Buenos AiresPage � 81
Passos para envio de uma mensagem
�Criar um conectorMessageConnection conn =
(MessageConnection) Connector.open("sms://04599009999");
�Criar uma mensagem, neste caso de textoTextMessage txtmessage = (TextMessage) conn.newMessage(
MessageConnection.TEXT_MESSAGE);
� Inicializar o textotxtmessage.setPayloadText(msgString);
�Enviar a mensagemconn.send(txtmessage);
**Utilize threads para o envio
IWS'2009 - Buenos AiresPage � 82
Testando o envio de mensagem
�Plataforma Java -> Utilitarios -> Console WMA
IWS'2009 - Buenos AiresPage � 83
Recebendo SMS
�Criar um conectorMessageConnection conn =
(MessageConnection) Connector.open("sms://:5000"); // ficará escutando na porta
5000
�Esperar pela mensagem e obter o conteúdo da mensagem
while (true) {
Message m= conn.receive();
If (m instanceof TextMessage) {
msgReceived = ((TextMessage)msg).getPayloadText();
}
}
**Utilize threads para o recebimento
IWS'2009 - Buenos AiresPage � 84
Push Registry
�Mecanismo para acionar um MIDlet automaticamente
�Acionamento através de um
– Alarme: data e hora que o MIDlet deverá ser acionado
– Conexão: tipo da conexão e filtros de recebimento
�Push registry
– Estaticamente no arquivo JAD
– Dinamicamente pela MIDlet
IWS'2009 - Buenos AiresPage � 85
Classe PushRegistry
Cancela o registro da conexãounregisterConnection( String MIDlet)
Registra uma MIDlet para responder a uma determinada conexão
registerConnection( String MIDlet, String
connection, String filter)
Registra um alarme para ser disparado a uma determinada hora
registerAlarm(String MIDlet, long time)
Retorna quais as conexões estão associadas a
MIDlet.
listConnections(booelan
active)
Retorna as MIDlets associadas a uma determinada conexão
getMIDlet(String connection)
Retorna os filtros associados com uma
determinada conexão
getFilter(String
connection)
DescriçãoMétodo
IWS'2009 - Buenos AiresPage � 86
Inserindo um PushRegistry
�No toolkit
IWS'2009 - Buenos AiresPage � 87
Tratando um evento do PushRegistry
�Na caso de SMS, implementar a interface MessageListener
�No caso de outros tipos de conexão (socket,
datagramas), utilizar o método
PushRegistry.listConnections(true), logo na
inicialização da MIDlet
– Se a resposta for nulo, a MIDlet foi inicializada
normalmente
– Senão tratar as conexões
IWS'2009 - Buenos AiresPage � 88
Tratando um SMS
public class SMSReceiver extends MIDlet implements CommandListener,MessageListener {
protected void startApp() {
String smsConnection = "sms://:" + "5000";
if (smsconn == null) {
try {
smsconn = (MessageConnection) Connector.open(smsConnection);
smsconn.setMessageListener(this);
} catch (IOException ioe) {ioe.printStackTrace();}
}
if (mForm == null) {
mForm = new Form(“SMSReceiver"); mForm.addCommand(mExitCommand);
mForm.setCommandListener(this);
}
Display.getDisplay(this).setCurrent(mForm);
}
public void notifyIncomingMessage(MessageConnection arg0) {
try {
Message m = arg0.receive();
if (m instanceof TextMessage) {
if (mForm !=null) mForm.append(((TextMessage)m).getPayloadText());
}
} catch (IOException ex) {ex.printStackTrace();}
}
//Alguns métodos foram omitidos
}
IWS'2009 - Buenos AiresPage � 89
Testando PushRegistry
�Para que PushRegistry funcione corretamente énecessário explicitamente colocar quais as
permissões necessárias para execução do MIDlet
�No Emulador utilizar o método OTA para implantar
(Propriedades projeto -> Executando)
IWS'2009 - Buenos AiresPage � 90
Exercício
�Modifique o MIDlet de cadastro de aniversários e adicione um comando para que o mesmo envie um
SMS de felicitações para o(s) aniversariante(s) do
dia.