Você está na página 1de 93

Implementando Servios Web

MO818 Tpicos em Redes de Computadores


Prof. Dr. Edmundo Madeira
Instituto de Computao - Unicamp

27/9/2005 Francisco Hoyos 1


Tpicos
Introduo
Alguns conceitos de .NET
Servios web na plataforma .NET
Servios web na plataforma J2EE
Comparao J2EE x .NET
Consideraes finais
Referncias
27/9/2005 Francisco Hoyos 2
Introduo
J2EE e .NET so duas das principais
plataformas para desenvolvimento,
execuo e consumo de servios web.
No que consiste o suporte ao usurio e
desenvolvedor de servios web nessas
plataformas?
Qual ambiente de execuo elas
oferecem aos servios?

27/9/2005 Francisco Hoyos 3


.NET: Definio
.NET a estratgia da Microsoft para conectar
sistemas, informao e dispositivos atravs de web
services para que as pessoas possam colaborar e
comunicar-se mais efetivamente.
A Microsoft oferece uma completa gama de software
que ajuda organizaes e indivduos a se
beneficiarem da conectividade baseada em web
services: ferramentas de desenvolvimento Visual
Studio .NET, Windows Server System que hospeda
web services e aplicaes para desktop como Office,
que consomem web services.

27/9/2005 Francisco Hoyos 4


.NET: Origens
Em outubro de 2000, Microsoft, HP e
Intel submeteram as especificaes da
linguagem C# e da Common Language
Infrastructure (CLI) ECMA (European
Computer Manufacturers Association)
para padronizao.
Em dezembro de 2001 ambas foram
aprovadas pela ECMA e em 2003 pela
ISO.

27/9/2005 Francisco Hoyos 5


.NET: Common Language
Infrastructure
A CLI inclui:
Common Intermediate Language (CIL)
linguagem independente de plataforma
Common Type System (CTS)
conjunto de tipos e operaes compartilhados
por vrias linguagens de programao
Common Language Specification (CLS)
toda linguagem de programao .NET-
compliant deve atender a essa especificao

27/9/2005 Francisco Hoyos 6


.NET: Plataforma

O .NET Framework composto pelo


Common Language Runtime e a .NET
Framework class library.
Enterprise Servers incluem SQL Server,
Exchange Server, BizTalk, Commerce Server.
27/9/2005 Francisco Hoyos 7
.NET: CLR
O CLR a implementao Microsoft da
especificao CLI.
Quando uma aplicao .NET executada, o
CLR gerencia o carregamento e a execuo
do cdigo e prov vrios servios runtime
aplicao, como: gerenciamento de memria
(garbage collection), de threads e de
segurana.

27/9/2005 Francisco Hoyos 8


.NET: execuo de cdigo nativo

Aplicaes .NET so compiladas para


MSIL (Microsoft Intermediate Language,
o mesmo que CIL).
Quando a aplicao executada pela
primeira vez, o runtime faz uma
compilao just-in-time para converter
o cdigo MSIL para cdigo de mquina.

27/9/2005 Francisco Hoyos 9


.NET: execuo no CLR

27/9/2005 Francisco Hoyos 10


.NET: CLS
A CLS (Common Language Specification)
define um conjunto de tipos de dados que
podem ser usados por qualquer linguagem
.NET-compliant. Isso permite completa
integrao entre aplicaes desenvolvidas em
linguagens diferentes:
um tipo definido em uma linguagem pode ser
herdado em outra linguagem
excees podem ser lanadas de uma linguagem e
capturadas em uma outra

27/9/2005 Francisco Hoyos 11


.NET: managed/unmanaged code

Cdigo feito para .NET chamado


managed code e pode dispor dos
servios oferecidos pelo runtime .NET.
Qualquer outro cdigo chamado
unmanaged code, pode ser executado
pelo CLR, mas no tem acesso aos
servios deste.

27/9/2005 Francisco Hoyos 12


.NET: Framework Class Library
Pode ser dividida em quatro grupos:
Base Class Library (BCL): funcionalidades comuns
(ex: tipos de dados core)
ADO.NET e XML: acesso e manipulao de dados
(tipicamente obtidos de um banco de dados);
converso dos dados para XML
Windows Forms: desenvolvimento de aplicaes
Windows tradicionais para desktop (controls)
ASP.NET: desenvolvimento de aplicaes web

