93
27/9/2005 Francisco Hoyos 1 Implementando Serviços Web MO818 – Tópicos em Redes de Computadores Prof. Dr. Edmundo Madeira Instituto de Computação - Unicamp

Implementando Serviços Web

  • Upload
    thyra

  • View
    43

  • Download
    0

Embed Size (px)

DESCRIPTION

Implementando Serviços Web. MO818 – Tópicos em Redes de Computadores Prof. Dr. Edmundo Madeira Instituto de Computação - Unicamp. Tópicos. Introdução Alguns conceitos de .NET Serviços web na plataforma .NET Serviços web na plataforma J2EE Comparação J2EE x .NET Considerações finais - PowerPoint PPT Presentation

Citation preview

Page 1: Implementando Serviços Web

27/9/2005 Francisco Hoyos 1

Implementando Serviços Web

MO818 – Tópicos em Redes de ComputadoresProf. Dr. Edmundo MadeiraInstituto de Computação - Unicamp

Page 2: Implementando Serviços Web

27/9/2005 Francisco Hoyos 2

Tópicos

Introdução Alguns conceitos de .NET Serviços web na plataforma .NET Serviços web na plataforma J2EE Comparação J2EE x .NET Considerações finais Referências

Page 3: Implementando Serviços Web

27/9/2005 Francisco Hoyos 3

Introdução

J2EE e .NET são duas das principais plataformas para desenvolvimento, execução e consumo de serviços web.No que consiste o suporte ao usuário e desenvolvedor de serviços web nessas plataformas?Qual ambiente de execução elas oferecem aos serviços?

Page 4: Implementando Serviços Web

27/9/2005 Francisco Hoyos 4

.NET: Definição

“.NET é a estratégia da Microsoft para conectar sistemas, informação e dispositivos através de web services para que as pessoas possam colaborar e comunicar-se mais efetivamente.”“A Microsoft oferece uma completa gama de software que ajuda organizações e indivíduos a se beneficiarem da conectividade baseada em web services: ferramentas de desenvolvimento Visual Studio .NET, Windows Server System que hospeda web services e aplicações para desktop como Office, que consomem web services.”

Page 5: Implementando Serviços Web

27/9/2005 Francisco Hoyos 5

.NET: Origens

Em outubro de 2000, Microsoft, HP e Intel submeteram as especificações da linguagem C# e da Common Language Infrastructure (CLI) à ECMA (European Computer Manufacturers Association) para padronização.Em dezembro de 2001 ambas foram aprovadas pela ECMA e em 2003 pela ISO.

Page 6: Implementando Serviços Web

27/9/2005 Francisco Hoyos 6

.NET: Common Language Infrastructure

A CLI inclui: Common Intermediate Language (CIL)

linguagem independente de plataforma Common Type System (CTS)

conjunto de tipos e operações compartilhados por várias linguagens de programação

Common Language Specification (CLS) toda linguagem de programação “.NET-

compliant” deve atender a essa especificação

Page 7: Implementando Serviços Web

27/9/2005 Francisco Hoyos 7

.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.

Page 8: Implementando Serviços Web

27/9/2005 Francisco Hoyos 8

.NET: CLR

O CLR é a implementação Microsoft da especificação CLI.Quando uma aplicação .NET é executada, o CLR gerencia o carregamento e a execução do código e provê vários serviços “runtime” à aplicação, como: gerenciamento de memória (garbage collection), de threads e de segurança.

Page 9: Implementando Serviços Web

27/9/2005 Francisco Hoyos 9

.NET: execução de código nativo

Aplicações .NET são compiladas para MSIL (Microsoft Intermediate Language, o mesmo que CIL).Quando a aplicação é executada pela primeira vez, o runtime faz uma compilação just-in-time para converter o código MSIL para código de máquina.

Page 10: Implementando Serviços Web

27/9/2005 Francisco Hoyos 10

.NET: execução no CLR

Page 11: Implementando Serviços Web

27/9/2005 Francisco Hoyos 11

.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 integração entre aplicações desenvolvidas em linguagens diferentes: um tipo definido em uma linguagem pode ser

herdado em outra linguagem exceções podem ser lançadas de uma

linguagem e capturadas em uma outra

Page 12: Implementando Serviços Web

