Publicado el 13 de Febrero del 2019
603 visualizaciones desde el 13 de Febrero del 2019
347,8 KB
62 paginas
Creado hace 22a (18/04/2002)
5.2 JAX-RPC. Caso de estudio: Apache
Axis
Introducción (1)
n WSDL
n Lenguaje (aplicación XML) para especificar interfaces
remotos
n El compilador de WSDL permite generar los stubs y
skeletons para poder invocar e implementar servicios web
n JAX-RPC
n API de programación estándar en Java para implementar e
invocar operaciones de Servicios Web mediante el
paradigma de los RPCs
n La especificación todavía no está terminada
n Estas transparencias se basan en la versión 0.7 de la
especificación
n Trabajaremos con Apache Axis
n Implementación OpenSource y gratuita de JAX-RPC
n Estas transparencias se basan en la versión Beta 1 de Axis
Introducción (2)
n WSDL es un lenguaje complejo
n Afortunadamente, casi todas las APIs basadas en
RPCs (ej.: JAX-RPC) permiten
n Definir una interfaz remota en el propio lenguaje de
implementación
n Usar un compilador para generar el documento WSDL a
partir del interfaz remoto
n El documento WSDL generado es útil para que un cliente
(quizás escrito en un lenguaje distinto al del servidor) pueda
usar su compilador de WSDL para obtener el stub del
interfaz remoto
Introducción (3)
n Con JAXP-RPC ...
Interfaz Java
Compilador Java
Compilador Java2WSDL
Documento WSDL
Compilador WSDL2Java
Stubs, skeletons y tipos Java
Introducción (4)
n Modelos de implementación de servicios web
n Modelo basado en servlets (aplicación web J2EE)
n Modelo basado en EJB
n Modelo basado en J2SE
n Modelos de implementación de clientes
n Modelo basado en J2EE (aplicación web J2EE o EJB)
n Modelo basado en J2SE
n Estudiaremos la siguiente combinación
HTTP
Internet
HTTP
war
Aplicaciones web
Cliente J2SE
Servidor web J2EE
Introducción (5)
n Servidor (contenedor) de aplicaciones web J2EE
n J2EE incluye un API para implementar aplicaciones web en
Java
n API de servlets y JSP
n Una aplicación web puede incluir uno o varios servicios web
(o puede contener sólo servicios web)
n Cada aplicación web se empaqueta en un fichero war
n Un servidor de aplicaciones web puede tener varias
aplicaciones web instaladas
n Implementar un servicio web sólo consiste en hacer una
clase que implementa el interfaz remoto, y empaquetar ésta
y las clases generadas por el compilador de WSDL a Java
que requiere la implementación del servicio en el fichero
war
n Axis sólo implementa este modelo de programación de
servicios web
Introducción (y 6)
n ¿ Qué es Axis ?
n Un conjunto de librerías (ficheros jar) que se han de
instalar en el servidor de aplicaciones web
n Incluye
n Herramientas (ej.: compiladores Java2WSDL y WSDL2Java)
n Un servlet que
n Recibe las peticiones SOAP sobre HTTP que envían los clientes
n Invoca la operación correspondiente sobre el servicio web
n Devuelve una respuesta SOAP sobre HTTP con el resultado de la
operación
n Se puede instalar en cualquier servidor de aplicaciones web
J2EE
n En particular, usaremos Apache Tomcat
Ejemplo StockQuote
n Usaremos el ejemplo StockQuote para ilustrar JAX-RPC
n Paquetes es.udc.fbellas.corbaws.stockquote.{wsdl,
client}
n Servicio Web que ofrece una interfaz con una operación que a
partir de un conjunto de identificadores de valores bursátiles
devuelve sus cotizaciones
n Cada cotización incluye
n Su identificador
n Su valor
n El número de segundos de antigüedad que tiene el valor (el valor
real actual sería ligeramente distinto)
Cliente
standalone
HTTP
Internet
HTTP
Servidor de
aplicaciones web
StockQuoteProvider
es.udc.fbellas.corbaws.stockquote.wsdl.StockQuoteProvider
package es.udc.fbellas.corbaws.stockquote.wsdl;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface StockQuoteProvider extends Remote {
TradePrice[] getLastTradePrices(String[] tickerSymbols) throws
RemoteException, IncorrectTickerSymbolException;
}
es.udc.fbellas.corbaws.stockquote.wsdl.TradePrice (1)
package es.udc.fbellas.corbaws.stockquote.wsdl;
import java.io.Serializable;
public class TradePrice implements Serializable {
private String tickerSymbol;
private double price;
private int elapsedSeconds;
public String getTickerSymbol() {
return tickerSymbol;
}
public void setTickerSymbol(String tickerSymbol) {
this.tickerSymbol = tickerSymbol;
}
public double getPrice() {
return price;
}
es.udc.fbellas.corbaws.stockquote.wsdl.TradePrice (y 2)
public void setPrice(double price) {
this.price = price;
}
public int getElapsedSeconds() {
return elapsedSeconds;
}
public void setElapsedSeconds(int elapsedSeconds) {
this.elapsedSeconds = elapsedSeconds;
}
}
es.udc.fbellas.corbaws.stockquote.wsdl.IncorrectTickerSymbolException
public class IncorrectTickerSymbolException extends Exception {
private String incorrectTickerSymbol;
public IncorrectTickerSymbolException(
String incorrectTickerSymbol) {
this.incorrectTickerSymbol = incorrectTickerSymbol;
}
public String getIncorrectTickerSymbol() {
return incorrectTickerSymbol;
}
}
Visión global de WSDL
n Dejaremos momentáneamente la explicación de los
detalles de la definición del interfaz remoto
StockQuoteProvider y sus tipos asociados
n Una vez compilados los anteriores ficheros Java, se
puede obtener el documento WSDL
n Un documento WSDL consta de varias partes
n Definición de tipos de datos
n Definición de mensajes
n Definición de puertos
n Definición de bindings
n Definición de servicios
n Vamos a echar un vistazo al fichero generado
n Objetivo: comprender el formato general de un documento
WSDL
StockQuoteProvider.wsdl (1)
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
targetNamespace="http://wsdl.stockquote.corbaws.fbellas.udc.es"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:intf="http://wsdl.stockquote.corbaws.fbellas.udc.es"
xmlns:impl="http://wsdl.stockquote.corbaws.fbellas.udc.es-impl"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://wsdl.stockquote.corbaws.fbellas.udc.es">
<complexType name="ArrayOf_SOAP-ENC_string">
<complexContent>
<restriction base="SOAP-ENC:Array">
<attribute ref="SOAP-ENC:arrayType"
wsdl:arrayType="xsd:string[]"/>
</restriction>
</complexContent>
</complexType>
<element name="ArrayOf_SOAP-ENC_string" nillable="true"
type="intf:ArrayOf_SOAP-ENC_string"/>
StockQuoteProvider.wsdl (2)
<complexType name="TradePrice">
<sequence>
<element name="tickerSymbol" nillable="true" type="xsd:string"/>
<element name="price" type="xsd:double"/>
<element name="elapsedSeconds" type="xsd:int"/>
</sequence>
</complexType>
<complexType name="ArrayOfTradePrice">
<complexContent>
<restriction base="SOAP-ENC:Array">
<attribute ref="SOAP-ENC:arrayType"
wsdl:arrayType="intf:TradePrice[]"/>
</restriction>
</complexContent>
</complexType>
<element name="ArrayOfTradePrice" nillable="true"
type="intf:ArrayOfTradePrice"/>
</schema>
</types>
Definición de tipos de datos - Comentarios
n Es posible usar varios sistemas de tipos
n El uso de un esquema XML es el más habitual
n Cuando el protocolo que se usa es SOAP, también se pueden
usar tipos SOAP
n En el ejemplo se definen
n El tipo complejo ArrayOf_SOAP-ENC_string, que corresponde
al tipo Java String[]
n Los tipos complejos que representan vectores, se definen como una
especialización por restricción de SOAP-ENC:Array
n Los tipos complejos TradePrice y ArrayOfTradePrice, que
corresponden a los tipos Java TradePrice y TradePrice[]
n Los elementos ArrayOf_SOAP-ENC_string y
ArrayOfTradePrice
n El atributo nillable con valor true especifica que el
correspondiente elemento puede tomar el valor nil (null en
Java)
StockQuoteProvider.wsdl (3)
<wsdl:message name="getLastTradePricesResponse">
<wsdl:part name="return" type="intf:ArrayOfTradePrice"/>
</wsdl:message>
<wsdl:message name="IncorrectTickerSymbolException">
<wsdl:part name="incorrectTickerSymbol" type="SOAP-ENC:string"/>
</wsdl:message>
<wsdl:message name="getLastTradePricesRequest">
<wsdl:part name="in0" type="intf:ArrayOf_SOAP-ENC_string"/>
</wsdl:message>
<wsdl:portType name="StockQuoteProvider">
<wsdl:operation name="getLastTradePrices" parameterOrder="in0">
<wsdl:input message="intf:getLastTradePricesRequest"/>
<wsdl:output message="intf:getLastTradePricesResponse"/>
<wsdl:fault name="IncorrectTickerSymbolException"
message="intf:IncorrectTickerSymbolException"/>
</wsdl:operation>
</wsdl:portType>
Definición de mensajes y puertos – Comentarios (1)
n Definición de mensajes
n Especifica los mensajes que se pueden intercambiar clientes
y servidores
n Cada mensaje consta de “partes”, donde cada parte
especifica un parámetro del mensaje, un valor de retorno o
una excepción
n Definición de puertos
n Un puerto especifica un conjunto de operaciones
n Cada operación indica el mensaje de entrada (petición del
cliente al servicio), el de salida (respuesta del servicio si no
ocurre ninguna excepción) y los posibles mensajes fault
(excepciones) que puede devolver la operación
Definición de mensajes y puertos – Comentarios (y 2)
n Definición de puertos (cont)
n Tipos de parámetros (idem CORBA)
n In: parte que sólo aparece en un mensaje de entrada
n Out: parte que sólo aparece en un mensaje de salida
n Inout: parte que aparece en un mensaje de entrada y salida
n Valor de retorno
n Parte con name="return"
StockQuoteProvider.wsdl (4)
<wsdl:binding name="StockQuoteProviderSoapBinding"
type="intf:StockQuoteProvider">
<wsdlsoap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getLastTradePrices">
<wsdlsoap:operation soapAction=""/>
<wsdl:input>
<wsdlsoap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://wsdl.stockquote.corbaws.fbellas.udc.es"/>
</wsdl:input>
<wsdl:o
Comentarios de: 5.2 JAX-RPC. Caso de estudio: Apache Axis (0)
No hay comentarios