27/9/2005 Francisco Hoyos 13


ASP.NET
Sucessor da tecnologia Active Server Pages.
Simplificao do processo de
desenvolvimento de servios web.
Modelo web forms para desenvolvimento de
interfaces para web browser. Controls
presentes nas web forms executam no
servidor e no no cliente. Look and feel
muito semelhante ao das Windows forms.

27/9/2005 Francisco Hoyos 14


ASP.NET
Pginas com extenso .aspx.
Quando um browser requisita uma pgina
aspx, o runtime ASP.NET compila o
contedo numa classe .NET. A partir da essa
classe processa os acessos pgina original.
A lgica do programa pode ser fisicamente
separada do HTML da pgina atravs da
tcnica code-behind.

27/9/2005 Francisco Hoyos 15


.NET Web Services
Um dos principais focos da plataforma
.NET.
Classes .NET pr-existentes podem ter
seus mtodos facilmente expostos
como servios web.
Um servio web definido atravs de
uma pgina .asmx.

27/9/2005 Francisco Hoyos 16


Servidor na raa
Receber requisio SOAP via HTTP
Usar XML parser para obter nome da
operao invocada e seus parmetros
Montar mensagem SOAP de resposta
manualmente, usando uma biblioteca
XML
Enviar resposta SOAP via HTTP

27/9/2005 Francisco Hoyos 17


Servio web definido no .asmx
<@% WebService class="MathServiceJit" language="C#"%>
using System.Web.Services;
public class MathServiceJit
{
[WebMethod]
public double Add(double x, double y) {
return x + y;
}

[WebMethod]
public double Subtract(double x, double y) {
return x - y;
}
}
27/9/2005 Francisco Hoyos 18
Servio web fora do .asmx:
arquivo fonte C#
using System.Web.Services;
public class MathService
{
[WebMethod]
public double Add(double x, double y) {
return x + y;
}

[WebMethod]
public double Subtract(double x, double y) {
return x - y;
}
}

27/9/2005 Francisco Hoyos 19


Servio web fora do .asmx:
pgina .asmx
<@% WebService class="MathService" language="C#"%>
OU
<@% WebService class="MathService"%>
OU
<@% WebService class=MyNS.MathService, MyAssembly"%>

A forma recomendada de implementao manter e


compilar separadamente a classe que implementa o
servio web.
No Visual Studio .NET a diretiva @WebService
adicionada automaticamente ao arquivo .asmx.

27/9/2005 Francisco Hoyos 20


Atributo WebService
[WebService(Namespace="http://www.notashop.com/wscr",
Description="SimpleService1",
Name="Try This Out")]

public class MyService


{
...
}

Namespace deve ser usado quando o servio


for disponibilizado. Se no for especificado,
http://tempuri.org ser automaticamente
usado.
27/9/2005 Francisco Hoyos 21
Atributo WebMethod
Pode vir acompanhado das seguintes
propriedades:
Description
MessageName
EnableSession
CacheDuration
TransactionOption
BufferResponse

27/9/2005 Francisco Hoyos 22


WebMethod: Description,
MessageName e EnableSession
Description: Descrio textual da
operao. Aparece no WSDL.
MessageName: Nome pelo qual a
operao conhecida pelo cliente.
Aparece no WSDL.
EnableSession: Se true, o servio tem
acesso aos objetos que mantm o
estado da sesso com cada cliente.

27/9/2005 Francisco Hoyos 23


WebMethod: CacheDuration
CacheDuration: Especifica o tempo em
segundos que o resultado de uma
operao ser armazenado na memria.
O resultado mantido na forma de um
par request/response. Novos pedidos de
execuo da mesma operao, com os
mesmos parmetros, sero respondidos
com dados diretamente do cache, sem
a invocao do servio.
27/9/2005 Francisco Hoyos 24
WebMethod: TransactionOption e
BufferResponse
TransactionOption: Permite especificar que o
web method seja executado numa transao.
A transao interrompida quando uma
exceo lanada ou quando o mtodo
SetAbort da classe
System.EnterpriseServices.ContextUtil
chamado.
BufferResponse: Se true, a resposta do
servio inteiramente armazenada antes de
ser enviada ao cliente, ao invs de ser
enviada em vrias pequenas partes.
27/9/2005 Francisco Hoyos 25
A classe WebService
using System.Web.Services;
public class MathService : System.Web.Services.WebService
{
[WebMethod]
public double Add(double x, double y) {
return x + y;
}
}

