LUIZ WAGNER ARAÚJO NUNES
IMPLEMENTAÇÃO DE UM WEB SERVICE PARA UMA LOCADORA
DE VEÍCULOS - RELAÇÃO B2B
Palmas
2006.1
LUIZ WAGNER ARAÚJO NUNES
IMPLEMENTAÇÃO DE UM WEB SERVICE PARA UMA LOCADORA
DE VEÍCULOS - RELAÇÃO B2B
“Trabalho apresentado ao curso de
Sistemas de Informação do Centro
Universitário Luterano de Palmas como
requisito parcial da disciplina de Trabalho
de Conclusão de Curso em Sistemas de
Informação, orientado pela professora
Madianita Bogo”
Palmas
2006.1
LUIZ WAGNER ARAÚJO NUNES
IMPLEMENTAÇÃO DE UM WEB SERVICE PARA UMA LOCADORA
DE VEÍCULOS - RELAÇÃO B2B
“Trabalho apresentado ao curso de
Sistemas de Informação do Centro
Universitário Luterano de Palmas como
requisito parcial da disciplina de Trabalho
de Conclusão de Curso em Sistemas de
Informação, orientado pela professora
Madianita Bogo”
BANCA EXAMINADORA
_______________________________________
Profª. M.Sc. Madianita Bogo
Centro Universitário Luterano de Palmas
_______________________________________
Fabiana Ferreira Cardoso
Centro Universitário Luterano de Palmas
_______________________________________
Prof. M.Sc. Ricardo Marx Costa Soares de Jesus
Centro Universitário Luterano de Palmas
4
SUMÁRIO
1.
INTRODUÇÃO.......................................................................................................... 10
2.
REVISÃO DE LITERATURA ................................................................................. 12
2.1. Sistemas Distribuídos .......................................................................................... 12
2.1.1.
Modelo Cliente/Servidor ................................................................................. 13
2.2. RMI...................................................................................................................... 14
2.3. CORBA ............................................................................................................... 15
2.4. Web Service ......................................................................................................... 17
2.4.1.
WSDL.............................................................................................................. 18
2.4.2.
UDDI ............................................................................................................... 22
2.4.3.
JWSDP ............................................................................................................ 25
2.4.3.1.
JAX-RPC..................................................................................................... 25
2.4.3.1.1. Desenvolvimento do Servidor ..................................................................... 26
2.4.3.1.2. Desenvolvimento do Cliente ....................................................................... 31
2.5. B2B...................................................................................................................... 33
2.6. Web Services em B2B.......................................................................................... 34
3. MATERIAL E MÉTODOS ...................................................................................... 36
3.1. Material................................................................................................................ 36
3.1.1.
Hardware......................................................................................................... 36
3.1.2.
Software........................................................................................................... 37
3.2. Métodos ............................................................................................................... 38
4. RESULTADOS E DISCUSSÃO............................................................................... 39
4.1. Domínio ............................................................................................................... 39
4.2. Comunicação das Aplicações .............................................................................. 40
4.3. Modelagem do Web Service ................................................................................ 42
4.3.1.
Funcionalidades do Web Service ..................................................................... 42
4.3.2.
Diagrama de Classes........................................................................................ 43
4.4. Considerações sobre o serviço............................................................................. 45
4.4.1.
Questão Legal do Serviço ................................................................................ 46
4.5. Implementação do Serviço .................................................................................. 47
4.6. Implementação do Cliente ................................................................................... 49
5. CONSIDERAÇÕES FINAIS .................................................................................... 53
6.
REFERÊNCIAS BIBLIOGRÁFICAS..................................................................... 55
ANEXOS ......................................................................................................................... 57
ANEXO I: MODELAGEM DO WEB SERVICE ............................................................ 58
ANEXO II: IMPLEMENTAÇÃO DO WEB SERVICE .................................................. 77
ANEXO III: IMPLEMENTAÇÃO DA APLICAÇÃO CLIENTE................................ 100
5
LISTA DE FIGURAS
Figura 1 - Estrutura do modelo Cliente/Servidor – adaptada de Horstmann (2003). .......... 13
Figura 2 - Estrutura de comunicação do padrão CORBA, modificada de Riccioni (2000). 15
Figura 3 – Exemplo de um documento WSDL. .................................................................. 20
Figura 4 – Exemplo de Interface de um Web Service com JAX-RPC. ............................... 27
Figura 5 – Exemplo de Classe de Implementação de um Web Service com JAX-RPC. .... 28
Figura 6 – Documento XML utilizado pelo aplicativo wscompile. .................................... 29
Figura 7 – Documento XML utilizado pelo aplicativo jar. ................................................. 30
Figura 8 – Documento XML utilizado pelo aplicativo wsdeploy. ...................................... 30
Figura 9 – Exemplo de Classe de Implementação de um Cliente JAX-RPC. ..................... 32
Figura 10 - Arquitetura de Comunicação da Aplicação Cliente com o Web Service .......... 41
Figura 11 – Diagrama de Casos de Uso............................................................................... 43
Figura 12 – Diagrama de Classes do Web Service............................................................... 44
Figura 13 – Implementação da Interface do Web Service.................................................... 48
Figura 14 – Fragmento de Código do Arquivo veiculos.php. ............................................. 50
6
LISTA DE TABELAS
Tabela 1: Pilha Básica de Web Services – disponível em Hendricks (2002)....................... 17
7
LISTA DE ABREVIATURAS
API
Application Programming Interface
B2B
Business-to-business
CORBA
Common Object Request Broker Architecture
ebXML
Eletronic Business Extensible Markup Language
FTP
File Transfer Protocol
HTTP
HyperText Transfer Protocol
HTTPS
HyperText Transfer Protocol Secure
IDL
Interface Definition Language
ISO
International Organization for Standardization
JWSDP
Java Web Service Developer Pack
NAICS
North American Industry Classification System
8
ORB
Object Request Broker
RPC
Remote Procedure Call
SMTP
Simple Mail Transfer Protocol
SOAP
Simple Object Access Protocol
TCP/IP
Transfer Control Protocol/Internet Protocol
UDDI
Universal Description, Discovery and Integration
W3C
World Wide Web Consortium
WSDL
Web Service Description Language
XML
Extensible Markup Language
9
RESUMO
A crescente demanda na utilização da Internet para a comunicação entre empresas fez
surgir uma nova modalidade de comércio eletrônico, denominada Business-to-business
(B2B), na qual as empresas integram suas aplicações com o intuito de intercambiar as
informações, possibilitando a realização dos processos de negócio. A tecnologia de Web
Services surgiu com a promessa de permitir que aplicações desenvolvidas em plataformas e
linguagens de programação distintas possam se integrar, garantindo a interoperabilidade
entre as aplicações, o que é interessante quando se fala em comunicação entre aplicações
de empresas distintas. O objetivo deste trabalho é realizar um estudo da tecnologia de Web
Services analisando a sua utilização na modalidade de comércio eletrônico Business-tobusiness, realizando um estudo teórico dos conceitos relacionados ao tema e testes práticos
da integração de aplicações desenvolvidas em linguagens distintas.
10
1. INTRODUÇÃO
A Internet tem sido utilizada principalmente para o relacionamento entre pessoas e para o
comércio eletrônico, em que as pessoas passaram a se relacionar com as empresas surgindo
esta nova modalidade de comércio. Nos últimos anos, é notável também uma crescente
utilização da Internet para a troca de informações entre empresas, as quais são tidas como
parceiras comerciais, buscando a integração de suas aplicações para a manutenção desta
forma de comunicação.
Da parceria entre empresas surgiu a modalidade de comércio eletrônico denominada
Business-to-business (B2B), definindo o comércio entre empresas realizado através da
troca de informações pela Internet. Várias tecnologias surgiram para aprimorar e permitir
mais facilidade na comunicação entre as aplicações das empresas, dentre elas o padrão
RMI, o CORBA e a tecnologia de Web Services.
A tecnologia de Web Services traz a promessa de permitir e facilitar a comunicação entre
aplicações desenvolvidas em linguagens de programação e plataformas distintas,
prometendo também possibilitar interoperabilidade entre tais aplicações, o que é
interessante quando se fala em comunicação entre aplicações de empresas distintas.
Com base neste cenário, em que é crescente a demanda pela integração de aplicações dado
o surgimento desta nova modalidade de comércio eletrônico, pensou-se em desenvolver um
estudo da tecnologia de Web Services e sua relação com o Business-to-business, uma vez
que foi notado que é um assunto pouco discutido.
O objetivo deste trabalho é estudar a tecnologia de Web Services, buscando levantar suas
características, fazendo um breve estudo das demais tecnologias a fim de possibilitar um
11
melhor entendimento. É parte também deste trabalho o estudo das características da
modalidade comércio eletrônico Business-to-business, buscando principalmente relacionála com a tecnologia de Web Services, fazendo um levantamento teórico e a implementação
de um exemplo prático nesta avaliação.
Este trabalho está estruturado da seguinte forma: a seção 2 apresenta um levantamento das
características das aplicações distribuídas, mencionando os modelos e as tecnologias
existentes, buscando maior destaque das características da tecnologia de Web Services,
sobretudo da API JAX-RPC, que integra o JWSDP, descrevendo os passos básicos para a
criação de uma aplicação Servidora e uma aplicação Cliente. Exibe também um
levantamento a respeito do Business-to-business, buscando relacioná-lo com a tecnologia
de Web Services. A seção 3 contém a relação do material empregado e descreve os métodos
utilizados no desenvolvimento do trabalho. A seção 4 mostra os resultados e uma discussão
a respeito do que foi encontrado na literatura e dos testes práticos realizados, quando
possível, fazendo uma relação entre os mesmos. A seção 5 expõe as considerações finais,
descrevendo as conclusões a respeito do estudo realizado, apontando a utilização em
trabalhos futuros.
12
2. REVISÃO DE LITERATURA
2.1. Sistemas Distribuídos
Um sistema distribuído pode ser definido como um conjunto de computadores
interconectados em rede com o objetivo principal de compartilhar recursos de hardware e
software. Para Casetti (1993) “um sistema distribuído constitui-se de processadores
autônomos conectados através de um subsistema de comunicação, que cooperam-se através
de troca de mensagens.”
Uma das vantagens advindas da utilização de um sistema distribuído é o compartilhamento
de recursos. Assim, os recursos mantidos por uma estação servidora poderão ser utilizados
por estações clientes, que solicitam os recursos através de uma rede de comunicação.
Como proteção à ocorrência de falhas, sistemas distribuídos podem ser implantados com
grande vantagem sobre os sistemas centralizados. A redundância de recursos de hardware
e de software pode imprimir mais confiabilidade ao sistema como um todo: caso partes do
sistema venham a falhar, o restante do sistema é capaz de continuar o processamento, ao
contrário de um sistema centralizado em que uma falha comprometeria todo o sistema.
Por fim, como um sistema distribuído está disseminado em uma rede, sua abrangência é
uma grande vantagem sobre um sistema centralizado, uma vez que pode atingir grandes
distâncias geográficas.
Tanenbaum (1992) menciona a capacidade de crescimento incremental dos sistemas
distribuídos. A escalabilidade permite que novas unidades processadoras possam ser
adicionadas, visando aumentar o poder de processamento do conjunto, sem que sejam
13
necessárias alterações na configuração do sistema e interrupções no funcionamento no
momento das alterações.
Um dos modelos de sistemas distribuídos mais difundidos e citados na literatura é o
modelo Cliente/Servidor. A seção 2.1.1 apresenta o conceito e descreve o funcionamento
deste modelo.
2.1.1. Modelo Cliente/Servidor
Segundo Riccioni (2000), o modelo Cliente/Servidor de computação distribuída é um
modelo de gerenciamento de informação que divide o processamento entre um computador
que requer um serviço e outro que devolve o serviço.
Como em sistemas distribuídos não existe região de memória compartilhada, os processos
se comunicam através de mecanismos de troca de mensagens. A programação de socket e
a chamada de procedimento remoto (RPC – Remote Procedure Call) são mecanismos
utilizados nas trocas de mensagens. A Figura 1 ilustra a transmissão de mensagens no
modelo Cliente/Servidor.
Cliente
Servidor
solicitação
resposta
Figura 1 - Estrutura do modelo Cliente/Servidor – adaptada de Horstmann (2003).
Na estrutura apresentada na Figura 1, os retângulos identificados como Cliente e Servidor
representam as aplicações Cliente e Servidor, respectivamente, dentro do modelo
14
Cliente/Servidor. De uma maneira simplificada, o Cliente envia uma mensagem de
solicitação para o Servidor, que realiza o processamento e retorna uma mensagem de
resposta para o Cliente.
Com o advento do paradigma de orientação a objetos, foram idealizados objetos
colaborativos localizados em ambientes remotos, capazes de interagir através de
mecanismos de troca de mensagens. Com isso, surgiram os padrões RMI (Remote Method
Invocation – Invocação de Método Remoto) e CORBA (Common Object Request Broker
Architecture – Arquitetura de Agentes de Requisição de Objetos Comum). Esses padrões
serão discutidos nas seções 2.2 e 2.3.
2.2. RMI
O padrão RMI foi uma iniciativa da empresa Sun Microsystems. Escrito na linguagem de
programação Java, esse padrão possibilita a comunicação entre objetos residentes em
máquinas virtuais java (JVM – Java Virtual Machine), que podem estar localizadas em
computadores distintos ou não.
Com o RMI, a invocação de métodos de um objeto remoto parece simples para o
desenvolvedor. Os detalhes de comunicação ficam ocultos. Assim, o desenvolvedor tem a
impressão de que está realizando a chamada de métodos de um objeto local.
“Ao invocar um método sobre um objeto remoto, o cliente RMI atua, na realidade, sobre
um objeto local que se faz passar pelo objeto remoto. Esse objeto local é chamado stub. O
stub age como um proxy do objeto remoto e esconde do cliente o uso dos serviços providos
pelos protocolos de transporte. Por serem gerados por um compilador chamado rmic, os
desenvolvedores de um programa RMI não têm que se preocupar em codificar os stubs”
(ALBUQUERQUE, 2001).
Os serviços oferecidos pelo Servidor são descritos através de um arquivo Java que
implementa uma interface. A interface contém a assinatura dos métodos disponibilizados
pelo Servidor. Desta forma, o Cliente descobre os métodos analizando a interface do
Serviço.
15
Apesar de escrito em Java, uma linguagem prometida para ser “quase perfeita” em termos
de portabilidade, como leciona Riccioni (2000), o RMI é limitado exatamente em sistemas
heterogêneos no tocante à interação com objetos desenvolvidos em outras linguagens. Ao
contrário disto, o padrão CORBA promete possibilitar a integração entre aplicações
heterogêneas. O padrão CORBA será discutido na seção seguinte.
2.3. CORBA
Conforme citado por Horstmann (2003), “o padrão CORBA permite a comunicação entre
objetos escritos em diferentes linguagens de programação. (...) Ele define um mecanismo
comum para troca de dados e descoberta de serviços”.
A especificação CORBA tem sido implementada por diversas linguagens de programação.
Os programas Cliente e Servidor podem ser desenvolvidos em linguagens de programação
distintas, como Java e C++, por exemplo.
A especificação CORBA define um Agente de Requisição de Objetos (ORB – Object
Request Broker) que é responsável por intermediar a comunicação entre objetos remotos.
“O ORB é responsável pela localização do objeto ao qual se destina a requisição, assim
como o envio dos parâmetros da requisição no formato aceito por este objeto. (...) Também
é função do ORB, o retorno de parâmetros de saída da requisição para o cliente, se assim
houver” (RICCIONI, 2000). A Figura 2 apresenta a estrutura da comunicação do padrão
CORBA.
Cliente
Servidor
ORB
Rede
ORB
Figura 2 - Estrutura de comunicação do padrão CORBA, modificada de Riccioni (2000).
A estrutura de comunicação apresentada na Figura 2 pode ser entendida da seguinte forma:
primeiramente o Cliente obtém uma referência ao objeto remoto, através do ORB, e então
16
faz a invocação de um método do objeto remoto. Em seguida, O ORB converte os
parâmetros do método em um formato independente de plataforma, e envia-os através da
rede ao ORB do Servidor. O ORB do Servidor recebe os parâmetros e decodifica-os,
repassando a chamada do método ao Servidor. Após o processamento da chamada, o
Servidor envia a resposta com os parâmetros ao ORB, que faz a codificação e envia ao
ORB do Cliente. Por fim, o ORB do Cliente decodifica os parâmetros de saída e repassa-os
ao Cliente.
A padronização do protocolo de comunicação e do formato das mensagens em um sistema
distribuído é um ponto importante para a interação entre objetos distribuídos,
principalmente na interação entre objetos heterogêneos. O formato e o modo de
transmissão das mensagens devem possibilitar que o objeto do Cliente possa enviar as
mensagens de forma que o objeto do Servidor possa recebê-las e processá-las. A definição
do formato das mensagens e dados para a comunicação entre ORB’s é papel do Protocolo
Inter-ORB Geral (GIOP). A forma de transmissão das mensagens numa rede TCP/IP é
papel do Protocolo Inter-ORB Internet (IIOP).
A descrição do objeto Servidor, que atenderá às requisições dos objetos Clientes, está
contida em um documento que apresenta a assinatura dos métodos disponibilizados pelo
objeto Servidor e os tipos de dados que podem ser enviados e recebidos através das
mensagens. A linguagem utilizada para desenvolvimento deste documento é a linguagem
de definição de interface (IDL – Interface Definition Language). Um documento IDL é
bem semelhante a uma interface definida na linguagem de programação Java, e possui a
extensão .idl.
No tocante à interação entre aplicações comerciais na Internet, visando a integração de
parceiros comerciais, uma nova tecnologia surgiu buscando proporcionar maior
interoperabilidade entre as aplicações. A tecnologia de Web Services têm recebido muitos
incentivos por parte de grandes empresas como Microsoft e IBM. Na seção 2.4 será
apresentada a tecnologia de Web Services.
17
2.4. Web Service
Um Web Service representa uma aplicação auto-descritiva que é capaz de responder a
solicitações de outras aplicações, independentemente da linguagem e da plataforma em que
estas foram desenvolvidas, fazendo uso de tecnologias padrão, tais como os protocolos da
Internet, como HTTP, e a linguagem XML. Além da capacidade de responder a
solicitações, um Web Service também pode fazer solicitações a outros Web Services,
exercendo assim o papel de aplicação cliente ou consumidora.
Conceitualmente, a estrutura de um Web Service pode ser representada na forma de uma
pilha. De acorco com Hendricks (2002), a pilha é formada por 4 camadas. A tabela 1
apresenta as camadas associando-as às respectivas tecnologias.
Tabela 1: Pilha Básica de Web Services – disponível em Hendricks (2002).
Publicação e Descoberta do Serviço
UDDI
(Service Publication/Discovery)
Descrição do Serviço (Service
WSDL
Description)
Troca de Mensagens XML – SOAP (XML SOAP
Messaging)
Rede de Transporte (Transport Network)
HTTP, SMTP, FTP, HTTPS over TCP/IP
Um Web Service pode ter seus dados publicados em um registro de negócios, tais como o
registro UDDI (Universal Description, Discovery and Integration – Descrição, Descoberta
e Integração Universais). A especificação UDDI padroniza um modelo de repositório de
registro de Web Services públicos e dos negócios que os representam. Através do registro
clientes e parceiros de negócios podem integrar suas aplicações buscando as descrições dos
Web Services registrados.
Além da especificação UDDI, mencionada por Hendricks (2002), a especificação ebXML
também padroniza um modelo de repositório. Mais abrangente do que a especificação
UDDI, ela é dirigida a registros de negócios, cujas empresas podem possuir Web Services
implementados. A especificação UDDI será apresentada com maior profundidade na seção
2.4.2.
18
Um diferencial importante dos Web Services sobre as demais tecnologias de sistemas
distribuídos é a forma de descrição. A descrição de um Web Service apresenta os métodos
disponibilizados, os parâmetros de entrada e saída e a localização e o nome do serviço.
Para a descrição é utilizado um documento escrito na Linguagem de Descrição de Web
Services (WSDL – Web Services Description Language). Este documento é um documento
XML cujo esquema segue as regras da WSDL. A WSDL será discutida com mais detalhes
na seção 2.4.1.
As mensagens trocadas entre o Web Service e os Clientes são convertidas nos formatos
definidos pelo protocolo escolhido para a comunicação. Dentre os protocolos está o
protocolo SOAP (Simple Object Access Protocol – Protocolo Simples de Acesso ao
Objeto), o qual acondiciona a mensagem em um documento XML. O protocolo SOAP
pode ser utilizado no mecanismo de troca de mensagens baseado em RPC ou baseado em
troca de documentos.
Por fim, as mensagens são transportadas fazendo uso de um dos protocolos de Internet,
como por exemplo, HTTP, SMTP etc. Segundo Hendricks (2002), o mais utilizado é o
protocolo HTTP (Hypertext Transfer Protocol – Protocolo de Transferência de
Hipertexto). O uso destes protocolos, e principalmente do HTTP, é devido ao fato de que
os mesmos geralmente são utilizados por várias aplicações e, além disso, comumente estão
habilitados nos firewalls, o que facilita a utilização da tecnologia de Web Services. Neste
trabalho, o Web Service desenvolvido utiliza a API JAX-RPC, integrante do JWSDP, a
qual utiliza o protocolo SOAP para troca de mensagens e o protocolo HTTP para o
transporte.
2.4.1. WSDL
A sigla WSDL é utilizada para referenciar o documento que descreve um Web Service. Este
documento, que é um documento XML, tem por finalidade apresentar os detalhes do Web
Service. Ao contrário do que é utilizado nos padrões RMI e CORBA, o documento WSDL
é mais complexo devido aos detalhes que especifica, como endereço real do serviço,
definição da estrutura das mensagens de solicitação e resposta de cada uma das operações
19
disponibilizadas pelo Web Service etc. A sua estrutura é constituída de 5 elementos
básicos: types, message, portType, binding e service (TODD, 2003).
A escrita de um documento WSDL pode ser uma tarefa bastante complexa, a depender da
quantidade de operações disponibilizadas pelo Web Service, dos parâmetros de entrada e
saída, e dos tipos de dados utilizados nas mensagens. Normalmente, os aplicativos que
possibilitam o desenvolvimento de Web Services disponibilizam ferramentas capazes de
gerar este documento com base na interface desenvolvida e na localização e no nome que
referencia o serviço. A Figura 3 apresenta um exemplo de um documento WSDL.
20
1. <?xml version="1.0" encoding="UTF-8" ?>
2. <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:Foo"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="Hello"
targetNamespace="urn:Foo">
3. <types />
4. <message name="HelloIF_sayHello">
5. <part name="String_1" type="xsd:string" />
6. </message>
7. <message name="HelloIF_sayHelloResponse">
8. <part name="result" type="xsd:string" />
9. </message>
10. <portType name="HelloIF">
11. <operation name="sayHello" parameterOrder="String_1">
12. <input message="tns:HelloIF_sayHello" />
13. <output message="tns:HelloIF_sayHelloResponse" />
14. </operation>
15. </portType>
16. <binding name="HelloIFBinding" type="tns:HelloIF">
17. <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" />
18. <operation name="sayHello">
19. <soap:operation soapAction="" />
20. <input>
21. <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"
namespace="urn:Foo" />
22. </input>
23. <output>
24. <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"
namespace="urn:Foo" />
25. </output>
26. </operation>
27. </binding>
28. <service name="Hello">
29. <port name="HelloIFPort" binding="tns:HelloIFBinding">
30. <soap:address location="http://localhost:8080/Hello/hello"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" />
31. </port>
32. </service>
33. </definitions>
Figura 3 – Exemplo de um documento WSDL.
O documento apresentado na Figura 3 foi gerado com o aplicativo wscompile, o qual
integra a API JAX-RPC. Para isso, foram utilizados como base um arquivo XML de
configuração e o arquivo de interface do serviço compilado. O documento representa a
descrição do Web Service denominado Hello, o qual possui apenas uma operação
denominada sayHello, que recebe um parâmetro do tipo String e retorna uma String como
resposta.
21
De acordo com W3C (2001), o elemento raiz do documento WSDL é o elemento
definitions. O elemento types contém as definições dos tipos de dados que serão enviados e
recebidos através das mensagens processadas pelo Web Service. Este elemento é
especificado quando é preciso utilizar tipos de dados complexos, definidos pelo
desenvolvedor. Quando são utilizados somente tipos de dados padronizados pelo W3C,
este elemento não precisa ser especificado. No exemplo apresentado na Figura 4, o
elemento types não contém valor declarado, o que indica que os dados contidos nas
mensagens de solicitação e de resposta conterão somente valores padrão definidos.
O elemento message define, para cada mensagem, qual o tipo de dado de cada parâmetro
ou retorno. Para cada operação disponibilizada pelo Web Service, devem ser criados dois
elementos message, um para a mensagem de requisição e outro para a respectiva
mensagem de resposta. O tipo de dado pode ser um valor padrão ou qualquer tipo definido
no elemento types.
No exemplo da Figura 3, o elemento message cujo atributo name contém o valor
“HelloIF_sayHello” representa a mensagem de solicitação do método “sayHello(String
nome)”. O sub-elemento part define o tipo de dado do parâmetro e a ordem em que
aparecerá, que neste caso é o primeiro parâmetro de entrada, e é do tipo String. O valor
“String_1” do atributo name do elemento part denota o tipo de dado e a ordem do
parâmetro. O valor “xsd:string” do atributo type do elemento part define que o tipo de dado
do
parâmetro
é
o
tipo
“string”
definido
no
namespace
“http://www.w3.org/2001/XMLSchema”.
O elemento message cujo atributo name contém o valor “HelloIF_sayHelloResponse”
define a mensagem de resposta do método “sayHello(String nome)”. O valor do atributo
name do sub-elemento part agora contém o valor “result”, o que completa o sentido de que
a mensagem é de resposta, conduzindo o resultado da operação processada pelo método do
Web Service. O valor “xsd:string” do atributo type do elemento part define que o tipo de
dado
da
resposta
é
o
tipo
“http://www.w3.org/2001/XMLSchema”.
“string”
definido
no
namespace
22
O elemento portType descreve os métodos que serão disponibilizados pelo Web Service. A
finalidade básica deste elemento é indicar, para cada método do Web Service, qual
elemento message definirá o formato da mensagem de solicitação e qual definirá o formato
da mensagem de resposta. O sub-elemento operation indica a operação que está sendo
definida. O sub-elemento input, do elemento operation, referencia o elemento message que
descreverá o formato da mensagem de solicitação, e o sub-elemento output referencia o
elemento message que descreverá o formato da mensagem de resposta.
O elemento binding apresenta a informação do protocolo que será utilizado no transporte
das mensagens. Pelo menos um elemento binding é requerido. De acordo com WSDL
(2001), a linguagem WSDL é extensível a ponto de permitir a adoção de outros formatos
de mensagem e protocolos de rede, além de SOAP 1.1, HTTP GET/POST e MIME, por
exemplo. O protocolo SOAP é mais utilizado com o protocolo HTTP. No entanto, podem
ser utilizados vários outros protocolos, como SMTP, FTP etc.
A API JAX-RPC adota o protocolo SOAP como padrão para definição do formato das
mensagens e HTTP para o transporte. No documento da Figura 4, o protocolo de transporte
é indicado pelo atributo transport do sub-elemento soap:binding, que contém o valor
“http://schemas.xmlsoap.org/soap/http”. De acordo com W3c (2002), o SOAP pode utilizar
mensagens orientadas a documento ou orientadas a procedimentos (RPC), o que é definido
através do atributo style do elemento soap:binding, sendo que o valores podem ser “rpc”
ou “document”. O valor é opcional, mas, quando não indicado, será considerado o valor
“document”.
De acordo com Todd (2003), o elemento service contém o endereço real do Web Service.
Assim, para cada elemento binding haverá a indicação de um endereço real através do
elemento service.
2.4.2. UDDI
W3C (2002) afirma que a tarefa de publicação e descrição de Web Services é essencial
dentro da arquitetura básica de Web Services. Neste contexto, o padrão UDDI merece
destaque por ser o mais utilizado. Oasis (2004) declara que o objetivo da especificação é
23
definir um conjunto de serviços com suporte à descrição e descoberta de negócios,
organizações, e outros fornecedores de Web Services, dos Web Services que eles
disponibilizam e das interfaces técnicas que podem ser utilizadas para acessar estes
Serviços.
A estrutura de armazenamento objetiva facilitar a localização das informações. De acordo
com Todd (2003), UDDI permite realizar buscas por negócios e serviços de diferentes
maneiras, tais como: localização de negócios por tipo de negócio (Yellow Pages – Páginas
Amarelas); localização de negócios por nomes, endereços, entre outras informações (White
Pages – Páginas Brancas); e localização de informações sobre os serviços que um negócio
oferece (Green Pages – Páginas Verdes).
Ainda segundo Todd (2003), UDDI define não somente uma estrutura para organização de
informações, mas também um XML Schema para definição da estrutura de armazenamento,
uma API com métodos que permitem publicar serviços e métodos para acessar serviços,
uma especificação para replicação de informações entre registros e uma especificação para
operadores de registro definindo, dentre outras, questões como segurança.
As informações que são submetidas a um registro UDDI são armazenadas na forma de um
documento XML, o qual segue o XML Schema descrito pela especificação. De acordo com
Chappell (2002), o XML Schema define os seguintes elementos básicos:
•
businessEntity: é o elemento que contém as informações que definem um
determinado negócio. Dentre estas, estão informações de contato e nome do
negócio. Este elemento contém também sub-elementos que armazenam
informações referentes aos serviços oferecidos pelo negócio.
•
businessService: é o elemento que contém a definição de um determinado serviço,
contendo informações como nome, descrição e mais informações, como ponto de
acesso, por exemplo, armazenadas em seus sub-elementos.
•
bindingTemplate: este elemento contém a informação do endereço real do serviço,
a qual está armazenada no sub-elemento accessPoint.
24
•
tModel: este elemento é um dos sub-elementos do elemento bindingTemplate, que
representa uma especificação técnica dentro do contexto de um registro UDDI. A
informação contida neste elemento poderia auxiliar companhias a determinar se um
Web Service é compatível com seus requisitos de negócio.
•
categoryBag: este elemento contém informações de categorização para o serviço.
Dentre as várias categorizações citadas estão a NAICS – North American Industry
Classification System – Sistema de Classificação da Indústria Norte Americana e
ISO 3166, que é um sistema de classificação geográfica padronizado pela
International Organization for Standardization – Organização de Padronização
Internacional.
•
publisherAssertion: este elemento contém informação sobre relacionamento de
elementos businessEntity.
As APIs para publicação e descoberta de serviços, definidas pela especificação UDDI,
permitem que empresas possam publicar informações sobre seus negócios e serviços, e que
clientes e parceiros possam localizar estas informações. A API de consulta referencia um
URL de um determinado registro de negócios e não necessita de acesso autenticado para
sua utilização. Ao contrário, a API de publicação utiliza o protocolo HTTPS e requer que o
negócio utilize um nome de usuário e uma senha para as operações de inserção, alteração e
remoção de informações.
No pacote de APIs Java para desenvolvimento de Web Services – JWSDP (Java Web
Service Developer Pack), a API JAX-R permite a manipulação de registros XML,
permitindo a realização de operações de gerenciamento e consulta. A API JAX-RPC
permite a construção de Web Services e clientes que usam chamadas de procedimento
remoto (RPC) e XML. A versão mais recente do JWSDP é a versão 2.0, a qual apresenta a
API JAX-WS em substituição à API JAX-RPC. O JWSDP será apresentado em mais
detalhes na seção 2.4.3.
25
2.4.3. JWSDP
O JWSDP é formado por um conjunto de APIs de código fonte aberto, desenvolvidas na
linguagem Java, permitindo a construção, teste e publicação de Web Services e aplicações,
utilizando a pilha de protocolos apresentada na Seção 2.4.
No desenvolvimento deste trabalho foi utilizada a versão 1.6 do JWSDP. Nele estão
contidas APIs para desenvolvimento de Web Services, aplicações Web, dentre outras
aplicações. Destacam-se neste pacote as APIs JAXB (Java Architecture for XML Binding –
Arquitetura Java para Mapeamento XML), JAXP (Java API for XML Processing – API
Java para Processamento de XML), JAX-RPC (Java API for XML-based RPC – API Java
para RPC baseado em XML) e JAXR (Java API for XML Registries – API Java para
Registros XML).
O JWSDP é mantido em contínua evolução, e recentemente, no decorrer deste trabalho, foi
publicada a versão 2.0. Nesta nova versão, a API JAX-RPC foi renomeada para API JAXWS (Java API for XML Web Services – API Java para Web Services em XML). A API
JAX-RPC será apresentada em mais detalhes na Seção 2.4.3.1.
2.4.3.1.
JAX-RPC
JAX-RPC é uma API para construção de Web Services e clientes usando mecanismos de
RPC baseados em XML. Sun (2003) destaca que a API é independente do protocolo usado
na representação das mensagens de requisição e de resposta às chamadas de procedimento
remoto, suportando protocolos baseados em XML. No entanto, apesar de especificar a
independência quanto ao protocolo de representação das mensagens, o projeto da API foi
direcionado para o protocolo SOAP, implementando o suporte ao mesmo no pacote
javax.xml.rpc.soap. O protocolo SOAP é um protocolo para intercâmbio de informação em
ambiente descentralizado e distribuído, baseado em XML. Como mecanismo de transporte,
JAX-RPC utiliza o protocolo HTTP. Para a descrição das informações do Serviço, a API
utiliza a linguagem WSDL.
Simplicidade e Interoperabilidade são características destacadas na especificação da API. A
simplicidade está relacionada à maneira de como o desenvolvedor realiza a codificação do
26
Cliente ou do Servidor para a realização da comunicação. Os detalhes de como as
mensagens são codificadas, transmitidas e recebidas não são motivo de preocupação, já que
isto fica transparente ao desenvolvedor.
A interoperabilidade relaciona-se com a capacidade atribuída ao Cliente e ao Servidor de
realizar comunicação independentemente da linguagem ou plataforma que utilizem. A
restrição a esta característica é que as partes envolvidas na comunicação devem utilizar
mecanismos de RPC baseados em XML.
O Serviço em JAX-RPC é desenvolvido e publicado em container de servlet. O JWSDP
1.6 dá suporte aos produtos Sun Java System Application Server Platform Edition 8.1 e
Tomcat 5.0 para Java WSDP. A especificação da API declara somente este modelo de
desenvolvimento do Serviço. Na seção 2.4.3.1.1 serão apresentados os passos básicos para
o desenvolvimento do Servidor.
Será apresentado nas Seções 2.4.3.1.1 e 2.4.3.1.2 a implementação de um Web Service
denominado “Ola” e de um Cliente, utilizando a API JAX-RPC, com a finalidade de
demonstrar os passos básicos para a utilização da API e demonstrar a forma de
comunicação realizada entre as aplicações.
2.4.3.1.1.
Desenvolvimento do Servidor
JAX-RPC possibilita o desenvolvimento do Servidor de duas formas. Na primeira forma,
pode-se desenvolver o Servidor partindo-se de um documento WSDL existente e utilizando
uma ferramenta para realizar o mapeamento da WSDL para Java. O aplicativo wscompile,
que integra a API JAX-RPC, possibilita a realização da tarefa de mapeamento e geração
das classes do Servidor a partir da WSDL. É a forma mais complexa, já que a codificação
da WSDL não é uma ação simples, como foi descrito na Seção 2.4.1.
A segunda forma, que será descrita nessa seção, é codificando a interface e a classe que
implementa a interface. JAX-RPC é bastante semelhante ao RMI no tocante à
implementação do Servidor. Além disso, as chamadas aos métodos do Serviço pelo cliente
são realizadas como se o Cliente estivesse executando métodos de um objeto local,
facilitando o desenvolvimento.
27
Nessa aplicação o Serviço resume-se a um método que retorna ao cliente a mensagem “Olá
<nome >”, sendo que o nome é o parâmetro passado pelo cliente na chamada do método. O
primeiro passo para o desenvolvimento do servidor é criar a interface com a assinatura do
método. A Figura 4 apresenta a interface de um Web Service, desenvolvido a partir dos
exemplos contidos em Sun (2005).
1.
2.
3.
4.
5.
6.
7.
8.
package ola;
import java.rmi.*;
java.util.*;
public interface OlaIF extends Remote{
public String dizerOla(String nome) throws RemoteException;
}
Figura 4 – Exemplo de Interface de um Web Service com JAX-RPC.
A interface apresentada na Figura 4 contém a assinatura do método denominado dizerOla,
o qual recebe um parâmetro do tipo String e retorna uma String como resultado. A
interface deve estender a interface Remote do pacote java.rmi e os métodos precisam
declarar que podem lançar uma exceção remota do tipo RemoteException, quando a
chamada a um método falhar. Os parâmetros dos métodos e o tipos de dados de retorno
devem respeitar os tipos de dados suportados pela API, conforme apresentados em Sun
(2003).
A implementação do Servidor é realizada como uma classe comum, implementando a
interface do Serviço. A classe deve implementar os métodos declarados na interface e deve
possuir um construtor padrão, como mostra o trecho em negrito, na figura 5 . Além disso,
atributos e métodos de acesso local podem ser adicionados ao código da classe, a critério
do desenvolvedor.
O Servidor pode implementar ainda a interface ServiceLifecycle, que possibilita a
realização de operações de gerenciamento de sessão. A Figura 5 contém um exemplo de
uma classe que implementa a interface apresentada na Figura 4.
28
1. package ola;
2. import java.rmi.*;
3. import java.util.*;
4. import javax.xml.rpc.*;
5.
6. public class OlaImpl implements OlaIF{
7. public OlaImpl(){}
8. public String dizerOla(String nome){
9.
return “Olá “+nome;
10. }
11. }
Figura 5 – Exemplo de Classe de Implementação de um Web Service com JAX-RPC.
A classe OlaImpl, apresentada na Figura 5, implementa o método remoto dizerOla
declarado na interface OlaIF, mostrado na figura 4, e um construtor padrão. Além do
pacote java.rmi a classe deve importar o pacote javax.xml.rpc que contém as classes
necessárias para a implementação do Servidor. Como pode ser notado, esta classe não
implementa a interface ServiceLifecycle.
Um ponto importante a ser analisado no momento da criação do Servidor é quanto aos
tipos de dados dos parâmetros e dos dados de retorno dos métodos remotos. Como já
mencionado, os tipos de dados devem ser os tipos declarados pela especificação da API.
No entanto, podem ser utilizados tipos definidos pelo desenvolvedor, que são
implementados em classes cujos atributos, parâmetros e retorno de métodos devem ser
declarados com tipos dentre os definidos na especificação.
A API, através do aplicativo wscompile, realiza o mapeamento dos tipos de dados do
Servidor para os tipos definidos pela especificação da linguagem WSDL, criando o arquivo
WSDL referente ao Serviço, visando a padronização e assim permitindo a
interoperabilidade entre as aplicações Clientes e o Servidor.
Para que o Serviço seja publicado e assim disponibilizado aos Clientes, é necessário criar a
WSDL e os arquivos WAR. Estas tarefas são utilizadas através dos aplicativos wscompile,
jar e wsdeploy, sendo que estes aplicativos necessitam de documentos XML que devem
29
conter uma estrutura específica para cada aplicativo. A Figura 6 apresenta um documento
XML utilizado pelo aplicativo wscompile.
1.
2.
3.
4.
5.
6.
7.
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<service name="Teste" targetNamespace="urn:Foo" typeNamespace="urn:Foo"
packageName="ola">
<interface name="ola.OlaIF"/>
</service>
</configuration>
Figura 6 – Documento XML utilizado pelo aplicativo wscompile.
No documento XML apresentado na Figura 6, o atributo packageName do elemento
service contém o nome do pacote onde estão as classes compiladas do Servidor. O atributo
name do elemento interface contém o nome da interface. Além de criar a WSDL para o
Serviço, o aplicativo também gera um arquivo modelo que contém o mapeamento dos tipos
de dados do Serviço para os tipos de dados suportados pela API. Este arquivo modelo será
utilizado pelo aplicativo jar.
Para a geração do arquivo com a extensão .war, é necessário inicialmente executar o
aplicativo jar, o qual utiliza um documento XML denominado jaxrpc-ri. A Figura 7
apresenta um documento XML utilizado pelo aplicativo jar.
30
1. <?xml version="1.0" encoding="UTF-8"?>
2. <webServices xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/dd" version="1.0"
3.
targetNamespaceBase="urn:Foo" typeNamespaceBase="urn:Foo"
4.
urlPatternBase="/ws">
5.
<endpoint name="Ola" display-name="Servico Web Ola"
6.
description="Web Service usando JAX-RPC."
7.
interface="ola.OlaIF" model="/WEB-INF/model.gz"
8.
implementation="ola.OlaImpl"/>
9.
<endpointMapping endpointName="Ola" urlPattern="/ola"/>
10. </webServices>
Figura 7 – Documento XML utilizado pelo aplicativo jar.
No documento XML apresentado na Figura 7, o atributo name do elemento endpoint
contém o nome do Serviço, o qual é referenciado pelo atributo endpointName do elemento
endpointMapping. O atributo interface do elemento endpoint contém o nome do pacote e
da interface, e o atributo implementation contém o nome do pacote e da classe que
implementa o Servidor. O atributo urlPattern do elemento endpointMapping especifica a
String que será incorporada ao url gerado pelo container Web.
Para a tarefa final de criação do arquivo .war para publicação no container Web, é utilizado
o aplicativo wsdeploy, o qual necessita de um documento XML denominado web que
contenha os dados que serão publicados. A Figura 8 apresenta um documento XML
utilizado pelo aplicativo.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<display-name>Servico Web Ola</display-name>
<description>Web Service usando JAX-RPC.</description>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
Figura 8 – Documento XML utilizado pelo aplicativo wsdeploy.
31
No documento XML apresentado na Figura 8, o elemento display-name contém o nome
que será apresentado na tela de visualização das aplicações do container Web. O elemento
description contém a descrição.
Os aplicativos devem ser executados seqüencialmente, começando pelo wscompile, e em
seguida o aplicativo jar e depois wsdeploy. Mais detalhes da execução destes aplicativos e
dos comandos podem ser encontrados em Nunes (2005). Uma vez que o Serviço esteja
publicado, é possível criar aplicações Clientes. Na seção seguinte serão apresentados os
passos básicos para a criação de um programa Cliente.
2.4.3.1.2.
Desenvolvimento do Cliente
Segundo Sun (2005), existem várias formas de se desenvolver um Cliente JAX-RPC.
Dentre elas podemos citar o Cliente de Stub Estático, o Cliente de Proxy Dinâmico, o
Cliente de Interface de Invocação Dinâmica e o Cliente de Aplicação. A diferença básica
entre cada um dos métodos de desenvolvimento consiste no momento em que são obtidos
os objetos que referenciam o Serviço. Sun (2005) apresenta detalhes da criação destes
modelos, sendo que nesse trabalho é abordado o modelo mais simples, o Cliente de Stub
Estático, o qual será apresentado nesta Seção.
Neste modelo a referência ao Serviço é uma classe Stub que é obtida em tempo de
desenvolvimento através do aplicativo wscompile, o qual constrói também arquivos
serializadores e tipos de valores. Para criar as classes utilizadas na aplicação cliente é
necessário, apenas, que se tenha a localização da WSDL do servidor.
O objeto Stub que contém a referência age como um proxy para o Serviço remoto. Assim,
as chamadas ao Serviço são realizadas através do objeto local, utilizando o objeto Stub. A
Figura 9 apresenta um exemplo de Cliente de Stub Estático para o Servidor definido na
Seção 2.4.3.1.1.
32
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
import javax.xml.rpc.Stub;
import ola.*;
public class ClienteOla{
public ClienteOla(String endereco){
try{
Stub stub = (Stub) (new Ola_Impl().getOlaIFPort());
String prop = javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY;
stub.setProperty(prop,endereco);
OlaIF ola = (OlaIF) stub;
System.out.println(ola.dizerOla(“Luiz”));
}catch(Exception ex){
ex.printStackTrace();
}
}
public static void main(String args[]){
if (args[0] != null){
ClienteOla clienteOla = new ClienteOla(args[0]);
}
System.exit(0);
}
}
Figura 9 – Exemplo de Classe de Implementação de um Cliente JAX-RPC.
A classe ClienteOla, apresentada na Figura 9, implementa um Cliente JAX-RPC do
Serviço apresentado na Figura 5. Os trechos relacionados à comunicação com o servidor
estão em negrito no código. A classe deve importar o pacote javax.xml.rpc.Stub, a fim de
poder instanciar um objeto Stub, definido no pacote. Como se trata de um Cliente de Stub
Estático, ele deve importar também o pacote que contém as classes compiladas com base
na especificação do Servidor.
Dentre as classes que o aplicativo wscompile gera está a classe Ola que é uma interface que
estende a interface Service do pacote javax.xml.rpc. A classe Ola_Impl implementa a
interface Ola, que contém o método getOlaIFPort, que retorna um objeto Stub que
referencia o Serviço.
Após
a
obtenção
do
Stub,
é
necessário
configurar
a
propriedade
ENDPOINT_ADDRESS_PROPERTY, a qual armazenará o endereço do Serviço, através
do método _setProperty do objeto Stub. Por fim, é necessário converter o objeto Stub para
33
um objeto do tipo da interface do Servidor, através de uma operação de casting, permitindo
a chamada de métodos remotos. A linha 10 do exemplo apresentado na Figura 5 demonstra
esta operação.
Como é possível notar, o aplicativo wscompile adota uma nomenclatura na geração das
classes. Para interface que extende a interface Service é atribuído um nome com a
nomenclatura <nome_do_serviço>. Para a classe que a implementa é atribuído um nome na
forma <nome_do_serviço>_Impl, e para o método que retorna um objeto Stub a forma é
get<nome_do_serviço>IFPort.
Como já foi comentado, as tarefas de desenvolvimento do Serviço e do Cliente não
correspondem apenas às tarefas descritas nesta Seção. A API JAX-RPC faz uso dos
aplicativos wscompile, wsdeploy e jar para concluir as tarefas mencionadas, os quais fazem
uso de arquivos XML para obter os dados de configuração necessários à execução dos
aplicativos. Além dos arquivos XML apresentados nas Figuras 6, 7 e 8, para compilação do
cliente é utilizado também o arquivo apresentado na Figura 9. Mais detalhes sobre a
utilização dos aplicativos podem ser encontrados em Nunes (2005) e na Seção 4.5.
2.5. B2B
A sigla B2B, derivada da expressão Business-to-Business (Negócio-a-Negócio), representa
a modalidade de negócio eletrônico realizado entre empresas, tidas como parceiras
comerciais umas das outras. Uma definição para o termo é apresentada por Silvestre
(2004): “nesse modelo as partes são duas organizações que interligam-se, geralmente em
uma relação de fornecedor ou usuário de produtos, serviços ou informação.” A interligação
de empresas, nessa modalidade negócio eletrônico, permite a troca de informações, muitas
vezes confidenciais, onde apenas o suficiente para a realização de negócios é
disponibilizado.
Amor (2000) enumera várias justificativas para a adoção do negócio eletrônico, tais como:
a busca pela expansão do alcance de mercado; tornar-se mais visível ao mercado alvo;
entregar resposta mais rapidamente aos clientes e parceiros; disponibilizar novos serviços;
34
fortalecer o relacionamento entre parceiros comerciais; e reduzir custos nas operações e,
conseqüentemente em produtos e serviços.
O surgimento da tecnologia de Web Services proporcionou que empresas com diferentes
sistemas informatizados pudessem interligá-los, obtendo mais agilidade na realização de
processos de negócios e reduzindo custos das operações, antes realizadas de forma manual,
envolvendo métodos de comunicação muitas vezes ultrapassados e consumindo os valiosos
recursos humanos. Na seção 2.6 serão apresentados mais detalhes relativos à tecnologia de
Web Services e o B2B.
2.6. Web Services em B2B
A adoção de padrões da Internet pela tecnologia de Web Services possibilita a integração de
aplicações heterogêneas permitindo que empresas possam ampliar seus serviços. Sistemas
que anteriormente não poderiam ser integrados devido a questões tecnológicas ou de custos
agora, interligados, permitem que empresas possam intercambiar informações formando
um modelo de negócio eletrônico vantajoso para ambos. Com isso fica fortalecida a
parceria entre as empresas, que antes tinham que realizar suas interações de outras formas.
Os processos de negócios agora podem (e até devem) ser repensados com o intuito de
avaliar as vantagens da informatização. Processos de negócios que antes eram realizados da
forma tradicional, consumindo recursos humanos e meios de comunicação dispendiosos,
agora podem ser conduzidos de forma ágil, com menor probabilidade de erros e com baixo
custo.
Pode-se citar como exemplo o serviço de reserva de veículos oferecido por uma locadora
de veículos, o qual seria realizado através da integração do sistema informatizado da
locadora com o de um hotel. No ato da realização de uma reserva junto ao hotel, um
hóspede poderia solicitar a reserva de um veículo, o que seria realizado automaticamente
pelo funcionário na interface do sistema do hotel, facilitando a manipulação pelo
funcionário, agilizando o processo de reserva, prestando um serviço de maior qualidade ao
hóspede, e economizando recursos e tempo na realização da transação.
35
Nesta negociação, a integração dos sistemas e a parceria entre as empresas ficariam
transparentes para o hóspede, que conduziria as negociações com o hotel. Posteriormente,
de acordo com as questões contratuais mantidas pelas empresas parceiras, os acertos seriam
realizados, quando o hotel repassaria os valores referentes à locação do veículo à locadora.
Nota-se, nesta rápida exposição, que a integração dos sistemas proporciona a expansão dos
serviços prestados pelo hotel aos seus clientes, sem significar aumento nos preços. Quanto
à locadora, a parceria representa uma expansão de mercado.
No tocante ao aspecto tecnológico, outros padrões como RMI e CORBA também poderiam
ser empregados, observando-se as limitações de cada um, a depender das características
dos sistemas a serem interligados, tais como plataformas, linguagens em que foram
desenvolvidos e custos envolvidos na operação de integração, como contratação de uma
equipe de desenvolvimento e treinamento de pessoal.
Neste contexto, a tecnologia de Web Services não parece ter surgido para substituir as
tecnologias existentes, mas sim proporcionar um maior poder de escolha por parte das
empresas no momento da integração dos sistemas. Observando o que foi citado logo acima,
o que vai determinar que uma tecnologia seja utilizada em contrapartida a outra são as
características de cada um dos sistemas.
36
3. MATERIAL E MÉTODOS
3.1. Material
O material utilizado compreende equipamentos de hardware e softwares, além do material
bibliográfico discriminado no capítulo referente às referências bibliográficas. Os
equipamentos de hardware serão apresentados na Seção 3.1.1. Os softwares utilizados
serão discriminados na Seção 3.1.2.
3.1.1. Hardware
O trabalho não necessitou de equipamentos de hardware especiais para o desenvolvimento.
Os equipamentos compreendem dois microcomputadores, cujas configurações serão a
seguir discriminadas:
•
Microcomputador tipo desktop, com processador Pentiun III com freqüência de 1.0
Gigahertz, com 256 MB de memória RAM, com disco rígido de 20 GB, com
unidade leitora/gravadora de CD/DVD, com unidade leitora/gravadora de disquetes
de 1.44 MB. O acesso à internet foi realizado através de conexão banda larga,
utilizando um modem D-Link 500G. Este conjunto de hardware foi utilizado na
fase de desenvolvimento e testes das aplicações e, principalmente, no
desenvolvimento
desta
Revisão
de
Literatura,
apresentando
desempenho
satisfatório na execução das atividades, sem a necessidade de quaisquer adaptações
ou substituições de peças e equipamentos.
37
•
Microcomputador tipo desktop, com processador Pentiun III com freqüência de 1.0
Gigahertz, com 256 MB de memória RAM, com disco rígido de 20 GB, com
unidade leitora de CD, com unidade leitora/gravadora de disquetes de 1.44 MB, nas
dependências do complexo de informática do CEULP/ULBRA. Este conjunto de
hardware foi utilizado principalmente para a realização de pesquisas na Internet,
auxiliando no desenvolvimento desta Revisão de Literatura, e apresentou também
desempenho satisfatório na execução das atividades, sem a necessidade de
quaisquer adaptações ou substituições de peças e equipamentos.
3.1.2. Software
Os equipamentos de hardware discriminados na Seção 3.1.1 utilizaram a plataforma
Windows, o primeiro com o Sistema Operacional Windows XP Professional Service Pack
2, e o segundo com o Sistema Operacional Windows 2000 Professional.
Para o desenvolvimento desta Revisão de Literatura, foi utilizado o aplicativo Microsoft
Word 2003 como editor de texto, e o Adobe Acrobat Reader 7.0 para leitura de
documentos diversos.
O navegador Web Microsoft Internet Explorer Versão 6.0 foi utilizado para a realização de
buscas na Internet, leitura de documentos e tutoriais, e no desenvolvimento e testes das
aplicações.
O desenvolvimento da modelagem do Web Service foi realizado com o auxílio do
aplicativo Rational Rose versão 2003.
Na edição das classes Java e dos arquivos XML foram utilizados o Jcreator LE versão
3.5.013, cuja versão é freeware, e o Bloco de Notas versão 5.1. Para as tarefas de
compilação e execução foi utilizado o JDK 5.0 (Java 2 Platform Standard Edition
Development Kit 5.0 Update 5), associado ao JWSDP versão 1.6. O container Web
utilizado foi o Tomcat 5.0 para JWSDP para a publicação do Serviço.
Na edição da aplicação Cliente foi utilizada a Linguagem PHP, cuja instalação foi realizada
com pacote da versão 5.1.4. Como editor das páginas PHP foi utilizado o Macromedia
Dreamweaver 8. Como servidor Web foi utilizado o Internet Information Services versão 5.
38
Como sistema gerenciador de banco de dados foi utilizado o MySQL versão 4, auxiliado
pelo aplicativo de consulta MySQL Query Browser versão 1.1.20 para Windows, utilizados
tanto no desenvolvimento do Servidor quanto na aplicação Cliente.
3.2. Métodos
A fase inicial do trabalho constituiu-se de buscas e leituras de textos, tutoriais e
documentos na Internet e consultando livros diversos, os quais são citados no capítulo de
referências bibliográficas, buscando o entendimento dos conceitos da tecnologia de Web
Services, da API JAX-RPC e dos aplicativos necessários para o desenvolvimento das
aplicações. O estudo da especificação técnica da API JAX-RPC foi de extrema importância
para o desenvolvimento do trabalho, destacando-se como o principal documento de
referência.
Passada a fase inicial, passou-se a definição do domínio e à modelagem do Web Service.
Posteriormente, iniciou-se a codificação das classes Java, acompanhando rigorosamente a
modelagem desenvolvida.
Para a definição da aplicação Cliente, buscou-se levantar as linguagens que oferecessem
suporte à tecnologia de Web Services, destacando-se a linguagem PHP devido à quantidade
de material de referência e tutoriais encontrados com extrema facilidade na Internet. Foi
escolhida uma linguagem distinta da implementação do servidor para mostrar a
interoperabilidade.
Terminadas as etapas de desenvolvimento das aplicações, passou-se à fase de testes, na
qual foi possível constatar o funcionamento das aplicações. Questionamentos surgiram a
respeito do real destaque da tecnologia de Web Services na integração de aplicações.
Por fim, passou-se à conclusão deste relatório, já com as devidas conclusões a respeito do
tema proposto, anotando-se as dificuldades encontradas e os pontos positivos e negativos
da utilização da tecnologia empregada.
39
4. RESULTADOS E DISCUSSÃO
4.1. Domínio
Na definição do domínio buscou-se colocar em discussão um tema que refletisse mais
adequadamente o assunto proposto neste estudo, que é a relação entre B2B e Web Services,
e não apenas um exemplo comum como os encontrados nos diversos tutoriais e
documentos sobre a tecnologia de Web Services, que, na maioria das vezes, não reflete as
situações do mundo real. Também se buscou um tema de acordo com as características da
modalidade de negócio eletrônico B2B, tentando levantar e discutir questões a respeito das
vantagens e desvantagens da integração de aplicações entre parceiros comerciais.
Neste trabalho foi desenvolvido um Web Service de uma locadora de veículos, onde é
possível receber solicitação de reservas de veículos, além de operações como alteração e
cancelamento de reserva, busca de veículos disponíveis para reserva e busca das reservas
realizadas pelos Clientes, neste caso, empresas parceiras.
A definição de um Web Service disponibilizado por uma locadora de veículos foi devido ao
fato deste ramo comercial oferecer um tipo de serviço que é utilizado por vários segmentos,
sendo viável buscar parcerias através da utilização da tecnologia de Web Services. As
operações relativas à reserva de veículos foram tidas como as mais relevantes, por isso
foram disponibilizadas pelo Web Service implementado aos seus parceiros comerciais.
Não foram desenvolvidas funcionalidades de gerenciamento de usuários e tampouco de
veículos, sendo que os dados necessários às operações de reserva foram inseridos
40
manualmente no banco de dados. Isso se deve ao fato do trabalho enfocar a comunicação
entre aplicações de empresas distintas.
Os clientes do serviço podem ser aplicações Web, aplicativos Desktop, ou outro Web
Service. Neste trabalho, para a aplicação Cliente foi idealizada uma aplicação Web de um
hotel que realizaria o papel de parceiro comercial, porém, vários outros segmentos
poderiam usar esse serviço, como, por exemplo, uma empresa de turismo. A aplicação Web
do hotel é integrada ao Web Service da locadora, buscando disponibilizar aos seus
hóspedes um serviço diferenciado, facilitando a realização do processo de negócio entre as
empresas parceiras, proporcionando aos funcionários mais facilidade na realização de suas
atividades. As reservas de veículos seriam integradas à aplicação Web do hotel.
Para a implementação do Servidor foi utilizada a API JAX-RPC, que integra o JWSDP. A
utilização da linguagem Java deve-se ao fato de ser uma linguagem portável e devido ao
fato de existirem estudos anteriores sobre o desenvolvimento de Web Services em Java.
A linguagem utilizada para a implementação do cliente foi a PHP e não o Java, que é a
linguagem do servidor, visando demonstrar a interoperabilidade dos Web Services, sendo
que foi comprovado que existe independência de plataforma e de linguagem de
programação. A linguagem PHP gratuita foi escolhida por ser simples, no tocante à
instalação e configuração, e por oferecer uma vasta bibliografia em português, não tendo
sido realizados testes comparativos com outras linguagens para essa escolha.
Neste trabalho não foram levadas em consideração questões relacionadas à segurança na
comunicação das aplicações, haja vista que se notou que o trabalho se estenderia a um
nível bastante elevado, e que o tempo disponível não proporcionaria a obtenção de
resultados satisfatórios. Porém, é importante mencionar que para colocar o serviço em uso,
seria interessante acrescentar a segurança na comunicação.
4.2. Comunicação das Aplicações
A comunicação da aplicação cliente com o Web Service é realizada de forma transparante
para o usuário da aplicação do hotel. A Figura 10 apresenta os detalhes da comunicação.
41
Figura 10 - Arquitetura de Comunicação
da Aplicação Cliente com o Web Service
Como pode ser visto na Figura 10, o usuário interage com a aplicação do hotel através do
navegador, que realiza uma requisição HTTP para o servidor Web, no caso o IIS. Quando a
página solicitada necessita realizar uma chamada ao Web Service, o Cliente PHP solicita o
documento WSDL, que é devolvido pelo Servidor. De posse do documento WSDL, o
Cliente PHP realiza um chamada a um método do Web Service, que processa a chamada e
envia o retorno. A comunicação nas chamadas e retorno de métodos do Web Service são
realizadas através do protocolo SOAP sobre HTTP. Ao final da realização das operações
solicitadas pelo usuário, uma resposta HTTP é enviada ao navegador e o resultado é
exibido ao usuário.
42
4.3. Modelagem do Web Service
A modelagem apresentada neste trabalho compreende apenas às funcionalidades
desenvolvidas no Web Service, no tocante à locadora de veículos, não sendo realizada a
modelagem das funcionalidades do hotel, já que esta foi implementada apenas para
demonstrar a utilização do serviço. Nas Seções 4.3.1 e 4.3.2 são apresentados e discutidos
apenas os principais diagramas da modelagem, sendo que a modelagem completa está
disponível no Anexo I.
4.3.1. Funcionalidades do Web Service
As funcionalidades modeladas são relacionadas às reservas de veículos, as quais seriam
disponibilizadas aos funcionários do hotel através da aplicação Web do hotel. São elas:
•
Buscar Veículos: buscar a relação dos veículos disponíveis para reserva;
•
Reservar Veículo: permitir a reserva de um veículo por um determinado cliente;
•
Buscar Reservas: buscar os dados das reservas, de acordo com os parâmetros
desejados, tais como: identificador do cliente, senha, lista com os identificadores
das reservas, período de realização das reservas (data inicial e data final do período)
e status;
•
Alterar Reserva: permitir a alteração da data de retirada e de devolução do veículo;
•
Cancelar Reserva: permitir o cancelamento de uma determinada reserva.
A Figura 11 apresenta o diagrama de casos de uso. Como pode ser observado na Figura 10,
em todas as funcionalidades o ator representa a empresa Cliente.
43
Reservar Veiculos
Buscar Veiculos
Cliente
Buscar Reservas
Alterar Reserva
Cancelar Reserva
Figura 11 – Diagrama de Casos de Uso.
4.3.2. Diagrama de Classes
Com base no diagrama de caso de uso, apresentado na Figura 10, e no desenvolvimento de
cada uma das funcionalidades, foram definidas as classes necessárias à implementação do
Web Service. A Figura 12 apresenta o diagrama de classes do Web Service.
44
Reserva
idReserva : int
dataReserva : java.util.Date
dataRetirada : java.util.Date
dataPrevDevolucao : java.util.Date
dataDevolucao : java.util.Date
quilometragemRetirada : int
quilometragemDevolucao : int
status : String
valorQuilometro : float
valorDiaria : float
idVeiculo : int
idCliente : int
criarReserva()
adicionarReserva()
buscarReservas()
buscarReserva()
alterarReserva()
cancelarReserva()
0..*
possui
0..*
possui
1
Veiculo
idVeiculo : int
modelo : String
marca : String
cor : String
ano : int
numPortas : int
numPassageiros : int
categHabilitacao : char
quilometragemAtual : int
valorQuilometro : float
valorDiaria : float
status : String
buscarVeiculos()
alterarVeiculo()
Veiculo()
Veiculos
buscarVeiculos()
alterarVeiculo()
1
Reservas
Cliente
(from Use Case View)
idCliente : int
senha : String
nome : String
responsavel : String
status : String
reservarVeiculo()
buscarReservas()
alterarReserva()
cancelarReserva()
Clientes
buscarCliente()
buscarCliente()
Figura 12 – Diagrama de Classes do Web Service.
No diagrama apresentado na Figura 12, a classe Cliente representa a empresa Cliente, a
qual foi definida como o ator no diagrama de casos de uso apresentado na Figura 10. A
classe Veiculo define os dados de cada veículo que serão armazenados no sistema, e que
são relevantes no conjunto das operações. A classe Reserva define os dados das reservas
45
realizadas e que também são relevantes no conjunto das atividades. Além dos dados,
representados pelos atributos das classes, são definidos também os métodos de cada classe,
necessários na realização das operações. Não foram representados neste diagrama os
métodos de acesso aos atributos das classes devido à quantidade de atributos existentes.
Além das classes que definem as entidades do sistema, foram representadas também as
classes que, no desenvolvimento da modelagem, tornaram-se necessárias. As classes
Clientes, Veiculos e Reservas definem classes com métodos estáticos que servem de
classes controladoras e que, desta forma, ficam isoladas no diagrama. Na Seção 4.5 será
descrita a implementação do Serviço.
4.4. Considerações sobre o serviço
No serviço implementado, em cada solicitação ao Web Service deve ser realizada a
autenticação do Cliente, necessitando assim que os dados de identificação da empresa
Cliente sejam encaminhados juntos com os demais dados de cada solicitação.
Devido às características da aplicação, a operação de autenticação dos Clientes deve ficar
transparente aos usuários das aplicações Clientes. Como o código da aplicação não fica à
vista do usuário, os dados de autenticação podem ficar embutidos no código. Além disso,
observou-se que o reenvio destes dados em cada solicitação não acarreta aumento
significativo no tempo de execução da solicitação.
Em uma situação em que o Servidor atendesse a um número maior de solicitações, a
manutenção de sessões poderia sobrecarregar a memória do Servidor. Uma alternativa para
esta situação seria a adoção do monitoramento de sessão com a definição de sessões com
tempo reduzido, e sempre com o reenvio dos dados de identificação do Cliente. A
manutenção de sessões permitiria maior agilidade na execução da funcionalidade, evitando
que a toda solicitação fosse realizada a verificação dos dados do Cliente na base de dados
do sistema. O reenvio dos dados permitirá a verificação imediata dos dados no caso de
tempo de sessão expirado. De qualquer forma, ficou definido neste trabalho não adotar o
gerenciamento de sessão por esta ser a maneira mais complexa de ser implementada.
46
Na modelagem, ficou definido que deveria existir um status relacionado ao cliente: ativo,
para o cliente que está em dia com as suas obrigações; e inativo, para os clientes que
possuem alguma pendência. Em todas as funcionalidades, com exceção da ação de busca
de reservas, o cliente deve estar com status definido como ativo, proporcionando à
locadora de veículos que somente esses possam solicitar a execução das funcionalidades.
Quanto à funcionalidade de busca de reservas, ela ficaria ativa até mesmo aos Clientes com
status definido como inativo, proporcionando aos mesmos que solicitassem ao sistema,
através desta funcionalidade, os dados relativos às reservas realizadas, possibilitando um
acompanhamento completo.
Neste trabalho, a locadora de veículos não tem a responsabilidade de armazenar os dados
pessoais dos condutores dos veículos, ficando esta tarefa a cargo de cada Cliente. Dentro
de um contexto do mundo real, por questões contratuais, inclusive a respeito da
necessidade de realização de seguros dos veículos, poderia ser necessária a manutenção
pela locadora dos dados dos condutores, o que significaria a necessidade de envio destes
dados no ato da solicitação da reserva, o que alteraria a estrutura do Web Service.
Não foi implementada uma funcionalidade para confirmação de reservas, uma vez que se
buscou analisar apenas questões de comunicação, e não o desenvolvimento completo de
um sistema para uma locadora de veículos.
Finalizada a modelagem do Web Service, passou-se à fase de codificação das classes da
interface e da implementação do Serviço, que é apresentada na seção 4.5. Por fim, foi
implementado um cliente para testar o serviço, um trecho do código é apresentado na seção
4.6. O código completo do cliente será apresentado no Anexo III.
4.4.1. Questão Legal do Serviço
O trabalho desenvolvido buscou abordar questões tecnológicas para a modalidade de
comércio eletrônico business-to-business, não fazendo parte do foco abordar questões
legais a respeito, uma vez que envolve vários fatores. Além disso, no que diz respeito a
legislação, não existe uma definição em relação aos B2B no Brasil, nem a respeito de
empresas do mesmo país nem em relação a empresas atuando em países distintos, o que
47
complicaria um pouco mais a questão legal. No entanto, passou-se a uma rápida análise
desse assunto em relação ao comércio eletrônico, que foi descrita baseada em leituras em
grupos de discussão e em sites de economia, sem grande relevância científica.
As funcionalidades disponibilizadas pela locadora de veículos às empresas Clientes através
do Web Service não configura comercialização de produto ou serviço através de meio
eletrônico. O que se entende é que é apenas uma forma de comunicação e solicitação de
serviço, tal como ocorre com o telefone ou outro meio de comunicação. O serviço prestado
pela locadora às empresas Clientes não ocorre de fato no meio eletrônico, ficando este
meio apenas como forma de solicitação, no qual a entrega do veículo se dá pessoalmente.
Passando-se a analisar a situação em que a contratação ocorreria de forma virtual, em que
as empresas Clientes contratariam com a locadora de veículos através de contrato
disponibilizado por meio eletrônico, e não pessoalmente, é necessário buscar uma análise
para o assunto no tocante a questões legais quanto ao contrato firmado. A busca por ambas
as partes em exigir o cumprimento do contrato pode ser uma tarefa difícil, principalmente
quando se tratar de empresas situadas em países distintos.
Por fim, mesmo quando o contrato é firmado pessoalmente, observa-se que a confirmação
de uma determinada reserva poderia ser um dos pontos mais relevantes nesta discussão
caso não seja adotado um sistema confiável de confirmação de reserva, seja qual for o meio
de comunicação.
4.5. Implementação do Serviço
Conforme mencionado na Seção 2.4.3.1.1, o Servidor pode ser implementado de duas
formas. Neste trabalho, a implementação foi realizada codificando-se a interface e a classe
de implementação do Servidor. A interface do Serviço define os métodos que serão
disponibilizados às aplicações Clientes. A Figura 13 apresenta o código da interface do
Serviço.
48
1.
package locadora;
2.
3.
4.
import java.rmi.*;
import java.rmi.RemoteException;
import java.util.*;
5.
public interface LocadoraIF extends Remote{
6.
public Object[] buscarVeiculos(int idCliente, String senha) throws
RemoteException;
7.
8.
public boolean reservarVeiculo(int idCliente, String senha, int idVeiculo, Date
dataRetirada, Date dataPrevDevolucao) throws RemoteException;
9.
10.
public Object[] buscarReservas(int idCliente, String senha, Object[] listIdReservas,
Date dataInicialReservas, Date dataFinalReservas, String status) throws RemoteException;
11.
12.
public boolean alterarReserva(int idCliente, String senha, int idReserva, Date
dataRetirada, Date dataPrevDevolucao) throws RemoteException;
13.
14.
public boolean cancelarReserva(int idCliente, String senha, int idReserva) throws
RemoteException;
15. }
Figura 13 – Implementação da Interface do Web Service.
A codificação da interface apresentada na Figura 13 segue a especificação das
funcionalidades do sistema. Considerando-se as características da aplicação, em todos os
métodos definidos na interface, o identificador e a senha do Cliente são obrigatórios, com o
intuito de permitir a autenticação do Cliente em cada solicitação às funcionalidades do Web
Service.
Através do método buscarVeiculos o Cliente solicita a lista dos veículos disponíveis para
reserva. O método tem como parâmetros apenas os dados de identificação do Cliente. A
lista é um array de objetos da classe Veiculo definida na modelagem.
Com o método reservarVeiculo o Cliente pode solicitar a reserva de um determinado
veículo, informando, além dos dados de identificação, o identificador do veículo, a data
pretendida para retirada e a data provável para devolução. Caso a operação seja realizada
com sucesso, o método retornará o identificador da reserva, para controle do Cliente. Caso
ocorra falha na operação será retornado o valor -1.
49
O método buscarReservas possibilita que o Cliente possa obter relatórios de suas reservas,
através de uma lista de reservas que é retornada. Como parâmetros o método possui os
dados de identificação do Cliente, uma lista de identificadores de reservas especificados
através do parâmetro listIdReservas, um intervalo de datas de realização das reservas
especificado através dos parâmetros dataInicialReservas e dataFinalReservas. O último
parâmetro é o status das reservas. Assim, o Cliente pode buscar as reservas que realizou
tendo como base uma lista de identificadores de reservas, ou tendo como base um intervalo
de datas da realização das reservas e o status.
O método alterarReserva possibilita que o Cliente possa alterar a data de retirada e a data
de devolução de uma determinada reserva. Além dos dados de identificação do Cliente, o
método possui como parâmetros o identificador da reserva a ser alterada, a nova data de
retirada e a nova data de devolução do veículo. Como resultado o método retorna um valor
booleano especificando o valor verdadeiro (true) no caso de sucesso e o valor falso (false)
para o caso de falha.
O método cancelarReserva possibilita que o Cliente possa cancelar uma determinada
reserva. Como resultado o método retorna um valor booleano especificando o valor
verdadeiro (true) no caso de sucesso e o valor falso (false) para o caso de falha.
4.6. Implementação do Cliente
Conforme foi mencionado na Seção 4.1, o cliente foi desenvolvido na linguagem PHP, a
fim de demonstrar a interoperabilidade da tecnologia de Web Services. A implementação
do Cliente corresponde a uma aplicação Web de um hotel, em que está disponível aos
funcionários as funcionalidades para a realização de reserva de veículos aos hóspedes,
fazendo uso das funcionalidades do Web Service.
Foram implementadas somente as funcionalidades da aplicação Cliente que utilizam os
métodos do Web Service, porém, em um caso real essa funcionalidade seria parte do
sistema de gerenciamento do Hotel. Assim como no servidor, os dados necessários à
realização das operações foram inseridos manualmente no banco de dados, para simplificar
a implementação e deixar o foco do trabalho na comunicação entre as aplicações.
50
Na linguagem PHP, versão 5, a biblioteca de funções necessária para a criação de
aplicações Clientes de Web Services e Servidores já está incorporada, necessitando apenas
que seja feita a habilitação da biblioteca. Mais detalhes de configuração podem ser
encontados em Php (2006).
A implementação de um Cliente de um Web Service baseado em SOAP na linguagem PHP
é bastante simplificada. Uma vez que se tenha habilitado a biblioteca php_soap.dll no
arquivo de configuração php.ini, no diretório de instalação da linguagem, é possível
instanciar um objeto da classe SoapClient, necessitando saber apenas a localização da
WSDL do Serviço. A Figura 14 apresenta um trecho de código do arquivo veiculos.php,
através do qual é realizada a busca dos veículos da locadora que estão disponíveis para
reserva.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?php
$client = new SoapClient("http://localhost:8080/Locadora/locadora?WSDL");
$veiculos = ($client->buscarVeiculos(1,"senha1"));
if (count($veiculos)<=0){
echo("Não existem veículos disponíveis para reserva!");
}else{
//apresenta um formulário para fornecimento dos dados para a reserve.
//trecho omitido devido à extensão do código
}
?>
Figura 14 – Fragmento de Código do Arquivo veiculos.php.
Na Figura 14 foi apresentado somente um fragmento do código do arquivo veículos.php
devido à sua extensão. O arquivo na íntegra pode ser encontrado no Anexo III. Neste
fragmento, observa-se que à variável $client é atribuído o objeto da classe SoapClient
obtido através da instanciação da classe, tendo como parâmetro o endereço da WSDL do
Serviço. Após a instanciação do objeto, é possível realizar chamadas a qualquer método
implementado pelo Web Service. O código em negrito representa estas operações.
A chamada ao método buscarVeiculos do Web Service, apresentada na linha 3 do
fragmento de código da Figura 14, tem como parâmetros o identificador do Cliente, neste
51
caso a empresa parceira, e a senha. Como retorno, será atribuído à variável $veiculos um
array com os dados dos veículos que estão disponíveis para reserva.
Analisando o trecho apresentado nota-se a facilidade da codificação de um Cliente de um
Web Service baseado em RPC, no qual as chamadas aos métodos remotos são realizadas da
mesma forma que seriam feitas às chamadas aos métodos de um objeto local.
No entanto, dificuldades podem ser observadas a respeito dos tipos de dados dos
parâmetros e dos métodos de retorno. Apesar de todo o estudo da especificação da API
JAX-RPC a respeito do mapeamento de dados, e da realização de testes com pequenas
aplicações, foi observado que as diferenças entre as linguagens pode dificultar a integração
das aplicações.
Ainda a respeito do mapeamento de dados, pode-se citar como exemplo a dificuldade
encontrada neste trabalho a respeito dos dados do tipo Data, onde a adoção das classes
java.util.Date e java.sql.Date dificultou o desenvolvimento do trabalho, não permitindo que
tanto um Cliente na própria linguagem java como o Cliente na linguagem PHP pudessem
realizar chamadas aos métodos remotos. Assim, foi definido que os dados do tipo Data
seriam representados como String no Servidor, com a forma “AAAA-MM-DD” para
facilitar a inserção no banco de dados. Na busca por alternativas para o problema, foram
realizadas consultas a diversos fóruns de discussão sobre o assunto, além de um exaustivo
estudo da especificação da API da documentação das classes, sendo que a alternativa
adotada foi a mais fácil de ser implementada, senão a única encontrada, uma vez que testes
com outras alternativas não obtiveram êxito.
Além da dificuldade nos tipos de dados que representam Data, foi notada também uma
dificuldade na adoção dos tipos dos parâmetros e dos dados de retorno dos métodos
remotos do Web Service. A utilização de classes definidas no desenvolvimento para estes
dados não foi possível, embora a API defina que classes que não integram a API possam
ser empregadas, desde que atendidos os requisitos quanto aos tipos de dados dos atributos,
dos parâmetros e dos dados de retorno dos métodos. No caso dos métodos remotos
buscarVeiculos e buscarReservas, são retornados arrays de objetos da classe
java.util.Object, uma vez que as classes Veiculo e Reserva não puderam ser empregadas.
52
Feitas as adequações para sanar as dificuldades acima citadas, observou-se, no entanto, que
deste ponto em diante a implementação do cliente foi realizada com certa facilidade,
especialmente na linguagem PHP.
Ressalte-se também que o fato da linguagem PHP disponibilizar funções nativas, tanto para
criação de Web Services e Clientes quanto para acesso ao Sistema Gerenciador de Banco de
Dados MySQL possibilitou otimizar o desenvolvimento da aplicação.
53
5. CONSIDERAÇÕES FINAIS
O desenvolvimento do trabalho permitiu o levantamento das características da tecnologia
de Web Services bem como da modalidade de comércio eletrônico Business-to-business
(B2B), possibilitando uma avaliação mais concisa a respeito das tecnologias atuais
utilizadas na integração de aplicações, bem como o levantamento das vantagens advindas
da utilização do comércio eletrônico, sobretudo naquela modalidade.
Foi possível notar a importância do emprego da tecnologia de Web Services na realização
de processos de negócio. A informatização das empresas, associada à redução nos custos
dos equipamentos, permitiu a automatização dos processos de negócio, tornando mais ágil,
mais eficiente e menos dispendiosa a sua execução. Nota-se também a importância da
utilização da tecnologia pelas empresas com a finalidade de expandir seus mercados
consumidores, abrangendo regiões geográficas e faixas de mercado antes inatingíveis.
Uma questão que não pode deixar de ser citada é a respeito da importância da busca de
padronização no desenvolvimento de tecnologias, sobretudo a respeito da integração de
aplicações desenvolvidas em plataformas e linguagens de programação diferentes. O
padrão XML facilita o trabalho de padronização, possibilitando a criação de novos padrões,
como é o caso, por exemplo, da linguagem WSDL e do protocolo SOAP.
Em relação a B2B é importante citar que existem poucas informações no que diz respeito à
legislação, sendo que nesse trabalho não foi abordada a relação legal entre as empresas.
Desta forma, esse trabalho apontou a viabilidade em se utilizar os Web Services na ligação
entre aplicações de empresas distintas e mostrou que, realmente, existe portabilidade na
54
utilização dessa tecnologia, já que cliente e servidor foram implementados em linguagens
diferentes.
No que diz respeito à comunicação entre aplicações cliente e servidor implementados em
linguagens distintas, vale ressaltar que, apesar da portabilidade ser garantida pelas
características dos Web Services, podem existir alguns problemas relacionados às
características próprias das linguagens, como, por exemplo, os tipos de dados manipulados
pelas mesmas.
Baseando-se nos estudos realizados nesse trabalho uma questão que não pode ser definida é
qual a melhor tecnologia de comunicação, RMI, CORBA ou Web Services, já que a escolha
depende muito do problema que se quer resolver e, nesse trabalho, foi analisada apenas
uma situação, não sendo realizado um estudo comparativo entre as mesmas. Para a situação
apresentada, a princípio, a melhor escolha é o Web Service, por dois motivos: a facilidade
da implementação do cliente, já que só é necessário conhecer a localização da WSDL; e a
troca de dados XML. Em relação ao RMI, pode-se acrescentar, ainda, que a
interoperabilidade é mais uma vantagem de se utilizar Web Services.
Individualmente, é perceptível o grande valor trazido pelo desenvolvimento deste trabalho,
evidenciando um notável aprendizado a respeito da tecnologia e dos aspectos relativos ao
comércio eletrônico, o qual seguramente pode ser empregado no desenvolvimento de
outros estudos e servir de base para outros trabalhos.
Como trabalhos futuros, pode-se pensar o estudo de aspectos relativos à segurança de Web
Services, uma vez que esta é uma questão essencial, principalmente quando se está
abordando questões comerciais, como é o caso do Business-to-business.
55
6. REFERÊNCIAS BIBLIOGRÁFICAS
(ALBUQUERQUE, 2001)
ALBUQUERQUE, Fernando. TCP/IP – Internet
Programação de Sistemas Distribuídos HTML,
JavaScript e Java. Rio de Janeiro: Axcel Books, 2001.
(AMOR, 2000)
AMOR, Daniel. A ®Evolução do E-Business: Vivendo e
Trabalhando em um Mundo Interconectado. São Paulo:
Makron Books, 2000.
(CASETTI, 1993)
CASETTI, Orestes et al. Paradigmas para Construção de
Sistemas Distribuídos. Brasília: 1993. Disponível em
http://www.serpro.gov.br/publicacao/tematec/1993/ttec13.
Acesso em 29/04/2006.
CHAPPELL, David A. et al. Java Web Services. California:
O’Reilly & Associates, 2002.
(CHAPPELL, 2002)
(COULOURIS, 2001)
(HENDRICKS, 2002)
COULOURIS, George et al. Distributed Systems –
Concepts and Design, 3ª Edição, 2001. Adison Wesley,
Pearson Education.
HENDRICKS, Mack et al. Profissional Java Web Services.
Rio de Janeiro: Alta Books, 2002.
(HORSTMANN, 2003)
HORSTMANN, Cay S. et al. Core Java 2 – Volume II –
Recursos Avançados. São Paulo: Pearson Education do
Brasil, 2003.
(NUNES, 2005)
NUNES, Luiz W. A. Análise da Utilização da API JAX-R
para Acesso a Registros XML. 2005. 95 f. Trabalho de
Estágio (Estágio Supervisionado como Requisito Parcial da
Disciplina de Sistemas de Informação I) – Centro
Universitário Luterano de Palmas, Universidade Luterana do
Brasil, Palmas, 2005.
56
(OASIS, 2004)
OASIS, Organization for the Advancement of Structured
Information Standards. UDDI Spec TC. Disponível em
<http://uddi.org/pubs/uddi-v3.0.2-20041019.htm>. Acesso
em: 30 jun. 2006.
(PHP, 2006)
PHP, Linguagem PHP. Manual do PHP. Disponível em
<http://www.php.net/manual/pt_BR/>. Acesso em: 03 jul.
2006.
(RICCIONI, 2000)
RICCIONI, Paulo Roberto. Introdução a
Distribuídos com CORBA, Visual Books: 2000.
(SILBERSCHATZ, 2004)
SILBERSCHATZ, Abraham et al. Sistemas Operacionais
com Java, 6ª Edição. Rio de Janeiro: Campus, 2004.
(SILVESTRE, 2004)
SILVESTRE, Larissa Jácome Barros. A Utilização do
Padrão XML no Gerenciamento de Processos de
Negócios. 2004. 91 f. Monografia (Pós-Graduação em
Gestão em Novas Tecnologias) – Centro Universitário
Luterano de Palmas, Universidade Luterana do Brasil,
Palmas, 2004.
(SUN, 2003)
SUN, Sun Microsystems. Java API for XML-Based RPC
Specification 1.1. Califórnia, 2003. Disponível em
<http://java.sun.com/xml/downloads/jaxrpc.html>. Acesso
em 30 jun. 2006.
(SUN,2005)
SUN, Sun Microsystems. J2EE 1.4 Tutorial. Disponível em
<http://java.sun.com/j2ee/1.4/docs/tutorial/doc/>. Acesso em
30 jun. 2006.
(TODD, 2003)
TODD, Nick et al. Java Server Pages – O Guia do
Desenvolvedor. Rio de Janeiro: Campus, 2003.
(W3C, 2001)
W3C, World Wide Web Consortium. Web Services
Description
Language.
Disponível
em
<http://www.w3.org/TR/wsdl>. Acesso em: 31 jul. 2006.
(W3C, 2002)
W3C, World Wide Web Consortium. Web Services
Architecture.
Disponível
em
<http://www.w3.org/TR/2002/WD-ws-arch20021114/#whatisws>. Acesso em: 30 jun. 2006.
Objetos
57
ANEXOS
58
ANEXO I: MODELAGEM DO WEB SERVICE
CASOS DE USO EXPANDIDO
Caso de Uso:
Atores:
Finalidade:
Buscar Veículos
Cliente
Buscar a relação de veículos disponíveis
para reserva.
O cliente solicita a relação de veículos
Visão Geral:
disponíveis.
Primário
Tipo:
O cliente deve possuir status “ativo”.
Pré-condições:
Não tem.
Pós-condições:
Seqüência Típica de Eventos
Ação do Ator
Resposta do Sistema
1. Este caso de uso começa quando o
2. O sistema verifica o status do
cliente solicita os veículos
cliente, busca e retorna uma lista
disponíveis para reserva.
com os dados dos veículos.
2. O sistema retorna mensagem de
Seqüências Alternativas:
erro informando que o status do
cliente está “inativo”.
2. O sistema retorna mensagem de
erro informando a inexistência de
veículos disponíveis para reserva.
59
Caso de Uso:
Atores:
Finalidade:
Visão Geral:
Tipo:
Pré-condições:
Pós-condições:
Reservar Veículo
Cliente
Permitir a reserva de um veículo por um
determinado cliente.
O cliente identifica o veículo, informa a
data de retirada e a data de devolução.
Primário
O cliente deve possuir status “ativo”. O
veículo deve estar disponível para reserva.
É criado um objeto do conceito Reserva
associado ao objeto do conceito Cliente e
ao objeto do conceito Veículo. O atributo
status do objeto do conceito Veículo é
configurado como “reservado”.
Seqüência Típica de Eventos
Ação do Ator
Resposta do Sistema
1. Este caso de uso começa quando o
2. O sistema verifica o status do
cliente identifica o veículo,
cliente, confirma a disponibilidade
informa o período desejado para
do veículo e retorna mensagem de
locação, e confirma a operação.
confirmação,
contendo
o
identificador da Reserva.
2. O sistema retorna mensagem de
Seqüências Alternativas:
erro informando que o status do
cliente está “inativo”.
2. O sistema retorna mensagem de
erro informando que o veículo está
indisponível para reserva.
60
Caso de Uso:
Atores:
Finalidade:
Buscar Reservas
Cliente
Permitir a busca dos dados das reservas,
de acordo com os parâmetros desejados.
O cliente solicita as reservas de acordo
Visão Geral:
com
os
seguintes
parâmetros:
identificador
do
cliente,
senha,
identificadores das reservas, período da
realização das reservas (data inicial e data
final do período) e status.
Primário
Tipo:
Não tem.
Pré-condições:
Não tem.
Pós-condições:
Seqüência Típica de Eventos
Ação do Ator
Resposta do Sistema
1. Este caso de uso começa quando o
2. O sistema identifica o cliente,
cliente informa os parâmetros
busca e retorna os dados das
desejados e confirma a operação.
reservas de acordo com os
parâmetros.
2. O sistema retorna mensagem de
Seqüências Alternativas:
erro, informando que o cliente não
foi identificado.
2. O sistema retorna mensagem de
erro informando que não foram
encontradas ocorrências de acordo
com os parâmetros informados.
61
Caso de Uso:
Atores:
Finalidade:
Alterar Reserva
Cliente
Permitir alteração em uma determinada
reserva.
O cliente identifica a reserva e informa o
Visão Geral:
novo período da locação.
Primário
Tipo:
A reserva deve estar com status “a retirar”
Pré-condições:
e o cliente deve estar com status “ativo”.
É alterado o período desejado para
Pós-condições:
locação.
Seqüência Típica de Eventos
Ação do Ator
Resposta do Sistema
1. O cliente informa o novo período e
2. O sistema verifica o status do
solicita alteração.
cliente, realiza a alteração e retorna
mensagem de confirmação.
2. O sistema retorna mensagem de
Seqüências Alternativas:
erro informando que o status do
cliente está “inativo”.
2. O sistema retorna mensagem de
erro informando que a reserva não
existe.
2. O sistema retorna mensagem de
erro informando que a reserva não
permite alteração.
62
Caso de Uso:
Atores:
Finalidade:
Visão Geral:
Tipo:
Pré-condições:
Pós-condições:
Cancelar Reserva
Cliente
Permitir o cancelamento de uma
determinada reserva.
O cliente identifica a reserva e solicita o
cancelamento.
Primário
A reserva deve estar com status “a retirar”
e o cliente deve possuir com status
“ativo”.
O status da reserva é configurado para
“cancelada”. O atributo status do objeto
do conceito Veículo é definido como
“disponível”.
Seqüência Típica de Eventos
Ação do Ator
Resposta do Sistema
1. Este caso de uso começa quando o
2. O sistema verifica o status do
cliente solicita o cancelamento de
cliente, confere o status da reserva
uma determinada reserva.
e altera para “cancelada”.
2. O sistema retorna mensagem de
Seqüências Alternativas:
erro informando que o status do
cliente está “inativo”.
2. O sistema retorna mensagem de
erro informando que a reserva não
existe.
2. O sistema retorna mensagem de
erro informando que a reserva não
pode ser cancelada.
63
DIAGRAMAS DE CASOS DE USO
Reservar Veiculos
Buscar Veiculos
Cliente
Buscar Reservas
Alterar Reserva
Cancelar Reserva
64
MODELO CONCEITUAL
Veiculo
idVeiculo
modelo
marca
cor
ano
numPortas
numPassageiros
categHabilitacao
quilometragemAtual
valorQuilometro
valorDiaria
status
possui
1
0..*
Reserva
idReserva
dataReserva
dataRetirada
dataPrevDevolucao
dataDevolucao
quilometragemRetirada
quilometragemDevolucao
status
valorQuilometro
valorDiaria
idVeiculo
idCliente
possui
1
0..*
Cliente
(from Use Case View)
idCliente
senha
nome
responsavel
status
65
DIAGRAMAS DE SEQÜÊNCIAS
Buscar Veículos
: Cliente
buscarVeiculos(idCliente,senha)
Sistema
Reservar Veículo
: Cliente
Sistema
reservarVeiculo(idCliente,senha,idVeiculo,dataRetirada,dataPrevDevolucao)
66
Buscar Reservas
: Cliente
Sistema
buscarReservas(dadosDeBusca)
dadosDeBusca: idCliente, senha, listIdReservas,
dataInicialReservas, dataFinalReservas, status.
Alterar Reserva
: Cliente
alterarReserva(idCliente,senha,idReserva,dataRetirada,dataPrevDevolucao)
Sistema
67
Cancelar Reserva
Sistema
: Cliente
cancelarReserva(idCliente,senha,idReserva)
68
CONTRATOS
Buscar Veículos
Contrato:
Nome:
Parâmetros:
Responsabilidades:
Exceções:
Saída:
Pré-condições:
Pós-condições:
Buscar Veículos
buscarVeiculos(parâmetros)
Cliente:
• idCliente
• senha
Buscar os dados dos veículos cujo status é
“disponível”.
Cliente com status “inativo”.
Não tem.
Não tem.
Não tem.
Reservar Veículo
Contrato:
Nome:
Parâmetros:
Responsabilidades:
Exceções:
Saída:
Pré-condições:
Pós-condições:
Reservar Veículo
reservarVeiculo(parâmetros)
Cliente:
• idCliente
• senha
Veiculo:
• idVeiculo
Reserva:
• dataRetirada
• dataPrevDevolucao
Realizar a reserva de um determinado
veículo.
Veículo já reservado.
Não tem.
O cliente deve possuir status “ativo”.
É criado um objeto do conceito Reserva
relacionado ao objeto do conceito Veículo
e ao objeto do conceito Cliente. O atributo
status do objeto do conceito Veículo é
configurado como “reservado”.
69
Buscar Reservas
Contrato:
Nome:
Parâmetros:
Responsabilidades:
Exceções:
Saída:
Pré-condições:
Pós-condições:
Buscar Reservas
buscarReservas(parâmetros)
Cliente:
• idCliente
• senha
Reservas:
• listIdReservas (lista com valores
para o atributo idReserva das
reservas a consultar)
• dataInicialReservas
• dataFinalReservas
• status
Buscar os dados das reservas realizadas,
de acordo com os critérios desejados.
Não tem.
Não tem.
O cliente deve ser identificado.
Não tem.
Alterar Reserva
Contrato:
Nome:
Parâmetros:
Responsabilidades:
Exceções:
Saída:
Pré-condições:
Pós-condições:
Alterar Reserva
alterarReserva(parâmetros)
Cliente:
• idCliente
• senha
Reserva:
• idReserva
• dataRetirada
• dataPrevDevolucao
Alterar a data de retirada e/ou a data de
previsão para devolução de uma
determinada reserva.
Reserva com status “retirado”.
Não tem.
O cliente deve possuir status “ativo”.
São alterados os valores dos atributos
dataRetirada e dataPrevDevolucao do
objeto do conceito Reserva.
70
Cancelar Reserva
Contrato:
Nome:
Parâmetros:
Responsabilidades:
Exceções:
Saída:
Pré-condições:
Pós-condições:
Cancelar Reserva
cancelarReserva(parâmetros)
Cliente:
• idCliente
• senha
Reserva:
• idReserva
Permitir o cancelamento de uma
determinada reserva.
Reserva com status diferente de “a
retirar”.
Não tem.
O cliente deve possuir status “ativo”.
O valor do atributo status do objeto do
conceito Reserva é definido como
“cancelada”. O valor do atributo status do
objeto do conceito Veículo é definido
como “disponível”.
71
DIAGRAMAS DE COLABORAÇÃO
Buscar Veículos
3: cliente := buscarCliente(idCliente,senha)
Cliente
Clientes
2: cliente := buscarCliente(idCliente,senha)
1: buscarVeiculos(idCliente,senha)
Sistema
: Cliente
4: [cliente.getStatus() == "ativo"] listaVeiculos := buscarVeiculos()
Veiculo
Veiculos
5: listaVeiculos := buscarVeiculos()
72
Reservar Veículo
6: [veiculo.getStatus() == "disponivel"] alterarVeiculo(status)
Veiculo
Veiculos
Cliente
5: veiculo := buscarVeiculo(idVeiculo)
4: [cliente.getStatus() == "ativo"] alterarVeiculo(idVeiculo,status)
3: cliente := buscarCliente(idCliente,senha)
1: reservarVeiculo(idCliente,senha,idVeiculo,dataRetirada,dataPrevDevolucao)
2: cliente := buscarCliente(idCliente,senha)
Sistema
Clientes
: Cliente
7: reservarVeiculo(idCliente,idVeiculo,dataRetirada,dataPrevDevolucao)
9: [reserva != null] idReserva := adicionarReserva(reserva)
8: criarReserva(idCliente,idVeiculo,dataRetirada,dataPrevDevolucao)
reserva:
Reserva
Reservas
Reserva
73
Buscar Reservas
Cliente
Clientes
3: cliente := buscarCliente(idCliente,senha)
2: cliente := buscarCliente(idCliente,senha)
1: buscarReservas(idCliente,senha,listIdReservas,dataInicialReservas,dataFinalReservas,status)
Sistema
: Cliente
4: [cliente != null] reservas := buscarReservas(idCliente,listIdReservas,dataInicialReservas,dataFinalReservas,status)
5: reservas := buscarReservas(idCliente,listIdReservas,dataInicialReservas,dataFinalReservas,status)
Reserva
Reservas
74
Alterar Reserva
Cliente
Clientes
3: cliente := buscarCliente(idCliente,senha)
2: cliente := buscarCliente(idCliente,senha)
1: alterarReserva(idCliente,senha,idReserva,dataRetirada,dataPrevDevolucao)
Sistema
: Cliente
4: [cliente.getStatus() == "ativo"] alterarReserva(idCliente,idReserva,dataRetirada,dataPrevDevolucao)
5: reserva := buscarReserva(idReserva)
Reserva
Reservas
6: [reserva.getStatus() == "a retirar" && reserva.getIdCliente() == idCliente] alterarReserva(idReserva,dataRetirada,dataPrevDevolucao)
75
Cancelar Reserva
Clientes
Cliente
Veiculo
3: cliente := buscarCliente(idCliente,senha)
8: alterarVeiculo(reserva.getIdVeiculo(),status)
2: cliente := buscarCliente(idCliente,senha)
7: alterarVeiculo(reserva.getIdVeiculo(),status)
1: cancelarReserva(idCliente,senha,idReserva)
Sistema
Veiculos
: Cliente
4: [cliente.getStatus() == "ativo] reserva:= cancelarReserva(idCliente,idReserva)
5: reserva := buscarReserva(idReserva)
Reserva
Reservas
6: [reserva.getStatus() == "a retirar" && reserva.getIdCliente() == idCliente] cancelarReserva(idReserva)
76
DIAGRAMA DE CLASSES
Reserva
idReserva : int
dataReserva : java.util.Date
dataRetirada : java.util.Date
dataPrevDevolucao : java.util.Date
dataDevolucao : java.util.Date
quilometragemRetirada : int
quilometragemDevolucao : int
status : String
valorQuilometro : float
valorDiaria : float
idVeiculo : int
idCliente : int
criarReserva()
adicionarReserva()
buscarReservas()
buscarReserva()
alterarReserva()
cancelarReserva()
0..*
possui
0..*
possui
1
Veiculo
idVeiculo : int
modelo : String
marca : String
cor : String
ano : int
numPortas : int
numPassageiros : int
categHabilitacao : char
quilometragemAtual : int
valorQuilometro : float
valorDiaria : float
status : String
buscarVeiculos()
alterarVeiculo()
Veiculo()
Veiculos
buscarVeiculos()
alterarVeiculo()
1
Reservas
Cliente
(from Use Case View)
idCliente : int
senha : String
nome : String
responsavel : String
status : String
buscarCliente()
reservarVeiculo()
buscarReservas()
alterarReserva()
cancelarReserva()
Clientes
buscarCliente()
77
ANEXO II: IMPLEMENTAÇÃO DO WEB SERVICE
CLASSE CLIENTE
package locadora;
import java.sql.*;
import java.sql.SQLException;
public class Cliente{
public Cliente(){}
public void setIdCliente(int idCliente){
this.idCliente = idCliente;
}
public int getIdCliente(){
return this.idCliente;
}
public void setSenha(String senha){
this.senha = senha;
}
public String getSenha(){
return this.senha;
}
public void setNome(String nome){
this.nome = nome;
}
public String getNome(){
return this.nome;
}
public void setResponsavel(String responsavel){
this.responsavel = responsavel;
}
public String getResponsavel(){
return this.responsavel;
}
78
public void setStatus(String status){
this.status = status;
}
public String getStatus(){
return this.status;
}
public Cliente buscarCliente(int idCliente, String senha){
this.conexao = new Conexao();
try{
if (this.conexao.conecta()){
this.resultSet = conexao.consulta("SELECT * FROM
cliente WHERE idCliente = "+idCliente+" AND senha = '"+senha+"';");
if (this.resultSet != null){
if (this.resultSet.next()){
this.setIdCliente(this.resultSet.getInt(1));
this.setSenha(this.resultSet.getString(2));
this.setNome(this.resultSet.getString(3));
this.setResponsavel(this.resultSet.getString(4));
this.setStatus(this.resultSet.getString(5));
this.conexao.desconecta();
this.conexao = null;
return this;
}
}
}
return null;
}catch(SQLException ex){
return null;
}
}
}
private int idCliente;
private Conexao conexao;
private ResultSet resultSet;
private String senha, nome, responsavel, status;
79
CLASSE VEICULO
package locadora;
import java.util.*;
import java.sql.*;
import java.sql.SQLException;
public class Veiculo{
public Veiculo(){}
public void setIdVeiculo (int idVeiculo){
this.idVeiculo = idVeiculo;
}
public int getIdVeiculo(){
return this.idVeiculo;
}
public void setAno(int ano){
this.ano = ano;
}
public int getAno(){
return this.ano;
}
public void setNumPortas(int numPortas){
this.numPortas = numPortas;
}
public int getNumPortas(){
return this.numPortas;
}
public void setNumPassageiros(int numPassageiros){
this.numPassageiros = numPassageiros;
}
public int getNumPassageiros(){
return this.numPassageiros;
}
public void setQuilometragemAtual(int quilometragemAtual){
this.quilometragemAtual = quilometragemAtual;
}
80
public int getQuilometragemAtual(){
return this.quilometragemAtual;
}
public void setModelo(String modelo){
this.modelo = modelo;
}
public String getModelo(){
return this.modelo;
}
public void setMarca(String marca){
this.marca = marca;
}
public String getMarca(){
return this.marca;
}
public void setCor(String cor){
this.cor = cor;
}
public String getCor(){
return this.cor;
}
public void setStatus(String status){
this.status = status;
}
public String getStatus(){
return this.status;
}
public void setCategHabilitacao(String categHabilitacao){
this.categHabilitacao = categHabilitacao;
}
public String getCategHabilitacao(){
return this.categHabilitacao;
}
public void setValorQuilometro(float valorQuilometro){
81
}
this.valorQuilometro = valorQuilometro;
public float getValorQuilometro(){
return this.valorQuilometro;
}
public void setValorDiaria(float valorDiaria){
this.valorDiaria = valorDiaria;
}
public float getValorDiaria(){
return this.valorDiaria;
}
public ArrayList buscarVeiculos(){
this.conexao = new Conexao();
try{
if (this.conexao.conecta()){
this.resultSet = this.conexao.consulta("SELECT * FROM
veiculo WHERE status = 'disponivel';");
if (this.resultSet != null){
ArrayList veiculos = new ArrayList();
while (this.resultSet.next()){
veiculos.add(this.resultSet.getInt(1));
veiculos.add(this.resultSet.getString(2));
veiculos.add(this.resultSet.getString(3));
veiculos.add(this.resultSet.getString(4));
veiculos.add(this.resultSet.getInt(5));
veiculos.add(this.resultSet.getInt(6));
veiculos.add(this.resultSet.getInt(7));
veiculos.add(this.resultSet.getString(8));
veiculos.add(this.resultSet.getInt(9));
veiculos.add(this.resultSet.getFloat(10));
veiculos.add(this.resultSet.getString(11));
veiculos.add(this.resultSet.getFloat(12));
}
this.conexao.desconecta();
this.conexao = null;
return veiculos;
}
}
return null;
}catch(SQLException ex){
return null;
}
82
}
public boolean alterarVeiculo(int idVeiculo, String status){
this.conexao = new Conexao();
if (this.conexao.conecta()){
boolean result = this.conexao.atualiza("UPDATE veiculo SET
status = '"+status+"' WHERE idVeiculo = "+idVeiculo+";");
this.conexao.desconecta();
this.conexao = null;
return result;
}
return false;
}
}
private int idVeiculo, ano, numPortas, numPassageiros, quilometragemAtual;
private String modelo, marca, cor, status, categHabilitacao;
private float valorQuilometro, valorDiaria;
private ResultSet resultSet;
private Conexao conexao;
83
CLASSE RESERVA
package locadora;
import java.util.*;
import java.util.StringTokenizer;
import java.sql.*;
import java.sql.SQLException;
public class Reserva{
public Reserva(){}
public Reserva(int idCliente, int idVeiculo, String dataRetirada, String
dataPrevDevolucao){
this.idCliente = idCliente;
this.idVeiculo = idVeiculo;
this.dataRetirada = dataRetirada;
this.dataPrevDevolucao = dataPrevDevolucao;
}
public void setIdReserva(int idReserva){
this.idReserva = idReserva;
}
public int getIdReserva(){
return this.idReserva;
}
public void setQuilometragemRetirada(int quilometragemRetirada){
this.quilometragemRetirada = quilometragemRetirada;
}
public int getQuilometragemRetirada(){
return this.quilometragemRetirada;
}
public void setQuilometragemDevolucao(int quilometragemDevolucao){
this.quilometragemDevolucao = quilometragemDevolucao;
}
public int getQuilometragemDevolucao(){
return this.quilometragemDevolucao;
}
public void setIdVeiculo(int idVeiculo){
this.idVeiculo = idVeiculo;
84
}
public int getIdVeiculo(){
return this.idVeiculo;
}
public void setIdCliente(int idCliente){
this.idCliente = idCliente;
}
public int getIdCliente(){
return this.idCliente;
}
public void setDataReserva(String dataReserva){
this.dataReserva = dataReserva;
}
public String getDataReserva(){
return this.dataReserva;
}
public void setDataRetirada(String dataRetirada){
this.dataRetirada = dataRetirada;
}
public String getDataRetirada(){
return this.dataRetirada;
}
public void setDataPrevDevolucao(String dataPrevDevolucao){
this.dataPrevDevolucao = dataPrevDevolucao;
}
public String getDataPrevDevolucao(){
return this.dataPrevDevolucao;
}
public void setDataDevolucao(String dataDevolucao){
this.dataDevolucao = dataDevolucao;
}
public String getDataDevolucao(){
return this.dataDevolucao;
}
85
public void setStatus(String status){
this.status = status;
}
public String getStatus(){
return this.status;
}
public void setValorQuilometro(float valorQuilometro){
this.valorQuilometro = valorQuilometro;
}
public float getValorQuilometro(){
return this.valorQuilometro;
}
public void setValorDiaria(float valorDiaria){
this.valorDiaria = valorDiaria;
}
public float getValorDiaria(){
return this.valorDiaria;
}
public int adicionarReserva(Reserva reserva){
this.conexao = new Conexao();
String sql = "INSERT INTO reserva
(dataReserva,dataRetirada,dataPrevDevolucao,status,valorQuilometro,valorDiaria,id
Veiculo,idCliente) ";
sql += " VALUES
(NOW(),'"+reserva.getDataRetirada()+"','"+reserva.getDataPrevDevolucao()+"','a
retirar',2.0,100.00,"+reserva.getIdVeiculo()+","+reserva.getIdCliente()+");";
if (this.conexao.conecta()){
boolean result = this.conexao.atualiza(sql);
this.conexao.desconecta();
}
Reserva r =
this.buscarReserva(0,reserva.getIdCliente(),reserva.getIdVeiculo(),reserva.getDataRe
tirada(),reserva.getDataPrevDevolucao());
if (r != null){
return r.getIdReserva();
}
return -1;
}
86
public ArrayList buscarReservas(int idCliente,int idReservaBusca, String
dataInicialReservas, String dataFinalReservas, String status){
this.conexao = new Conexao();
String sql = "";
if (idReservaBusca<=0){
sql += "SELECT * FROM reserva WHERE idCliente =
"+idCliente+" AND dataReserva >= '"+dataInicialReservas+"'";
sql += " AND dataReserva <= '"+dataFinalReservas+"' AND
status = '"+status+"';";
}else{
sql = "SELECT * FROM reserva WHERE idCliente =
"+idCliente+" AND idReserva = "+idReservaBusca+";";
}
if (this.conexao.conecta()){
this.resultSet = this.conexao.consulta(sql);
try{
if (this.resultSet != null){
ArrayList reservas = new ArrayList();
while (this.resultSet.next()){
reservas.add(this.resultSet.getInt(1));
java.sql.Date aux =
this.resultSet.getDate(2);
if (aux!=null){
reservas.add(aux.toString());
}else{
reservas.add("0000-00-00");
}
aux = this.resultSet.getDate(3);
if (aux!=null){
reservas.add(aux.toString());
}else{
reservas.add("0000-00-00");
}
aux = this.resultSet.getDate(4);
if (aux!=null){
reservas.add(aux.toString());
}else{
reservas.add("0000-00-00");
}
aux = this.resultSet.getDate(5);
if (aux!=null){
reservas.add(aux.toString());
}else{
reservas.add("0000-00-00");
}
87
reservas.add(this.resultSet.getInt(6));
reservas.add(this.resultSet.getInt(7));
reservas.add(this.resultSet.getString(8));
reservas.add(this.resultSet.getFloat(9));
reservas.add(this.resultSet.getFloat(10));
reservas.add(this.resultSet.getInt(11));
reservas.add(this.resultSet.getInt(12));
}
this.conexao.desconecta();
return reservas;
}
return null;
}catch(SQLException ex){
ex.printStackTrace();
return null;
}
}
}
return null;
public Reserva buscarReserva(int idReserva, int idCliente, int idVeiculo,
String dataRetirada, String dataPrevDevolucao){
this.conexao = new Conexao();
if (this.conexao.conecta()){
if (idReserva >0){
this.resultSet = this.conexao.consulta("SELECT * FROM
reserva WHERE idReserva = "+idReserva+";");
}else{
this.resultSet = this.conexao.consulta("SELECT * FROM
reserva WHERE idCliente = "+idCliente+" and idVeiculo = "+idVeiculo+" and
dataRetirada = '"+dataRetirada+"' and dataPrevDevolucao =
'"+dataPrevDevolucao+"' and status = 'a retirar';");
}
try{
this.resultSet.getDate(2);
if (this.resultSet != null){
if (this.resultSet.next()){
this.setIdReserva(this.resultSet.getInt(1));
java.sql.Date aux =
if (aux!=null){
this.setDataReserva(aux.toString());
}else{
this.setDataReserva("0000-00-00");
}
88
aux = this.resultSet.getDate(3);
if (aux!=null){
this.setDataRetirada(aux.toString());
}else{
this.setDataRetirada("0000-00-00");
}
aux = this.resultSet.getDate(4);
if (aux!=null){
this.setDataPrevDevolucao(aux.toString());
}else{
this.setDataPrevDevolucao("000000-00");
}
aux = this.resultSet.getDate(5);
if (aux!=null){
this.setDataDevolucao(aux.toString());
}else{
00");
this.setDataDevolucao("0000-00-
}
this.setQuilometragemRetirada(this.resultSet.getInt(6));
this.setQuilometragemDevolucao(this.resultSet.getInt(7));
this.setStatus(this.resultSet.getString(8));
this.setValorQuilometro(this.resultSet.getFloat(9));
this.setValorDiaria(this.resultSet.getFloat(10));
this.setIdVeiculo(this.resultSet.getInt(11));
this.setIdCliente(this.resultSet.getInt(12));
this.conexao.desconecta();
this.conexao = null;
return this;
}
}
return null;
}catch(SQLException ex){
return null;
}
}
return null;
}
89
public boolean alterarReserva(int idReserva, String dataRetirada, String
dataPrevDevolucao){
this.conexao = new Conexao();
if (this.conexao.conecta()){
boolean result = this.conexao.atualiza("UPDATE reserva SET
dataRetirada = '"+dataRetirada+"', dataPrevDevolucao = '"+dataPrevDevolucao+"'
WHERE idReserva = "+idReserva+";");
this.conexao.desconecta();
this.conexao = null;
return result;
}
return false;
}
public boolean cancelarReserva(int idReserva){
this.conexao = new Conexao();
if (this.conexao.conecta()){
boolean result = this.conexao.atualiza("UPDATE reserva SET
status = 'cancelada' WHERE idReserva = "+idReserva+";");
this.conexao.desconecta();
this.conexao = null;
return result;
}
return false;
}
private int idReserva, quilometragemRetirada, quilometragemDevolucao,
idVeiculo, idCliente;
private String dataReserva, dataRetirada, dataPrevDevolucao,
dataDevolucao;
private String status;
private float valorQuilometro, valorDiaria;
private Conexao conexao;
private ResultSet resultSet;
/*public static void main(String args[]){
try{
Reserva r = new Reserva();
ArrayList result = r.buscarReservas(1,null,"2006-05-30","200606-30","a retirar");
if (result!=null){
Object[] resultado = result.toArray();
for (int i=0;i<resultado.length;i++){
System.out.println(resultado[i]);
90
}else{
}
}*/
}
System.out.println("Erro");
}
}catch(Exception ex){
ex.printStackTrace();
}
91
CLASSE CLIENTES
package locadora;
public class Clientes{
public static Cliente buscarCliente(int idCliente, String senha){
Cliente cliente = new Cliente();
return cliente.buscarCliente(idCliente,senha);
}
}
CLASSE VEICULOS
package locadora;
import java.util.*;
public class Veiculos{
public static ArrayList buscarVeiculos(){
Veiculo veiculo = new Veiculo();
return veiculo.buscarVeiculos();
}
}
public static boolean alterarVeiculo(int idVeiculo, String status){
Veiculo veiculo = new Veiculo();
return veiculo.alterarVeiculo(idVeiculo,status);
}
92
CLASSE RESERVAS
package locadora;
import java.util.*;
public class Reservas{
public static int reservarVeiculo(int idCliente, int idVeiculo, String
dataRetirada, String dataPrevDevolucao){
Reserva reserva = new
Reserva(idCliente,idVeiculo,dataRetirada,dataPrevDevolucao);
return reserva.adicionarReserva(reserva);
}
public static ArrayList buscarReservas(int idCliente, int idReserva, String
dataInicialReservas, String dataFinalReservas, String status){
Reserva reserva = new Reserva();
return
reserva.buscarReservas(idCliente,idReserva,dataInicialReservas,dataFinalReservas,s
tatus);
}
public static boolean alterarReserva(int idCliente, int idReserva, String
dataRetirada, String dataPrevDevolucao){
Reserva reserva = new Reserva();
reserva.buscarReserva(idReserva,0,0,"","");
if (reserva.getStatus().equals("a retirar") && (reserva.getIdCliente()
== idCliente)){
return
reserva.alterarReserva(idReserva,dataRetirada,dataPrevDevolucao);
}
return false;
}
public static Reserva cancelarReserva(int idCliente, int idReserva){
Reserva reserva = new Reserva();
reserva.buscarReserva(idReserva,0,0,"","");
if (reserva.getStatus().equals("a retirar") && (reserva.getIdCliente()
== idCliente)){
reserva.cancelarReserva(idReserva);
return reserva;
}
return null;
}
}
93
CLASSE CONEXAO
package locadora;
import java.sql.*;
import java.sql.SQLException;
public class Conexao{
private String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
private String url = "jdbc:odbc:";
private String userName;
private String password;
private Connection con;
private Statement st;
private boolean conectado = false;
public Conexao(){
this.url = this.url + "locadora";
this.userName = "webservice";
this.password = "webservicelocadora";
}
public boolean conecta(){
if (!this.conectado){
try{
Class.forName(driver);
this.con =
DriverManager.getConnection(url,userName,password);
this.st = this.con.createStatement();
this.conectado = true;
}
catch(Exception ex){
return false;
}
}
return true;
}
public boolean desconecta(){
if (this.conectado){
try{
this.st.close();
this.con.close();
this.conectado = false;
}
catch(SQLException ex){
94
}
}
return false;
}
return true;
public boolean atualiza(String q){
try{
this.st.executeUpdate(q);
return true;
}
catch(SQLException ex){
return false;
}
}
}
public ResultSet consulta(String q){
try{
return this.st.executeQuery(q);
}
catch(SQLException ex){
return null;
}
}
95
INTERFACE LOCADORAIF
package locadora;
import java.rmi.*;
import java.rmi.RemoteException;
import java.util.*;
public interface LocadoraIF extends Remote{
public Object[] buscarVeiculos(int idCliente, String senha) throws
RemoteException;
public int reservarVeiculo(int idCliente, String senha, int idVeiculo, String
dataRetirada, String dataPrevDevolucao) throws RemoteException;
public Object[] buscarReservas(int idCliente, String senha, int idReserva,
String dataInicialReservas, String dataFinalReservas, String status) throws
RemoteException;
public boolean alterarReserva(int idCliente, String senha, int idReserva,
String dataRetirada, String dataPrevDevolucao) throws RemoteException;
public boolean cancelarReserva(int idCliente, String senha, int idReserva)
throws RemoteException;
}
96
CLASSE LOCADORAIMPL
package locadora;
import java.rmi.*;
import java.rmi.RemoteException;
import java.util.*;
public class LocadoraImpl implements LocadoraIF{
public LocadoraImpl(){
}
public Object[] buscarVeiculos(int idCliente, String senha) throws
RemoteException{
Cliente cliente = Clientes.buscarCliente(idCliente,senha);
if (cliente != null){
if (cliente.getStatus().equals("ativo")){
return Veiculos.buscarVeiculos().toArray();
}
}
return null;
}
public int reservarVeiculo(int idCliente, String senha, int idVeiculo, String
dataRetirada, String dataPrevDevolucao) throws RemoteException{
Cliente cliente = Clientes.buscarCliente(idCliente,senha);
if (cliente != null){
if (cliente.getStatus().equals("ativo")){
if (Veiculos.alterarVeiculo(idVeiculo,"reservado")){
return
Reservas.reservarVeiculo(idCliente,idVeiculo,dataRetirada,dataPrevDevolucao);
}
}
}
return -1;
}
public Object[] buscarReservas(int idCliente, String senha, int idReserva,
String dataInicialReservas, String dataFinalReservas, String status) throws
RemoteException{
Cliente cliente = Clientes.buscarCliente(idCliente,senha);
if (cliente != null){
return
Reservas.buscarReservas(idCliente,idReserva,dataInicialReservas,dataFinalReservas
,status).toArray();
}
return null;
}
97
public boolean alterarReserva(int idCliente, String senha, int idReserva,
String dataRetirada, String dataPrevDevolucao) throws RemoteException{
Cliente cliente = Clientes.buscarCliente(idCliente,senha);
if (cliente != null){
if (cliente.getStatus().equals("ativo")){
return
Reservas.alterarReserva(idCliente,idReserva,dataRetirada,dataPrevDevolucao);
}
}
return false;
}
public boolean cancelarReserva(int idCliente, String senha, int idReserva)
throws RemoteException{
Cliente cliente = Clientes.buscarCliente(idCliente,senha);
if (cliente != null){
if (cliente.getStatus().equals("ativo")){
Reserva reserva =
Reservas.cancelarReserva(idCliente,idReserva);
if (reserva != null){
return
Veiculos.alterarVeiculo(reserva.getIdVeiculo(),"disponível");
}
}
}
return false;
}
}
98
ARQUIVOS XML UTILIZADOS PELOS APLICATIVOS WSCOMPILE, JAR E
WSDEPLOY
Config-interface.xml
1. <?xml version="1.0" encoding="UTF-8"?>
2. <configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
3. <service
name="Locadora"
targetNamespace="urn:Foo"
typeNamespace="urn:Foo"
4. packageName="locadora">
5. <interface name="locadora.LocadoraIF"/>
6. </service>
7. </configuration>
Jaxrpc-ri.xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?xml version="1.0" encoding="UTF-8"?>
<webServices
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/dd"
version="1.0"
targetNamespaceBase="urn:Foo"
typeNamespaceBase="urn:Foo"
urlPatternBase="/ws">
<endpoint
name="Locadora"
display-name="Servico Locadora"
description="Web Service de uma Locadora de Veiculos usando JAX-RPC."
interface="locadora.LocadoraIF"
model="/WEB-INF/model.gz"
implementation="locadora.LocadoraImpl"/>
<endpointMapping
endpointName="Locadora"
urlPattern="/locadora"/>
</webServices>
99
Web.xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<display-name>Servico Locadora</display-name>
<description>Web Service de uma Locadora de Veiculos usando
JAX-RPC.</description>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
100
ANEXO III: IMPLEMENTAÇÃO DA APLICAÇÃO CLIENTE
INDEX.PHP
<html>
<head>
<title>HOTEL - Página Inicial</title>
</head>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136">
<table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a
href="reserva_hospedagem.php?flag=hospedagem">Reservar Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a
href="reserva_veiculo.php?flag=veiculo">Reservar Veículo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_apto.php?flag=buscaa">Buscar Reserva Apto</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_veiculo.php?flag=buscav">Buscar Reserva Veiculo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="cadastrar_cliente.php?flag=cliente">Cadastrar Cliente</a></h5></td>
</tr>
</table>
</td>
<td width="645">&nbsp;</td>
</tr>
</table>
</center>
</body>
</html>
RESERVA_HOSPEDAGEM.PHP
101
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>HOTEL - Reservar Hospedagem</title>
<style type="text/css">
<!-.style1 {font-family: Verdana, Arial, Helvetica, sans-serif}
-->
</style>
</head>
<body>
<center>
<table width="791" height="550" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136">
<table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a
href="reserva_hospedagem.php?flag=hospedagem">Reservar Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a
href="reserva_veiculo.php?flag=veiculo">Reservar Veículo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_apto.php?flag=buscaa">Buscar Reserva Apto</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_veiculo.php?flag=buscav">Buscar Reserva Veiculo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="cadastrar_cliente.php?flag=cliente">Cadastrar Cliente</a></h5></td>
</tr>
</table>
<td width="645">
<h2 align="center">RESERVA DE HOSPEDAGEM</h2><br><br>
<form id="form1" name="form1" method="post"
action="buscar_idcliente.php?flag=hospedagem">
<label>CPF do Cliente:
102
<input type="text" name="cpf" tabindex="0" />
</label>
<label>Localizar
<input type="submit" name="Submit" value="Submit" tabindex="1" />
</label>
</form>
<p align="center"><a href="cadastrar_cliente.php?flag=cliente">Cliente Não Cadastrado?
Cadastrar</a></p>
</td>
</tr>
</table>
</center>
</body>
</html>
103
BUSCAR_IDCLIENTE.PHP
<?php
$host="localhost";
$user="aplicacaoweb";
$password="aplicacaowebhotel";
$database="hotel";
mysql_connect($host,$user,$password);
mysql_select_db($database);
$sql=stripSlashes("select idCliente from cliente where cpf = \"".$_POST['cpf']."\"");
$result=mysql_query($sql);
if (!$result){
echo("<a href=\"javascript:window.location='index.php'\">Página
Inicial</a>");
}else{
$quantLinhas = mysql_num_rows($result);
if ($quantLinhas>0){
$id=mysql_result($result,0);
$id=(int)$id;
$flag=$_GET['flag'];
if (!strcmp($flag,"hospedagem")){
?>
<script language="javascript">
<?php
echo("window.location=\"inserir_reserva_hospedagem.php?idCliente=".$id."\"");
?>
</script>
<?php
}else{
if (!strcmp($flag,"veiculo")){
?>
<script language="javascript"> <?php
echo("window.location=\"veiculos.php?idCliente=".$id."\"");
?>
</script>
<?php
}else{
if (!strcmp($flag,"buscaa")){
?>
<script language="javascript"> <?php
echo("window.location=\"reservasa.php?idCliente=".$id."\"");
?>
</script>
<?php
}else{
if (!strcmp($flag,"buscav")){
?>
104
<script language="javascript"> <?php
echo("window.location=\"reservasv.php?idCliente=".$id."\"");
?>
</script>
<?php
}else{
?>
<script language="javascript"> <?php
echo("window.location=\"index.php\"");
}else{
?>
}
}
}
?>
</script>
<?php
}
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><center><h2>HOTEL</h2></center></td>
</tr>
<tr>
<td width="136"><table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a href="reserva_hospedagem.php">Reserva de
Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a href="reserva_veiculo.php">Reserva de
Veículos</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="buscar_reserva.php?flag=busca">Buscar
Reserva</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="cadastrar_cliente.php">Cadastrar
Cliente</a></h5></td>
</tr>
</table></td>
<td width="645"><?php
105
echo("<center><h2>RESERVA DE
HOSPEDAGEM</h2></center><br>");
echo("<center>Cliente não cadastrado!</center><br>");
echo("<center><a
href=\"javascript:window.location='cadastrar_cliente.php?flag=cliente'\">Cadastrar
Cliente</a></center>");
?></td>
</tr>
</table>
</center>
</body> <?php
}
}
?>
106
INSERIR_RESERVA_HOSPEDAGEM.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>HOTEL - Página Inicial</title>
<style type="text/css">
<!-.style1 {font-family: Verdana, Arial, Helvetica, sans-serif}
-->
</style>
</head>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136">
<table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a
href="reserva_hospedagem.php?flag=hospedagem">Reservar Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a
href="reserva_veiculo.php?flag=veiculo">Reservar Veículo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_apto.php?flag=buscaa">Buscar Reserva Apto</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_veiculo.php?flag=buscav">Buscar Reserva Veiculo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="cadastrar_cliente.php?flag=cliente">Cadastrar Cliente</a></h5></td>
</tr>
</table>
</td>
<td width="645">
<form id="form1" name="form1" method="post"
action="inserir_hospedagem.php?idCliente=<?php echo ($_GET['idCliente']); ?>">
107
<table border="1"><tr><td><p align="left"><label>Data de
Chegada:</label></p></td><td><p align="left"><input type="text" name="dataChegada"
tabindex="0" /></p></td></tr>
<tr><td><p align="left"><label>Data de Saída:</label></p></td><td><p
align="left"><label><input type="text" name="dataSaida" tabindex="1" /></td></tr>
<tr><td><p align="left"><label>Quantidade de
Adultos:</label></p></td><td><p align="left"><label><input type="text"
name="numAdultos" tabindex="2" /></td></tr>
<tr><td><p align="left"><label>Quantidade de Crianças (&lt; 2
anos):</label></p></td><td><p align="left"><label><input type="text"
name="numCriancas" tabindex="3" /></td></tr>
<tr><td><p align="center"><label><input name="tipoApartamento"
type="radio" value="1" /></label></p></td><td><p align="left"><label>Suíte de Luxo Ideal para 2 Adultos</label></p></td></tr>
<tr><td><p align="center"><label><input name="tipoApartamento"
type="radio" value="2" /></label></p></td><td><p align="left"><label>Suíte de Luxo Ideal para Casal</label></p></td></tr>
<tr><td><p align="center"><label><input name="tipoApartamento"
type="radio" value="3" tabindex="4" /></label></p></td><td><p
align="left"><label>Suíte de Luxo - Ideal para Casal e 1 Criança (&lt; 2
anos)</label></td></tr>
<tr><td><p align="center"><label><input name="tipoApartamento"
type="radio" value="4" tabindex="5" /></label></p></td><td><p
align="left"><label>Suíte de Luxo - Ideal para Casal e 1 Criança (&gt; 2 anos)</label>
</td></tr>
<tr><td><p align="center"><label><input name="tipoApartamento"
type="radio" value="5" /></label></p></td><td><p align="left"><label>Suíte Standard Ideal para 2 Adultos</label></td></tr>
<tr><td><p align="center"><label><input name="tipoApartamento"
type="radio" value="6" /></label></p></td><td><p align="left"><label>Suíde Standard Ideal para Casal</label></td></tr>
<tr><td><p align="center"><label><input name="tipoApartamento"
type="radio" value="7" tabindex="6" /></label></p></td><td><p
align="left"><label>Suíte Standard - Ideal para 2 Adultos e 1 Crinça (&lt; 2
anos)</label></td></tr>
<tr><td><p align="center"><label><input name="tipoApartamento"
type="radio" value="8" /></label></p></td><td><p align="left"><label>Suíte Standard Ideal para 2 Adultos e 1 Criança (&gt; 2 anos)</label></td></tr>
<tr><td>&nbsp;</td><td><input type="submit" name="Submit"
value="Concluir" /></td><tr>
</form>
</td>
</tr>
</table>
</center>
</body>
</html>
108
INSERIR_HOSPEDAGEM.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<?php
$host="localhost";
$user="aplicacaoweb";
$password="aplicacaowebhotel";
$database="hotel";
$idHost=mysql_connect($host,$user,$password);
if ($idHost){
$idDb=mysql_select_db($database,$idHost);
}
$sql=stripSlashes("insert into reservaapto values
(null,".$_GET['idCliente'].",\"".$_POST['tipoApartamento']."\",NOW(),\"".$_POST['data
Chegada']."\",\"".$_POST['dataSaida']."\",150,".$_POST['numAdultos'].",".$_POST['num
Criancas'].",'reservada')");
$result=mysql_query($sql);
if ($result>0){
echo "<h3>Reserva realizada!</h3>";
}else{
echo ("<h3>Reserva não realizada!</h3>");
echo(mysql_error($idHost));
}
?>
</body>
</html>
109
RESERVA_VEICULO.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>HOTEL - Reserva de Veículo</title>
<style type="text/css">
<!-.style1 {font-family: Verdana, Arial, Helvetica, sans-serif}
-->
</style>
</head>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136">
<table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a
href="reserva_hospedagem.php?flag=hospedagem">Reservar Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a
href="reserva_veiculo.php?flag=veiculo">Reservar Veículo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_apto.php?flag=buscaa">Buscar Reserva Apto</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_veiculo.php?flag=buscav">Buscar Reserva Veiculo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="cadastrar_cliente.php?flag=cliente">Cadastrar Cliente</a></h5></td>
</tr>
</table>
<td width="645">
<h2 align="center">RESERVA DE VEÍCULO</h2><br><br>
<form id="form1" name="form1" method="post"
action="buscar_idcliente.php?flag=veiculo">
110
<label>CPF do Cliente:
<input type="text" name="cpf" tabindex="0" />
</label>
<label>Localizar
<input type="submit" name="Submit" value="Submit" tabindex="1" />
</label>
</form>
<p align="center"><a href="cadastrar_cliente.php?flag=cliente">Cliente Não Cadastrado?
Cadastrar</a></p>
</td>
</tr>
</table>
<center>
</body>
</html>
111
VEICULOS.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136"><table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a href="reserva_hospedagem.php">Reserva de
Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a href="reserva_veiculo.php">Reserva de
Veículos</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="buscar_reserva.php?flag=busca">Buscar
Reserva</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="cadastrar_cliente.php">Cadastrar
Cliente</a></h5></td>
</tr>
</table></td>
<td width="645">
<?php
$client = new SoapClient("http://localhost:8080/Locadora/locadora?WSDL");
$veiculos = ($client->buscarVeiculos(1,"senha1"));
if (count($veiculos)<=0){
echo("Não existem veículos disponíveis para reserva!");
}else{
echo("<form id='form1' name='form1' method='post'
action='inserir_reserva_veiculo.php?idCliente=".$_GET['idCliente']."'>");
echo("<table border='1'><tr><td></td><td></td></tr>");
112
echo("<tr><td>Data de Chegada:</td><td><input type='text'
name='dataRetirada' tabindex='0' /></td></tr>");
echo("<tr><td>Data de Sa&iacute;da:</td><td><input type='text'
name='dataPrevDevolucao' tabindex='1' /></td></tr>");
for ($i=0;$i<count($veiculos);$i=$i+12){
echo("<tr><td><input name='idVeiculo' type='radio'
value='".$veiculos[0]."'/></td><td>");
echo("<table><tr><td><p align='left'>Modelo:</p></td><td><p
align='left'>".$veiculos[$i+1]."</p></td></tr>");
echo("<tr><td><p align='left'>Marca:</p></td><td><p
align='left'>".$veiculos[$i+2]."</p></td></tr>");
echo("<tr><td><p align='left'>Cor:</p></td><td><p
align='left'>".$veiculos[$i+3]."</p></td></tr>");
echo("<tr><td><p align='left'>Ano:</p></td><td><p
align='left'>".$veiculos[$i+4]."</p></td></tr>");
echo("<tr><td><p align='left'>Portas:</p></td><td><p
align='left'>".$veiculos[$i+5]."</p></td></tr>");
echo("<tr><td><p align='left'>Passageiros:</p></td><td><p
align='left'>".$veiculos[$i+6]."</p></td></tr>");
echo("<tr><td><p align='left'>Habilitação:</p></td><td><p
align='left'>".$veiculos[$i+7]."</p></td></tr>");
echo("<tr><td><p align='left'>Valor Quilômetro
Adicional:</p></td><td><p align='left'>".$veiculos[$i+9]."</p></td></tr>");
echo("<tr><td><p align='left'>Valor Diária:</p></td><td><p
align='left'>".$veiculos[$i+11]."</p></td></tr></table></td></tr>");
}
echo("<tr><td>&nbsp;</td><td><input type='submit' name='Submit'
value='Concluir' /></td></tr></table></form>");
}
?>
</td>
</tr>
</table>
</center>
</body>
</body>
</html>
113
INSERIR_RESERVA_VEICULO.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>HOTEL - Página Inicial</title>
<style type="text/css">
<!-.style1 {font-family: Verdana, Arial, Helvetica, sans-serif}
-->
</style>
</head>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136"><table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a
href="reserva_hospedagem.php?flag=hospedagem">Reservar Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a href="reserva_veiculo.php?flag=veiculo">Reservar
Veículo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="buscar_reserva.php?flag=busca">Buscar
Reserva</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="cadastrar_cliente.php?flag=cliente">Cadastrar
Cliente</a></h5></td>
</tr>
</table></td>
<td width="645">
<?php
$client = new SoapClient("http://localhost:8080/Locadora/locadora?WSDL");
$aux = (int) $_POST['idVeiculo'];
$reserva = $client>reservarVeiculo(1,"senha1",$aux,$_POST['dataRetirada'],$_POST['dataPrevDevolucao']);
114
if ($reserva>0){
echo("Reserva Realizada!");
$host="localhost";
$user="aplicacaoweb";
$password="aplicacaowebhotel";
$database="hotel";
$idHost=mysql_connect($host,$user,$password);
if ($idHost){
$idDb=mysql_select_db($database,$idHost);
}
$reserva = (int) $reserva;
$id = $_GET['idCliente'];
$id = (int) $id;
$insercao = "insert into reservaauto values (".$reserva.",".$id.",'a retirar')";
$query = mysql_query($insercao,$idHost);
if ($query>0){
echo "<br>Banco de dados do cliente ok.";
}else{
echo "<br>Banco de dados do cliente não atualizado. Erro:
".mysql_error($idHost);
}
}else{
echo("Reserva Não Realizada!");
}
?>
</td>
</tr>
</table>
</center>
</body>
</html>
115
BUSCAR_RESERVA_APTO.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>HOTEL - Reserva de Veículo</title>
<style type="text/css">
<!-.style1 {font-family: Verdana, Arial, Helvetica, sans-serif}
-->
</style>
</head>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136">
<table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a
href="reserva_hospedagem.php?flag=hospedagem">Reservar Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a
href="reserva_veiculo.php?flag=veiculo">Reservar Veículo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_apto.php?flag=buscaa">Buscar Reserva Apto</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_veiculo.php?flag=buscav">Buscar Reserva Veiculo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="cadastrar_cliente.php?flag=cliente">Cadastrar Cliente</a></h5></td>
</tr>
</table>
<td width="645">
<h2 align="center">BUSCA DE RESERVA DE APARTAMENTO</h2><br><br>
<form id="form1" name="form1" method="post"
action="buscar_idcliente.php?flag=buscaa">
116
<label>CPF do Cliente:
<input type="text" name="cpf" tabindex="0" />
</label>
<label>Localizar
<input type="submit" name="Submit" value="Submit" tabindex="1" />
</label>
</form>
<p align="center"><a href="cadastrar_cliente.php?flag=cliente">Cliente Não Cadastrado?
Cadastrar</a></p>
</td>
</tr>
</table>
<center>
</body>
</html>
117
RESERVASA.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136"><table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a href="reserva_hospedagem.php">Reserva de
Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a href="reserva_veiculo.php">Reserva de
Veículos</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="buscar_reserva.php?flag=busca">Buscar
Reserva</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="cadastrar_cliente.php">Cadastrar
Cliente</a></h5></td>
</tr>
</table></td>
<td width="645">
<?php
$host="localhost";
$user="aplicacaoweb";
$password="aplicacaowebhotel";
$database="hotel";
mysql_connect($host,$user,$password);
mysql_select_db($database);
$consulta_reserva_apto="select cliente.nome, tipoapartamento.descricao,
reservaapto.dataReserva, reservaapto.dataChegada, reservaapto.dataSaida,
reservaapto.valorDiaria, reservaapto.numAdultos, reservaapto.numCriancas from cliente,
118
reservaapto, tipoapartamento where cliente.idCliente=".$_GET['idCliente']." and
cliente.idCliente = reservaapto.idCliente and reservaapto.idTipoApto =
tipoapartamento.idTipo and (not reservaapto.status='finalizada')";
$sql=stripSlashes($consulta_reserva_apto);
$result=mysql_query($sql);
if (!$result){
echo("Erro na consulta!");
echo("<a href=\"javascript:window.location='index.php'\">Página
Inicial</a>");
}else{
$quantLinhas = mysql_num_rows($result);
if ($quantLinhas>0){
$id=mysql_fetch_row($result);
echo("<form id='form1' name='form1' method='post' action=''>");
echo("<table
border='1'><tr>&nbsp;<td></td><td><center><h3>Reservas
Localizadas</h3></center></td></tr>");
while ($id){
echo("<tr><td>Nome:</td><td>".$id[0]."</td></tr>");
echo("<tr><td>Apartamento:</td><td>".$id[1]."</td></tr>");
echo("<tr><td>Data da
Reserva:</td><td>".$id[2]."</td></tr>");
echo("<tr><td>Data de
Chegada:</td><td>".$id[3]."</td></tr>");
echo("<tr><td>Data de
Saída:</td><td>".$id[4]."</td></tr>");
echo("<tr><td>Valor da
Diária:</td><td>".$id[5]."</td></tr>");
echo("<tr><td>Número de
Adultos:</td><td>".$id[6]."</td></tr>");
echo("<tr><td>Número de
Crianças:</td><td>".$id[7]."</td></tr>");
$id=mysql_fetch_row($result);
}
echo("<tr><td>&nbsp;</td><td><input type='submit'
name='Submit' value='Concluir' /></td></tr></table></form>");
}else{
echo("Nenhuma reserva encontrada!");
}
}
?>
</td>
</tr>
</table>
</center>
</body>
</body>
</html>
119
BUSCAR_RESERVA_VEICULO.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>HOTEL - Reserva de Veículo</title>
<style type="text/css">
<!-.style1 {font-family: Verdana, Arial, Helvetica, sans-serif}
-->
</style>
</head>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136">
<table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a
href="reserva_hospedagem.php?flag=hospedagem">Reservar Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a
href="reserva_veiculo.php?flag=veiculo">Reservar Veículo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_apto.php?flag=buscaa">Buscar Reserva Apto</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_veiculo.php?flag=buscav">Buscar Reserva Veiculo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="cadastrar_cliente.php?flag=cliente">Cadastrar Cliente</a></h5></td>
</tr>
</table>
<td width="645">
<h2 align="center">BUSCA DE RESERVA DE VEÍCULO</h2><br><br>
<form id="form1" name="form1" method="post"
action="buscar_idcliente.php?flag=buscav">
120
<label>CPF do Cliente:
<input type="text" name="cpf" tabindex="0" />
</label>
<label>Localizar
<input type="submit" name="Submit" value="Submit" tabindex="1" />
</label>
</form>
<p align="center"><a href="cadastrar_cliente.php?flag=cliente">Cliente Não Cadastrado?
Cadastrar</a></p>
</td>
</tr>
</table>
<center>
</body>
</html>
121
RESERVASV.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136"><table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a href="reserva_hospedagem.php">Reserva de
Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a href="reserva_veiculo.php">Reserva de
Veículos</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="buscar_reserva.php?flag=busca">Buscar
Reserva</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="cadastrar_cliente.php">Cadastrar
Cliente</a></h5></td>
</tr>
</table></td>
<td width="645">
<?php
$host="localhost";
$user="aplicacaoweb";
$password="aplicacaowebhotel";
$database="hotel";
mysql_connect($host,$user,$password);
mysql_select_db($database);
$consulta_reserva_auto="select idReservaAuto from reservaauto where idCliente
=".$_GET['idCliente']." and status='a retirar'";
$sql=stripSlashes($consulta_reserva_auto);
122
$result=mysql_query($sql);
if (!$result){
echo("Erro na consulta!");
echo("<a href=\"javascript:window.location='index.php'\">Página
Inicial</a>");
}else{
$quantLinhas = mysql_num_rows($result);
if ($quantLinhas>0){
$id=mysql_fetch_row($result);
while($id){
$client = new
SoapClient("http://localhost:8080/Locadora/locadora?WSDL");
$reservas = ($client>buscarReservas(1,"senha1",$id[0],"","","a retirar"));
if (count($reservas)<=0){
echo("Não existem reservas a retirar!");
}else{
echo("<table
border='1'><tr>&nbsp;<td></td><td><center><h3>Reservas de Veículos
Localizadas</h3></center></td></tr>");
for ($i=0;$i<count($reservas);$i+=12){
$idReserva=$reservas[$i];
echo("<tr><td>Data da
Reserva:</td><td>".$reservas[$i+1]."</td></tr>");
$dataRetirada=$reservas[$i+2];
echo("<tr><td>Data
Retirada:</td><td>".$dataRetirada."</td></tr>");
$dataPrevDevolucao=$reservas[$i+3];
echo("<tr><td>Data Prevista para
Devolução:</td><td>".$dataPrevDevolucao."</td></tr>");
echo("<tr><td>Data de
Devolução:</td><td>".$reservas[$i+4]."</td></tr>");
echo("<tr><td>Quilometragem
Retirada:</td><td>".$reservas[$i+5]."</td></tr>");
echo("<tr><td>Quilometragem
Devolução:</td><td>".$reservas[$i+6]."</td></tr>");
echo("<tr><td>Status:</td><td>".$reservas[$i+7]."</td></tr>");
echo("<tr><td>Valor do
Quilometro:</td><td>".$reservas[$i+8]."</td></tr>");
echo("<tr><td>Valor da
Diária:</td><td>".$reservas[$i+9]."</td></tr>");
echo("<tr><td>Identificador do
Veículo:</td><td>".$reservas[$i+10]."</td></tr>");
echo("<tr><td>Identificador do
Cliente:</td><td>".$reservas[$i+11]."</td></tr>");
echo("<tr><td><a
href='cancelar_reserva.php?idReserva=".$idReserva."'>Cancelar</a></td><td><a
href='alterar_reserva.php?idReserva=".$idReserva."&dataRetirada=".$dataRetirada."&da
taPrevDevolucao=".$dataPrevDevolucao."'>Alterar</a></td></tr>");
123
}
}else{
?>
}
}
}
echo("</table>");
}
$id=mysql_fetch_row($result);
echo("Nenhuma reserva encontrada!");
</td>
</tr>
</table>
</center>
</body>
</body>
</html><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
</body>
</html>
124
CANCELAR_RESERVA.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136"><table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a href="reserva_hospedagem.php">Reserva de
Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a href="reserva_veiculo.php">Reserva de
Veículos</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="buscar_reserva.php?flag=busca">Buscar
Reserva</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="cadastrar_cliente.php">Cadastrar
Cliente</a></h5></td>
</tr>
</table></td>
<td width="645">
?>
<?php
$client = new SoapClient("http://localhost:8080/Locadora/locadora?WSDL");
$cancelar = ($client->cancelarReserva(1,"senha1",$_GET['idReserva']));
if (!$cancelar){
echo("Não foi possível cancelar a reserva!");
}else{
echo("Reserva cancelada!");
}
125
</td>
</tr>
</table>
</center>
</body>
</body>
</html>
126
ALTERAR_RESERVA.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136"><table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a href="reserva_hospedagem.php">Reserva de
Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a href="reserva_veiculo.php">Reserva de
Veículos</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="buscar_reserva.php?flag=busca">Buscar
Reserva</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="cadastrar_cliente.php">Cadastrar
Cliente</a></h5></td>
</tr>
</table></td>
<td width="645">
<form name="form1" method="post"
action="alterar_reserva_ws.php?idReserva=<?php echo($_GET['idReserva'])?>">
<label>Data de Retirada: </label><input type="text" name="dataRetirada"
value=<?php echo($_GET['dataRetirada'])?> />
<label>Data Prevista Para Devolução: </label><input type="text"
name="dataPrevDevolucao" value=<?php echo($_GET['dataPrevDevolucao'])?> />
<input type="submit" name="Submit" value="Alterar"/>
</form>
</td>
</tr>
</table>
127
</center>
</body>
</body>
</html>
128
ALTERAR_RESERVA_WS.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136"><table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a href="reserva_hospedagem.php">Reserva de
Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a href="reserva_veiculo.php">Reserva de
Veículos</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="buscar_reserva.php?flag=busca">Buscar
Reserva</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a href="cadastrar_cliente.php">Cadastrar
Cliente</a></h5></td>
</tr>
</table></td>
<td width="645">
<?php
$client = new SoapClient("http://localhost:8080/Locadora/locadora?WSDL");
$alterar = ($client>alterarReserva(1,"senha1",$_GET['idReserva'],$_POST['dataRetirada'],$_POST['dataPre
vDevolucao']));
if (!$alterar){
echo("Não foi possível alterar a reserva!");
}else{
echo("Reserva alterada!");
}
129
?>
</td>
</tr>
</table>
</center>
</body>
</body>
</html>
130
CADASTRAR_CLIENTE.PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>HOTEL - Cadastrar Cliente</title>
<style type="text/css">
<!-.style1 {font-family: Verdana, Arial, Helvetica, sans-serif}
-->
</style>
</head>
<body>
<center>
<table width="791" height="587" border="0">
<tr>
<td colspan="2"><h3><h2>HOTEL</h3></td>
</tr>
<tr>
<td width="136">
<table width="137" height="222" border="0">
<tr>
<td height="48"><h5><a
href="reserva_hospedagem.php?flag=hospedagem">Reservar Hospedagem</a></h5></td>
</tr>
<tr>
<td height="43"><h5><a
href="reserva_veiculo.php?flag=veiculo">Reservar Veículo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_apto.php?flag=busca">Buscar Reserva Apto</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="buscar_reserva_veiculo.php?flag=busca">Buscar Reserva Veiculo</a></h5></td>
</tr>
<tr>
<td height="42"><h5><a
href="cadastrar_cliente.php?flag=cliente">Cadastrar Cliente</a></h5></td>
</tr>
</table>
<td width="645">
<h2>CADASTRO DE CLIENTE</h2><br><br>
<form id="form1" name="form1" method="post" action="">
<table>
131
/></td></tr>
/></td></tr>
/></td></tr>
<tr><td>CPF:</td><td><input type="text" name="cpf" tabindex="0"
<tr><td>Nome:</td><td><input type="text" name="nome" tabindex="1"
<tr><td>E-mail:</td><td><input type="text" name="email" tabindex="3"
<tr><td>Endereço:</td><td><input type="text" name="endereco"
tabindex="4" /></td></tr>
<tr><td>Complemento:</td><td><input type="text" name="complemento"
tabindex="5" /></td></tr>
<tr><td>Cidade:</td><td><input type="text" name="cidade" tabindex="6"
/></td></tr>
<tr><td>UF:</td><td><input type="text" name="uf" tabindex="7"
/></td></tr>
<tr><td>CEP:</td><td><input type="text" name="cep" tabindex="8"
/></td></tr>
<tr><td>Bairro:</td><td><input type="text" name="bairro" tabindex="9"
/></td></tr>
<tr><td>Telefone:</td><td><input type="text" name="telefone"
tabindex="10" /></td></tr>
<tr><td>&nbsp;</td><td><input type="submit" name="submit"
value="Confirmar" tabindex="11" /></td></tr>
</table>
</form>
</td>
</tr>
</table>
</center>
</body>
</html>
Download

Implementação de um Web Service para uma