27/9/2005 Francisco Hoyos 12

.NET: managed/unmanaged code

Código feito para .NET é chamado managed code e pode dispor dos serviços oferecidos pelo runtime .NET.Qualquer outro código é chamado unmanaged code, pode ser executado pelo CLR, mas não tem acesso aos serviços deste.

Page 13: Implementando Serviços Web

27/9/2005 Francisco Hoyos 13

.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 manipulação de

dados (tipicamente obtidos de um banco de dados); conversão dos dados para XML

Windows Forms: desenvolvimento de aplicações Windows tradicionais para desktop (“controls”)

ASP.NET: desenvolvimento de aplicações web

Page 14: Implementando Serviços Web

27/9/2005 Francisco Hoyos 14

ASP.NET

Sucessor da tecnologia Active Server Pages.Simplificação do processo de desenvolvimento de serviços web.Modelo “web forms” para desenvolvimento de interfaces para web browser. “Controls” presentes nas web forms executam no servidor e não no cliente. “Look and feel” muito semelhante ao das Windows forms.

Page 15: Implementando Serviços Web

27/9/2005 Francisco Hoyos 15

ASP.NET

Páginas com extensão .aspx.Quando um browser requisita uma página aspx, o “runtime” ASP.NET compila o conteúdo numa classe .NET. A partir daí essa classe processa os acessos à página original.A lógica do programa pode ser fisicamente separada do HTML da página através da técnica “code-behind”.

Page 16: Implementando Serviços Web

27/9/2005 Francisco Hoyos 16

.NET Web Services

Um dos principais focos da plataforma .NET.Classes .NET pré-existentes podem ter seus métodos facilmente expostos como serviços web.Um serviço web é definido através de uma página .asmx.

Page 17: Implementando Serviços Web

27/9/2005 Francisco Hoyos 17

Servidor “na raça”

Receber requisição SOAP via HTTPUsar XML parser para obter nome da operação invocada e seus parâmetrosMontar mensagem SOAP de resposta “manualmente”, usando uma biblioteca XMLEnviar resposta SOAP via HTTP

Page 18: Implementando Serviços Web

27/9/2005 Francisco Hoyos 18

Serviço 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;

}

}

Page 19: Implementando Serviços Web

27/9/2005 Francisco Hoyos 19

Serviço 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;

}

}

Page 20: Implementando Serviços Web

27/9/2005 Francisco Hoyos 20

Serviço web fora do .asmx:página .asmx

A forma recomendada de implementação é manter e compilar separadamente a classe que implementa o serviço web.No Visual Studio .NET a diretiva @WebService é adicionada automaticamente ao arquivo .asmx.

<@% WebService class="MathService" language="C#"%>

OU

<@% WebService class="MathService"%>

OU

<@% WebService class=“MyNS.MathService, MyAssembly"%>

Page 21: Implementando Serviços Web

27/9/2005 Francisco Hoyos 21

Atributo WebService[WebService(Namespace="http://www.notashop.com/wscr",

Description="SimpleService1",

Name="Try This Out")]

public class MyService

{

...

}

Namespace deve ser usado quando o serviço for disponibilizado. Se não for especificado, http://tempuri.org será automaticamente usado.

Page 22: Implementando Serviços Web

27/9/2005 Francisco Hoyos 22

Atributo WebMethod

Pode vir acompanhado das seguintes propriedades: Description MessageName EnableSession CacheDuration TransactionOption BufferResponse

Page 23: Implementando Serviços Web

27/9/2005 Francisco Hoyos 23

WebMethod: Description, MessageName e EnableSession

Description: Descrição textual da operação. Aparece no WSDL.MessageName: Nome pelo qual a operação é conhecida pelo cliente. Aparece no WSDL.EnableSession: Se true, o serviço tem acesso aos objetos que mantêm o estado da sessão com cada cliente.

Page 24: Implementando Serviços Web

27/9/2005 Francisco Hoyos 24

WebMethod: CacheDuration

CacheDuration: Especifica o tempo em segundos que o resultado de uma operação será armazenado na memória. O resultado é mantido na forma de um par request/response. Novos pedidos de execução da mesma operação, com os mesmos parâmetros, serão respondidos com dados diretamente do cache, sem a invocação do serviço.