Se o servio especificar WebService como classe


base, ele ganha acesso a objetos ASP.NET, tais como
Application, Session, User e Context, que oferecem
facilidades para gerenciamento de sesso e
identificao do usurio do servio.
27/9/2005 Francisco Hoyos 26
.NET WS: exemplo
using System;
using System.Web.Services;
public class Point {
public double x;
public double y;
}
[WebService(Namespace="urn:geometry")]
public class Geometry {
[WebMethod]
public double Distance(Point orig, Point dest) {
return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +
Math.Pow(orig.y-dest.y, 2));
}
}
27/9/2005 Francisco Hoyos 27
.NET WS: SOAP request
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Distance xmlns="urn:geometry">
<orig>
<x>0</x>
<y>0</y>
</orig>
<dest>
<x>3</x>
<y>4</y>
</dest>
</Distance>
</soap:Body>
</soap:Envelope>

27/9/2005 Francisco Hoyos 28


.NET WS: SOAP response
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<DistanceResponse xmlns="urn:geometry">
<DistanceResult>5</DistanceResult>
</DistanceResponse>
</soap:Body>
</soap:Envelope>

27/9/2005 Francisco Hoyos 29


.NET WS: uso de atributos
using System; using System.Web.Services;
using System.Web.Services.Protocols; using System.Xml.Serialization;

public class Point {


[XmlAttribute] public double x;
[XmlAttribute] public double y;
}
[WebService(Namespace="urn:geometry")] public class Geometry {
[WebMethod]
[SoapDocumentMethod(RequestElementName="CalcDistance",
ResponseElementName="CalculatedDistance")]
[return: XmlElement("result")]
public double Distance([XmlElement("o")] Point orig,
[XmlElement("d")] Point dest) {
return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +
Math.Pow(orig.y-dest.y, 2));
}
}
27/9/2005 Francisco Hoyos 30
SOAP request resultante
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<CalcDistance xmlns="urn:geometry">
<o x=0 y=0 />
<d x=3 y=4 />
</CalcDistance>
</soap:Body>
</soap:Envelope>

27/9/2005 Francisco Hoyos 31


SOAP response resultante
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<CalculatedDistance xmlns="urn:geometry">
<result>5</result>
</CalculatedDistance>
</soap:Body>
</soap:Envelope>

27/9/2005 Francisco Hoyos 32


Acessando o SOAP header 1
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<x:UsernameToken xmlns:x="http://example.org/security">
<username>Mary</username>
<password>yraM</password>
</x:UsernameToken>
</soap:Header>
<soap:Body>
<CalcDistance xmlns="urn:geometry">
...

27/9/2005 Francisco Hoyos 33


Acessando o SOAP header 2
Criar uma classe .NET que representa o tipo
do elemento desejado no header, conforme o
XML Schema
[XmlType(Namespace="http://example.org/security")]
[XmlRoot(Namespace="http://example.org/security")]
public class UsernameToken : SoapHeader {
public string username;
public string password;
}

27/9/2005 Francisco Hoyos 34


Acessando o SOAP header 3
using System;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace="urn:geometry")]
public class Geometry {
public UsernameToken Token;
[WebMethod] [SoapHeader("Token")]
public double Distance(Point orig, Point dest) {
if (!Token.username.Equals(Reverse(Token.password)))
throw new Exception("access denied");
return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +
Math.Pow(orig.y-dest.y, 2));
}
}
27/9/2005 Francisco Hoyos 35
Cliente na raa
Montar mensagem SOAP
manualmente, usando uma biblioteca
XML
Enviar mensagem via HTTP
Receber resposta SOAP via HTTP
Usar XML parser para obter valor de
retorno includo na resposta

27/9/2005 Francisco Hoyos 36


.NET WS: cliente
O consumo de servios web em .NET feito
atravs de classes proxy.
O programa wsdl.exe gera uma classe proxy
a partir do WSDL do servio. Entre outras
opes, wsdl.exe permite selecionar a
linguagem de programao em que o proxy
implementado.
Visual Studio .NET gera automaticamente a
classe proxy atravs da opo Add Web
Reference.

27/9/2005 Francisco Hoyos 37


Adicionando uma Web
Reference 1

27/9/2005 Francisco Hoyos 38


Adicionando uma Web
Reference 2

27/9/2005 Francisco Hoyos 39


Adicionando uma Web
Reference 3

27/9/2005 Francisco Hoyos 40


Usando a classe proxy
private void Submit1_Click(object sender,
System.EventArgs e)
{
Simple1.TryThisOut svc1 = new Simple1.TryThisOut();
SvcOutput1.Text = svc1.WakeUp(SvcInput1.Text);
}

27/9/2005 Francisco Hoyos 41


.NET WS: invocao
assncrona de servios
Para cada operao XYZ do servio so
gerados dois mtodos para invocao
assncrona:
BeginXYZ(): invoca XYZ sem aguardar pela
resposta, retornando ao chamador
imediatamente.
EndXYZ(): retorna o resultado da
invocao a XYZ.

27/9/2005 Francisco Hoyos 42


.NET WS: invocao assncrona, polling
static IAsyncResult tempHolder1;
WeatherFetcher.USWeather USW = new WeatherFetcher.USWeather( );

private void Button1_Click(object sender, System.EventArgs e) {


Button1.Enabled = false;
tempHolder1 = USW.BeginGetWeatherReport(TextBox1.Text, null, null);
}

private void Button2_Click(object sender, System.EventArgs e) {


if (tempHolder1.IsCompleted) {
Label2.Text += USW.EndGetWeatherReport(tempHolder1) + "<br>";
Button1.Enabled = true;
tempHolder1 = null;
} else {
Label2.Text += "1 is Still completing...";
}
}
27/9/2005 Francisco Hoyos 43
.NET WS: invocao assncrona, callback
private void Button1_Click(object sender,
System.EventArgs e) {
Button1.Enabled = false;
AsyncCallback callBack = new AsyncCallback(MyCallBack);
USW.BeginGetWeatherReport(TextBox1.Text, callBack, USW);
Label2.Text = "Web Service called...";
}

public void MyCallBack(IAsyncResult AsyncResult) {


string ReturnValue;
ReturnValue = USW.EndGetWeatherReport(AsyncResult);
Label2.Text += "<br>" + "Weather Report = " + ReturnValue;
Button1.Enabled = true;
}

27/9/2005 Francisco Hoyos 44


J2EE
Plataforma para o desenvolvimento de
aplicaes para o meio empresarial
Antecede web services
J2EE 1.4 foi a primeira verso a adotar
completamente o paradigma de web
services

27/9/2005 Francisco Hoyos 45


J2EE: plataforma

27/9/2005 Francisco Hoyos 46


J2EE 1.4: APIs

27/9/2005 Francisco Hoyos 47


J2EE 1.4
Preocupao com interoperabilidade:
adoo do Basic Profile (BP), publicado
pela Web Services Interoperability
Organization (WS-I) (www.ws-i.org).
BP especifica como usar XML, WSDL,
SOAP e UDDI conjuntamente,
eliminando ambigidades.

27/9/2005 Francisco Hoyos 48


J2EE Web Service APIs
JAX-RPC (Java API for XML-based RPC):
permite a criao (servidor) e consumo
(cliente) de web services
SAAJ (SOAP with Attachments API for Java):
usada na criao e manipulao baixo nvel
de mensagens SOAP
JAXR (Java API for XML Registries): acesso
aos catlogos UDDI
JAXP (JAVA API for XML Processing): junto
com DOM e SAX, permite a manipulao de
documentos XML
27/9/2005 Francisco Hoyos 49
JAX-RPC: servidor
Existem dois modelos de programao:
JAX-RPC Service Endpoint (JSE): mais
simples, baseado em servlet containers
Enterprise Java Beans (EJB) endpoint:
baseado em stateless EJBs

27/9/2005 Francisco Hoyos 50


JAX-RPC: JSE
Para criar um JSE basta definir:
uma endpoint interface, com as operaes
do servio web
uma classe que implementa a interface
acima

27/9/2005 Francisco Hoyos 51


JAX-RPC: JSE - exemplo
public interface BookQuote extends java.rmi.Remote {
public float getBookPrice(String isbn)
throws java.rmi.RemoteException;
}

public class BookQuote_Impl_1 implements BookQuote {


public float getBookPrice(String isbn) {
return 24.99f;
}
}

27/9/2005 Francisco Hoyos 52


JAX-RPC: JSE - execuo