Page 25: Implementando Serviços Web

27/9/2005 Francisco Hoyos 25

WebMethod: TransactionOption e BufferResponse

TransactionOption: Permite especificar que o web method seja executado numa transação. A transação é interrompida quando uma exceção é lançada ou quando o método SetAbort da classe System.EnterpriseServices.ContextUtil é chamado.BufferResponse: Se true, a resposta do serviço é inteiramente armazenada antes de ser enviada ao cliente, ao invés de ser enviada em várias pequenas partes.

Page 26: Implementando Serviços Web

27/9/2005 Francisco Hoyos 26

A classe WebServiceusing System.Web.Services;

public class MathService : System.Web.Services.WebService

{

[WebMethod]

public double Add(double x, double y) {

return x + y;

}

}

Se o serviço 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 sessão e identificação do usuário do serviço.

Page 27: Implementando Serviços Web

27/9/2005 Francisco Hoyos 27

.NET WS: exemplousing 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));

}

}

Page 28: Implementando Serviços Web

27/9/2005 Francisco Hoyos 28

.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>

Page 29: Implementando Serviços Web

27/9/2005 Francisco Hoyos 29

.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>

Page 30: Implementando Serviços Web

27/9/2005 Francisco Hoyos 30

.NET WS: uso de atributosusing 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));

}

}

Page 31: Implementando Serviços Web

27/9/2005 Francisco Hoyos 31

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>

Page 32: Implementando Serviços Web

27/9/2005 Francisco Hoyos 32

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>

Page 33: Implementando Serviços Web

27/9/2005 Francisco Hoyos 33

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">

...

Page 34: Implementando Serviços Web

27/9/2005 Francisco Hoyos 34

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;

}

Page 35: Implementando Serviços Web

27/9/2005 Francisco Hoyos 35

Acessando o SOAP header 3using 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));

}

}

Page 36: Implementando Serviços Web

27/9/2005 Francisco Hoyos 36

Cliente “na raça”

Montar mensagem SOAP “manualmente”, usando uma biblioteca XMLEnviar mensagem via HTTPReceber resposta SOAP via HTTPUsar XML parser para obter valor de retorno incluído na resposta

Page 37: Implementando Serviços Web

27/9/2005 Francisco Hoyos 37

.NET WS: cliente

O consumo de serviços web em .NET é feito através de classes proxy.O programa wsdl.exe gera uma classe proxy a partir do WSDL do serviço. Entre outras opções, wsdl.exe permite selecionar a linguagem de programação em que o proxy é implementado.Visual Studio .NET gera automaticamente a classe proxy através da opção “Add Web Reference”.

Page 38: Implementando Serviços Web

27/9/2005 Francisco Hoyos 38

Adicionando uma Web Reference 1

Page 39: Implementando Serviços Web

27/9/2005 Francisco Hoyos 39

Adicionando uma Web Reference 2

Page 40: Implementando Serviços Web

27/9/2005 Francisco Hoyos 40

Adicionando uma Web Reference 3

Page 41: Implementando Serviços Web

27/9/2005 Francisco Hoyos 41

Usando a classe proxyprivate void Submit1_Click(object sender,

System.EventArgs e)

{

Simple1.TryThisOut svc1 = new Simple1.TryThisOut();

SvcOutput1.Text = svc1.WakeUp(SvcInput1.Text);

}

Page 42: Implementando Serviços Web

27/9/2005 Francisco Hoyos 42

.NET WS: invocação assíncrona de serviços

Para cada operação XYZ do serviço são gerados dois métodos para invocação assíncrona: BeginXYZ(): invoca XYZ sem aguardar

pela resposta, retornando ao chamador imediatamente.

EndXYZ(): retorna o resultado da invocação a XYZ.

Page 43: Implementando Serviços Web

27/9/2005 Francisco Hoyos 43

.NET WS: invocação assíncrona, 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...";

}

}

Page 44: Implementando Serviços Web

27/9/2005 Francisco Hoyos 44

.NET WS: invocação assíncrona, callbackprivate 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;

}

Page 45: Implementando Serviços Web

27/9/2005 Francisco Hoyos 45

J2EE

Plataforma para o desenvolvimento de aplicações para o meio empresarialAntecede web servicesJ2EE 1.4 foi a primeira versão a adotar completamente o paradigma de web services

Page 46: Implementando Serviços Web

27/9/2005 Francisco Hoyos 46

J2EE: plataforma

Page 47: Implementando Serviços Web

27/9/2005 Francisco Hoyos 47

J2EE 1.4: APIs

Page 48: Implementando Serviços Web

27/9/2005 Francisco Hoyos 48

J2EE 1.4

Preocupação com interoperabilidade: adoção 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 ambigüidades.

Page 49: Implementando Serviços Web

27/9/2005 Francisco Hoyos 49

J2EE Web Service APIsJAX-RPC (Java API for XML-based RPC): permite a criação (servidor) e consumo (cliente) de web servicesSAAJ (SOAP with Attachments API for Java): usada na criação e manipulação baixo nível de mensagens SOAPJAXR (Java API for XML Registries): acesso aos “catálogos” UDDIJAXP (JAVA API for XML Processing): junto com DOM e SAX, permite a manipulação de documentos XML

Page 50: Implementando Serviços Web

27/9/2005 Francisco Hoyos 50

JAX-RPC: servidor

Existem dois modelos de programação: JAX-RPC Service Endpoint (JSE): mais

simples, baseado em servlet containers

Enterprise Java Beans (EJB) endpoint: baseado em stateless EJBs

Page 51: Implementando Serviços Web

27/9/2005 Francisco Hoyos 51

JAX-RPC: JSE

Para criar um JSE basta definir: uma endpoint interface, com as

operações do serviço web uma classe que implementa a

interface acima

Page 52: Implementando Serviços Web

27/9/2005 Francisco Hoyos 52

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;

}

}

Page 53: Implementando Serviços Web

27/9/2005 Francisco Hoyos 53

JAX-RPC: JSE - execução

Page 54: Implementando Serviços Web

27/9/2005 Francisco Hoyos 54

JAX-RPC: JSE e servlets

O JSE é parte do servlet, ou seja, para todos os fins práticos, 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 serviços web, variáveis de ambiente, o ServletContext e a HttpSession.

Page 55: Implementando Serviços Web

27/9/2005 Francisco Hoyos 55

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) { ... }

}

}

Page 56: Implementando Serviços Web

27/9/2005 Francisco Hoyos 56

JSE: interface ServiceLifecycle

O JSE pode implementar opcionalmente a interface ServiceLifecycle.Ela define os métodos init() e destroy(), invocados no início e final, respectivamente, da vida do JSE.O JSE recebe via init() uma referência ao ServletEndpointContext, que por sua vez dá acesso a uma série de outros recursos.

Page 57: Implementando Serviços Web

27/9/2005 Francisco Hoyos 57

JSE: exemplo ServiceLifecyclepublic 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);

}

}

}

Page 58: Implementando Serviços Web

27/9/2005 Francisco Hoyos 58

JSE: ServletEndpointContext 1

Faz a interface do JSE com o seu servlet container.Para ser usado, a referência recebida deve ser armazenada numa variável do JSE.

Page 59: Implementando Serviços Web

27/9/2005 Francisco Hoyos 59

JSE: ServletEndpointContext 2package 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();

}

Page 60: Implementando Serviços Web

27/9/2005 Francisco Hoyos 60

JSE: getUserPrincipal(), isUserInRole()

O objeto Principal representa a identidade da aplicação cliente, que está enviando o request SOAP.Disponível apenas se o JSE for configurado para usar HTTP Basic Authentication (BASIC-AUTH) ou Symmetric HTTP.“Papéis” (roles) podem ser atribuídos a Principals usando ferramentas específicas do fornecedor J2EE. O JSE verifica qual o papel do cliente através do isUserInRole().

Page 61: Implementando Serviços Web

27/9/2005 Francisco Hoyos 61

JSE: getHttpSession()

Usado para obter um objeto HttpSession que representa a sessão HTTP associada com o cliente SOAP.A sessão HTTP permite ao servlet container associar múltiplos requests HTTP com um cliente SOAP específico.O controle de sessão HTTP é feito normalmente via cookies ou SSL.

Page 62: Implementando Serviços Web

27/9/2005 Francisco Hoyos 62