27/9/2005 Francisco Hoyos 53


JAX-RPC: JSE e servlets
O JSE parte do servlet, ou seja, para todos
os fins prticos, o JSE o servlet.
Assim, o JSE tem acesso a todos os recursos
aos quais um servlet tem via o JNDI
Environment Naming Context (ENC).
Tais recursos incluem JDBC drivers, JMS
providers, EJBs, J2EE connectors, outros
servios web, variveis de ambiente, o
ServletContext e a HttpSession.
27/9/2005 Francisco Hoyos 54
public class BookQuote_Impl_2 implements BookQuote {
public float getBookPrice(String isbn) {
java.sql.Connection jdbcConnection = null;
java.sql.Statement sqlStatement = null;
java.sql.ResultSet resultSet;
try {
javax.naming.InitialContext jndiEnc = new javax.naming.InitialContext();
javax.sql.DataSource dataSource = (javax.sql.DataSource)
jndiEnc.lookup("java:comp/env/jdbc/DataSource");
jdbcConnection = dataSource.getConnection();
sqlStatement = jdbcConnection.createStatement();
resultSet = sqlStatement.executeQuery("SELECT wholesale
FROM CATALOG WHERE isbn = \'" + isbn + "\'");
if (resultSet.next( )) {
float price = resultSet.getFloat("wholesale");
return price;
}
return 0; // zero means it's not stocked.
} catch (java.sql.SQLException se) { ... }
catch (javax.naming.NamingException ne) { ... }
}
}
27/9/2005 Francisco Hoyos 55
JSE: interface ServiceLifecycle
O JSE pode implementar opcionalmente a
interface ServiceLifecycle.
Ela define os mtodos init() e destroy(),
invocados no incio e final, respectivamente,
da vida do JSE.
O JSE recebe via init() uma referncia ao
ServletEndpointContext, que por sua vez d
acesso a uma srie de outros recursos.

27/9/2005 Francisco Hoyos 56


JSE: exemplo ServiceLifecycle
public class BookQuote_Impl_5
implements BookQuote, ServiceLifecycle {
javax.sql.DataSource dataSource;
ServletEndpointContext endPtCntxt;

public void init(Object context) throws ServiceException {


try {
endPtCntxt = (ServletEndpointContext) context;
InitialContext jndiEnc = new InitialContext();
javax.sql.DataSource dataSource = (javax.sql.DataSource)
jndiEnc.lookup("java:comp/env/jdbc/BookDatabase");
} catch(NamingException ne) {
throw new ServiceException("Cannot init JNDI ENC", ne);
}
}
}
27/9/2005 Francisco Hoyos 57
JSE: ServletEndpointContext 1
Faz a interface do JSE com o seu servlet
container.
Para ser usado, a referncia recebida
deve ser armazenada numa varivel do
JSE.

27/9/2005 Francisco Hoyos 58


JSE: ServletEndpointContext 2
package javax.xml.rpc.server;

public interface ServletEndpointContext {


public java.security.Principal getUserPrincipal();
public boolean isUserInRole(String role);
public javax.xml.rpc.handler.MessageContext
getMessageContext();
public javax.Servlet.http.HttpSession getHttpSession()
throws javax.xml.rpc.JAXRPCException;
public javax.Servlet.ServletContext getServletContext();
}

27/9/2005 Francisco Hoyos 59


JSE: getUserPrincipal(), isUserInRole()
O objeto Principal representa a identidade da
aplicao cliente, que est enviando o
request SOAP.
Disponvel apenas se o JSE for configurado
para usar HTTP Basic Authentication (BASIC-
AUTH) ou Symmetric HTTP.
Papis (roles) podem ser atribudos a
Principals usando ferramentas especficas do
fornecedor J2EE. O JSE verifica qual o papel
do cliente atravs do isUserInRole().

27/9/2005 Francisco Hoyos 60


JSE: getHttpSession()
Usado para obter um objeto
HttpSession que representa a sesso
HTTP associada com o cliente SOAP.
A sesso HTTP permite ao servlet
container associar mltiplos requests
HTTP com um cliente SOAP especfico.
O controle de sesso HTTP feito
normalmente via cookies ou SSL.

27/9/2005 Francisco Hoyos 61


JSE: HttpSession
O objeto HttpSession permite ao JSE ver e
modificar informaes da sesso, tais como o
identificador da sesso, hora de criao, hora
do ltimo acesso e quando a sesso vai
expirar.
Alm disso, o JSE pode associar atributos
arbitrrios com uma sesso, mantendo
estado entre invocaes feitas por um mesmo
cliente. Um atributo um par nome-valor.

27/9/2005 Francisco Hoyos 62


JSE: getServletContext()
Usado para obter o objeto ServletContext do
servlet JAX-RPC que encapsula a instncia
JSE.
O ServletContext permite acesso a:
atributos nome-valor
parmetros de inicializao
arquivos, tipos MIME, converses path-URL
fornecedor e verso do container
logging
RequestDispatcher (permite chamadas a outro
servlet, JSP ou pgina HTML)
27/9/2005 Francisco Hoyos 63
JSE: getMessageContext()
Retorna um objeto MessageContext que
usado para compartilhar informaes
entre objetos handler e o objeto JSE.
Message handlers permitem pr e ps
processamento das mensagens SOAP
trocadas entre J2EE port components
(JSEs e endpoints EJB) e clientes SOAP.

27/9/2005 Francisco Hoyos 64


JAX-RPC: EJB web services 1
Recomendado para servios web que exigem
alto uso de transaes, pois o sistema de
containers dos EJBs garante
automaticamente execuo transacional.
alterao de dados via JDBC e/ou JMS
coordenao das atividades de outros EJBs, que
por sua vez modificam dados
Usar um EJB como um endpoint para servio
web pode ser como usar uma marreta para
bater um prego [1]

27/9/2005 Francisco Hoyos 65


JAX-RPC: EJB web services 2
Implementado num stateless session bean,
inclusive um j existente (para expor seus
mtodos como servios web).
Teoricamente um mesmo stateless session
bean pode simultaneamente atender clientes
do tipo remote, local e endpoint (servio
web).
Um EJB endpoint no tem uma home
interface.

27/9/2005 Francisco Hoyos 66


JAX-RPC: EJB web services 3
Para criar um EJB endpoint basta
definir:
uma endpoint interface, com as operaes
do servio web (exatamente como no caso
de um JSE)
uma classe bean que implementa as
operaes do servio definido pela
interface acima (no necessrio
implementar a interface propriamente dita)

27/9/2005 Francisco Hoyos 67


EJB: classe bean - exemplo
public class BookQuoteBean_1
implements javax.ejb.SessionBean {
SessionContext ejbContext;
public void ejbCreate( ) { }
public float getBookPrice(String isbn) {
return 24.99f;
}
public void setSessionContext(SessionContext cntxt) {
ejbContext = cntxt;
}
public void ejbActivate( ) { }
public void ejbPassivate( ) { }
public void ejbRemove( ) { }
}
27/9/2005 Francisco Hoyos 68
EJB: a interface SessionBean
Toda classe stateless session bean deve
implementar a interface
javax.ejb.SessionBean, usada pelo container
para controlar o ciclo de vida do bean.
public interface SessionBean
extends javax.ejb.EnterpriseBean {
public void setSessionContext(SessionContext cntxt);
public void ejbActivate( );
public void ejbPassivate( );
public void ejbRemove( );
}

27/9/2005 Francisco Hoyos 69


EJB: ciclo de vida do bean

Uma vez colocado no method-ready pool, o


bean est pronto para atender pedidos de
clientes.
27/9/2005 Francisco Hoyos 70
EJB: atendendo requisies SOAP
Quando o container EJB recebe uma mensagem
SOAP, ele identifica a classe EJB apropriada para
aquela requisio e seleciona uma instncia daquele
EJB do method-ready pool.
A chamada SOAP mapeada no mtodo
correspondente da instncia. Aps o retorno do
mtodo, o bean volta para o pool.
Uma instncia stateless no deve manter estado
especfico de um cliente entre invocaes de seus
mtodos, pois cada requisio pode vir de um cliente
diferente.

27/9/2005 Francisco Hoyos 71


EJB: ambiente de execuo
Assim como o JSE, um EJB pode
acessar recursos, outros EJBs e servios
web atravs de seu JNDI ENC.
Transaes e segurana so
gerenciadas automaticamente pelo
sistema de container de EJBs.

27/9/2005 Francisco Hoyos 72


EJB: SessionContext 1
Recebido pelo EJB atravs do mtodo
setSessionContext().
Normalmente armazenado numa
varivel do EJB para uso posterior.
A interface SessionContext
implementada pelo container.

27/9/2005 Francisco Hoyos 73


EJB: SessionContext 2
public interface SessionContext extends EJBContext {
public EJBLocalObject getEJBLocalObject();
public EJBObject getEJBObject();
public EJBLocalHome getEJBLocalHome();
public EJBHome getEJBHome();
public Principal getCallerPrincipal();
public boolean isCallerInRole(String roleName);
public UserTransaction getUserTransaction();
public boolean getRollbackOnly();
public void setRollbackOnly();
public MessageContext getMessageContext();
public TimerService getTimerService();
}

27/9/2005 Francisco Hoyos 74


JAX-RPC: cliente
As trs formas abaixo podem ser
usadas por um cliente Java para acessar
um servio web:
stub
proxy dinmico
DII (Dynamic Invocation Interface)

27/9/2005 Francisco Hoyos 75


JAX-RPC: stubs 1
O stub permite que o acesso ao servio web
seja feito via uma simples chamada a um
mtodo de um objeto Java local.
O compilador JAX-RPC gera a partir do WSDL
do servio:
interface endpoint
classe stub
(opcionalmente) interface do servio (factory de
stubs)

27/9/2005 Francisco Hoyos 76


JAX-RPC: stubs 2
A interface endpoint equivalente
interface de mesmo nome usada no
lado do servidor para implementar o
servio web.
A classe stub implementa a interface
endpoint.
A classe stub tambm implementa a
interface javax.xml.rpc.Stub.

27/9/2005 Francisco Hoyos 77


public interface Stub {
// Std property: The Web service's Internet address.
public static String ENDPOINT_ADDRESS_PROPERTY;
// Std property: Password for authentication.
public static String PASSWORD_PROPERTY;
// Std property: User name for authentication.
public static String USERNAME_PROPERTY;
// Std prop.: Boolean flag for maintaining an HTTP session.
public static String SESSION_MAINTAIN_PROPERTY;
// Given a property name, get its value.
public Object _getProperty(java.lang.String name);
// Get the names of all the properties the stub supports.
public Iterator _getPropertyNames();
// Configure a property on the stub.
public void _setProperty(java.lang.String name,
java.lang.Object value);
}

27/9/2005 Francisco Hoyos 78


Cliente WS: service interface
O compilador JAX-RPC pode gerar uma
interface, juntamente com uma classe
que a implementa, que d acesso a
objetos stub.
Uma instncia da classe que
implementa a service interface
responsvel por criar e pr-configurar
os stubs requisitados pelo cliente.
27/9/2005 Francisco Hoyos 79
Cliente WS: Usando um stub
public class BookQuoteServlet_1
extends javax.servlet.http.HttpServlet {
protected void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException,java.io.IOException {
try {
String isbn = req.getParameter("isbn");
InitialContext jndiContext = new InitialContext();
BookQuoteService service = (BookQuoteService)
jndiContext.lookup("java:comp/env/service/BookQuoteService");
BookQuote bookQuote = service.getBookQuotePort();
float price = bookQuote.getBookPrice(isbn);
java.io.Writer outStream = resp.getWriter();
outStream.write("<html><body>The wholesale price for ISBN:"
+ isbn + " = " + price + "</body></html>");
} catch ...
27/9/2005 Francisco Hoyos 80
Cliente WS: execuo
Quando um mtodo do stub invocado, o
stub converte a chamada numa mensagem
SOAP e a envia ao servidor (o Basic Profile
requer o uso de HTTP POST).
Quando o stub recebe a mensagem SOAP de
resposta, ele extrai o valor de retorno. Se a
mensagem contm uma indicao de falha, o
stub lana uma exceo Java apropriada.

27/9/2005 Francisco Hoyos 81


Usando um stub a partir de J2SE
public class JaxRpcExample_1 {
public static void main(String[] args) throws Exception {
String isbn = args[0];
BookQuoteService service = (BookQuoteService)
ServiceFactory.loadService(
com.jwsbook.jaxrpc.BookQuoteService.class);
BookQuote bookQuote = service.getBookQuotePort();
float price = bookQuote.getBookPrice(isbn);
System.out.println("The price is = " + price);
}
}

27/9/2005 Francisco Hoyos 82


Proxy dinmico (cliente J2EE)
public class JaxRpcExample_2 {
public static void main(String[] args) throws Exception {
String isbn = args[0];
InitialContext jndiContext = new InitialContext();
javax.xml.rpc.Service service = (javax.xml.rpc.Service)
jndiContext.lookup("java:comp/env/service/Service");
BookQuote BookQuote_proxy = (BookQuote)
service.getPort(BookQuote.class);
float price = BookQuote_proxy.getBookPrice(isbn);
System.out.println("The price is = " + price);
}
}

27/9/2005 Francisco Hoyos 83


Proxy dinmico
Um elemento service-ref deve ser includo no
deployment descriptor para que o J2EE
container encontre o WSDL.
<service-ref xmlns:mh="http://www.mh.com/jwsbook/BookQuote">
<service-ref-name>service/Service</service-ref-name>
<service-interface>javax.xml.rpc.Service</service-interface>
<wsdl-file>BookQuote.wsdl</wsdl-file>
<service-qname>mh:BookQuoteService</service-qname>
</service-ref>

27/9/2005 Francisco Hoyos 84


Dynamic Invocation Interface
API genrica para invocao de servios
web.
No requer uma endpoint interface (que
especfica por servio).
Pode ser usada por aplicaes que
descobrem e invocam servios web
automaticamente.

27/9/2005 Francisco Hoyos 85


public class JaxRpcExample_4 {
public static void main(String[] args) throws Exception
{
String isbn = args[0];
InitialContext jndiContext = new InitialContext();
javax.xml.rpc.Service service = (javax.xml.rpc.Service)
jndiContext.lookup("java:comp/env/service/Service");
QName portName = new QName(
"http://www.M-H.com/jwsbook/BookQuote", "BookQuotePort");
QName operationName = new QName(
"http://www.M-H.com/jwsbook/BookQuote", "getBookPrice");
Call call = service.createCall(portName, operationName);
Object[] inputParams = new Object[] {isbn};
Float price = (Float) call.invoke(inputParams);
System.out.println("The price is = " +price.floatValue());
}
}

27/9/2005 Francisco Hoyos 86


J2EE Web Services

27/9/2005 Francisco Hoyos 87


J2EE x .NET
Tecnologia J2EE .NET
Linguagem, runtime Java, JVM vrias, CLR
Deployment Java package Assembly
Aplicaes web JSP, servlets ASP.NET
Servidor web vrios Microsoft IIS
Componentes EJB COM+
Bancos de dados JDBC ADO.NET
Mensagens JMS System.Messaging
Integrao com EIS JCA Host Integration Server
Remoting RMI / IIOP .NET Remoting
Servio de nomes JNDI Active Directory

27/9/2005 Francisco Hoyos 88


27/9/2005 Francisco Hoyos 89
27/9/2005 Francisco Hoyos 90
Consideraes finais 1
Java: linguagem nica suportada por vrias
plataformas.
.NET: plataforma nica que suporta vrias
linguagens.
Muito fcil expor mtodos de classes .NET
como servios web, s custas de uma certa
poluio da sintaxe das linguagens.
Visual Studio .NET uma soluo completa
para desenvolvimento e consumo de servios
web, totalmente baseada em interface
grfica. => aumento de produtividade
27/9/2005 Francisco Hoyos 91
Consideraes finais 2
J2EE uma plataforma mais madura
que .NET. Modelo EJB complexo, mas
poderoso. No existe algo equivalente
em .NET.
Google Web API: para .NET, nada alm
do WSDL oferecido; para Java, uma
API especial disponibilizada.

27/9/2005 Francisco Hoyos 92


Referncias
[1] J2EE Web Services; Richard Monson-Haefel; Addison Wesley;
2003
[2] Programming Microsoft .NET XML Web Services; Damien
Foggon, Daniel Maharry, Chris Ullman, Karli Watson; Microsoft
Press; 2004
[3] Introducing Microsoft .NET, Third Edition; David S. Platt;
Microsoft Press; 2003
[4] informit.coms .NET Reference Guide,
http://www.informit.com/guides/guide.asp?g=dotnet
[5] How ASP.NET Web Services Work, Aaron Skonnard,
http://www.msdn.microsoft.com/webservices
[6] ASP.net QuickStart Tutorial,
http://samples.gotdotnet.com/quickstart/aspplus

27/9/2005 Francisco Hoyos 93

Você também pode gostar