JSE: HttpSession

O objeto HttpSession permite ao JSE ver e modificar informações da sessão, tais como o identificador da sessão, hora de criação, hora do último acesso e quando a sessão vai expirar.Além disso, o JSE pode associar atributos arbitrários com uma sessão, mantendo estado entre invocações feitas por um mesmo cliente. Um atributo é um par “nome-valor”.

Page 63: Implementando Serviços Web

27/9/2005 Francisco Hoyos 63

JSE: getServletContext()Usado para obter o objeto ServletContext do servlet JAX-RPC que encapsula a instância JSE.O ServletContext permite acesso a: atributos “nome-valor” parâmetros de inicialização arquivos, tipos MIME, conversões path-URL fornecedor e versão do container logging RequestDispatcher (permite chamadas a outro

servlet, JSP ou página HTML)

Page 64: Implementando Serviços Web

27/9/2005 Francisco Hoyos 64

JSE: getMessageContext()

Retorna um objeto MessageContext que é usado para compartilhar informações entre objetos handler e o objeto JSE.Message handlers permitem pré e pós processamento das mensagens SOAP trocadas entre “J2EE port components” (JSEs e endpoints EJB) e clientes SOAP.

Page 65: Implementando Serviços Web

27/9/2005 Francisco Hoyos 65

JAX-RPC: EJB web services 1

Recomendado para serviços web que exigem alto uso de transações, pois o sistema de containers dos EJBs garante automaticamente execução transacional. alteração de dados via JDBC e/ou JMS coordenação das atividades de outros EJBs,

que por sua vez modificam dados

“Usar um EJB como um endpoint para serviço web pode ser como usar uma marreta para bater um prego” [1]

Page 66: Implementando Serviços Web

27/9/2005 Francisco Hoyos 66

JAX-RPC: EJB web services 2

Implementado num stateless session bean, inclusive um já existente (para expor seus métodos como serviços web).Teoricamente um mesmo stateless session bean pode simultaneamente atender clientes do tipo remote, local e endpoint (serviço web).Um EJB endpoint não tem uma home interface.

Page 67: Implementando Serviços Web

27/9/2005 Francisco Hoyos 67

JAX-RPC: EJB web services 3

Para criar um EJB endpoint basta definir: uma endpoint interface, com as

operações do serviço web (exatamente como no caso de um JSE)

uma classe bean que implementa as operações do serviço definido pela interface acima (não é necessário implementar a interface propriamente dita)

Page 68: Implementando Serviços Web

27/9/2005 Francisco Hoyos 68

EJB: classe bean - exemplopublic 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( ) { }

}

Page 69: Implementando Serviços Web

27/9/2005 Francisco Hoyos 69

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( );

}

Page 70: Implementando Serviços Web

27/9/2005 Francisco Hoyos 70

EJB: ciclo de vida do bean

Uma vez colocado no “method-ready pool”, o bean está pronto para atender pedidos de clientes.

Page 71: Implementando Serviços Web

27/9/2005 Francisco Hoyos 71

EJB: atendendo requisições SOAP

Quando o container EJB recebe uma mensagem SOAP, ele identifica a classe EJB apropriada para aquela requisição e seleciona uma instância daquele EJB do method-ready pool.A chamada SOAP é mapeada no método correspondente da instância. Após o retorno do método, o bean volta para o pool.Uma instância stateless não deve manter estado específico de um cliente entre invocações de seus métodos, pois cada requisição pode vir de um cliente diferente.

Page 72: Implementando Serviços Web

27/9/2005 Francisco Hoyos 72

EJB: ambiente de execução

Assim como o JSE, um EJB pode acessar recursos, outros EJBs e serviços web através de seu JNDI ENC.Transações e segurança são gerenciadas automaticamente pelo sistema de container de EJBs.

Page 73: Implementando Serviços Web

27/9/2005 Francisco Hoyos 73

EJB: SessionContext 1

Recebido pelo EJB através do método setSessionContext().Normalmente armazenado numa variável do EJB para uso posterior.A interface SessionContext é implementada pelo container.

Page 74: Implementando Serviços Web

27/9/2005 Francisco Hoyos 74

EJB: SessionContext 2public 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();

}

Page 75: Implementando Serviços Web

27/9/2005 Francisco Hoyos 75

JAX-RPC: cliente

As três formas abaixo podem ser usadas por um cliente Java para acessar um serviço web: stub proxy dinâmico DII (Dynamic Invocation Interface)

Page 76: Implementando Serviços Web

27/9/2005 Francisco Hoyos 76

JAX-RPC: stubs 1

O stub permite que o acesso ao serviço web seja feito via uma simples chamada a um método de um objeto Java local.O compilador JAX-RPC gera a partir do WSDL do serviço: interface endpoint classe stub (opcionalmente) interface do serviço

(“factory de stubs”)

Page 77: Implementando Serviços Web

27/9/2005 Francisco Hoyos 77

JAX-RPC: stubs 2

A interface endpoint é equivalente à interface de mesmo nome usada no lado do servidor para implementar o serviço web.A classe stub implementa a interface endpoint.A classe stub também implementa a interface javax.xml.rpc.Stub.

Page 78: Implementando Serviços Web

27/9/2005 Francisco Hoyos 78

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);

}

Page 79: Implementando Serviços Web

27/9/2005 Francisco Hoyos 79

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 instância da classe que implementa a service interface é responsável por criar e pré-configurar os stubs requisitados pelo cliente.

Page 80: Implementando Serviços Web

27/9/2005 Francisco Hoyos 80

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 ...

Page 81: Implementando Serviços Web

27/9/2005 Francisco Hoyos 81

Cliente WS: execução

Quando um método 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 contém uma indicação de falha, o stub lança uma exceção Java apropriada.

Page 82: Implementando Serviços Web

27/9/2005 Francisco Hoyos 82

Usando um stub a partir de J2SEpublic 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);

}

}

Page 83: Implementando Serviços Web

27/9/2005 Francisco Hoyos 83

Proxy dinâmico (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);

}

}

Page 84: Implementando Serviços Web

27/9/2005 Francisco Hoyos 84

Proxy dinâmico

Um elemento service-ref deve ser incluído 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>

Page 85: Implementando Serviços Web

27/9/2005 Francisco Hoyos 85

Dynamic Invocation Interface

API genérica para invocação de serviços web.Não requer uma endpoint interface (que é específica por serviço).Pode ser usada por aplicações que descobrem e invocam serviços web automaticamente.

Page 86: Implementando Serviços Web

27/9/2005 Francisco Hoyos 86

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());

}

}

Page 87: Implementando Serviços Web

27/9/2005 Francisco Hoyos 87

J2EE Web Services

Page 88: Implementando Serviços Web

27/9/2005 Francisco Hoyos 88

J2EE x .NET

Tecnologia J2EE .NET

Linguagem, runtime

Java, JVM várias, CLR

Deployment Java package Assembly

Aplicações web JSP, servlets ASP.NET

Servidor web vários Microsoft IIS

Componentes EJB COM+

Bancos de dados JDBC ADO.NET

Mensagens JMS System.Messaging

Integração com EIS

JCA Host Integration Server

Remoting RMI / IIOP .NET Remoting

Serviço de nomes JNDI Active Directory

Page 89: Implementando Serviços Web

27/9/2005 Francisco Hoyos 89

Page 90: Implementando Serviços Web

27/9/2005 Francisco Hoyos 90

Page 91: Implementando Serviços Web

27/9/2005 Francisco Hoyos 91

Considerações finais 1Java: linguagem única suportada por várias plataformas..NET: plataforma única que suporta várias linguagens.Muito fácil expor métodos de classes .NET como serviços web, às custas de uma certa “poluição” da sintaxe das linguagens.Visual Studio .NET é uma solução completa para desenvolvimento e consumo de serviços web, totalmente baseada em interface gráfica. => aumento de produtividade

Page 92: Implementando Serviços Web

27/9/2005 Francisco Hoyos 92

Considerações finais 2

J2EE é uma plataforma mais madura que .NET. Modelo EJB é complexo, mas poderoso. Não existe algo equivalente em .NET.Google Web API: para .NET, nada além do WSDL é oferecido; para Java, uma API especial é disponibilizada.

Page 93: Implementando Serviços Web

27/9/2005 Francisco Hoyos 93

Referências

[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.com’s .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