Sei sulla pagina 1di 27

:(%6HUYLFHV

,QWHURSHUDELOLGDGHQWUH$SOLFDFLRQHV
0RGHOR3URJUDPD3URJUDPD «33

&RQWHQLGR

• Servicios en la Web
• El papel de XML y la plataforma Java
• Las APIs de Java para XML
– JAXP
– JAXB
– JAX-RPC
– JAXR
– JAXM
• Ejemplo
– Códigos
– Instalación y ejecución

1
6HUYLFLRVHQOD:HE
• Es un servicio disponible en Internet que utiliza sistema de intercambio
de información vía XML y no es dependiente de ningún sistema
operativo ni de algún lenguaje de programación.

XML
Windows 2000 Linux
Perl XML Java

• Una aplicación envía una request a un servicio en una determinada


URL usando el protocolo SOAP encima de HTTP. El servicio Web recibe
la petición, la procesa y devuelve una respuesta.

• Ejemplo típico:
• un servicio Web de valores de bolsa donde la request solicita el
valor de una acción determinada y la respuesta ofrece ese
valor. En este caso la request y la response son partes del
mismo método de llamada.


6HUYLFLRVHQOD:HE

• Otro ejemplo es un servicio que ofrece una ruta eficiente para la


entrega de productos. En este caso, una empresa envía una request
con los destinos, el servicio Web los procesa y determina la ruta de
mínimo coste. En esta caso, el algoritmo que resuelve la ruta óptima
podría tardar y por tanto el response no debe formar parte de la
request.

• En muchos casos, una empresa puede ser consumidora de servicios


Web y al mismo tiempo ofrecer sus servicios Web a otras.

• Típico ejemplo es un distribuidor al por mayor tiene un rol de


consumidor cuando usa el servicio Web para comprobar si una
empresa le ofrece un producto determinado y será un
proveedor de servicio Web en el caso de que ofrezca a sus
clientes información de sus productos.


2
(OUROHGH;0/\ODSODWDIRUPD-DYD
• Los Web Services dependen de la habilidad de las
diferentes compañías (partes) en comunicarse entre sí
incluso si utilizan diferentes plataformas.

• XML (e;tensible 0arkup /anguage), es un lenguaje de


marcado que ofrece portabilidad de los datos. XML se usa
ya en casi todos los entornos Web y cada vez más, las
empresas apuestan por este lenguaje para intercambio de
datos.

• También la plataforma Java ha sido clave para la


evolución de esta tecnología. SUN tiene tiene una API
Java para XML haciendo la integración en las aplicaciones
muy interesante.
KWWSMDYDVXQFRPZHEVHUYLFHV


5ROHVHQORV:HE6HUYLFHV
• Service Provider
– Implementa el servicio y lo hace disponible en Internet.

• Service Requestor
– Consumidor de servicios. Inicializa un nuevo servicio
Web creando una nueva conexión con y realiza
peticiones XML.

• Service Registry
– Directorio de servicios centralizado. El registry ofrece
un lugar centralizado donde los desarrolladores puedan
publicar nuevos servicios o encontrar los ya publicados.

3
/RV3URWRFRORVHQ:HE6HUYLFHV
• Service Transport
– HTTP, SMTP, FTP, …

• XML messaging
– XML-RPC, SOAP XML.

• Service Description
– WSDL

• Service Discovery
– UDDI


;0/53&
• Es un protocolo sencillo que utiliza mensajes XML para
realizar RPC.

• Las Request son codificadas en XML y enviadas vía HTTP


Post.

• Las XML Response son devueltas en el cuerpo de un


mensaje de Response HTTP.

• XML-RPC es independiente de la plataforma.

• Permite la comunicación entre aplicaciones diversas.

4
(MHPSORGH5HTXHVW ;0/53&

"[PO YHUVLRQ ³´!


PHWKRG&DOO!
PHWKRG1DPH!ZHDWKHUJHW:HDWKHUPHWKRG1DPH!
SDUDPV!
SDUDP!YDOXH!YDOXH!SDUDP!
SDUDPV!
PHWKRG&DOO!

(MHPSORGH5HVSRQVH;0/53&

"[PO YHUVLRQ ³´!


PHWKRG5HVSRQVH!
SDUDPV!
SDUDP!YDOXH!LQW!LQW!SDUDP!
SDUDPV!
PHWKRG5HVSRQVH!

5
62$3 6LPSOH2EMHFW $FFHVV3URWRFRO
• Es un protocolo basado en XML para el intercambio de
información entre computadores.

• Es independiente de la plataforma.

• La forma normal de usarlo es como RPC sobre HTTP.

• SOAP es más complejo que XML-RPC. Hace uso de XML


namespaces y de XML Schemas. Sin embargo, el cuerpo
de la Request SOAP especifica tanto el método a ejecutar
como los parámetros.

(MHPSORGHPHQVDMH62$3
9DORUGHEROVD
 "!#$ %&'(&
!)*++, -.-.-' *+/01*243653' 2$7
8 $91491;: <4=$, 1>?@>$7BA C%DE43 *212F#G1IHI:KJ%L
8 $91491;:?M@49NOD$, >>>>
 QPR P#+OS $9$, LT$7U:?VRW)X;L
Y  QPR %:?Z[#\], Z9154A $=
^_7BA 9*,  QPR %:Z[#\F D1KO=$, 1*2D47UE*' >$7BA *+E4=4' $3 N$@*2E4=49154A $=
 QPR %:Z[#\], 492`0S 9N%I<4A 0F D1IO=$, *2D47UE*' >$7BA *+E4=4' $36N$*2E%=492`0S 9N$ a
Y  QPR %:?Z[#\], b%`<$a
Y 7c, d_1;M@E*+I$36E`4 $3S 2e>%7BA 9*,(7fF#G+*2$7U:?V)W)X;La
Y *+<7Bg$A a]XTbih Y *T<47Bg%A a
Y 7j, d_1OM2E*+I$36E`44 %3S 2$a
Y   _PR %:?Z[i\], b%`<%a

Y  _P_ 4:?Z[#\Q,(Z9154A $=$a

 

6
(MHPSORGHPHQVDMH62$3
5HVSRQVHGH
!#$ %&'(&lkm4mU n
8 $  91491;: <4=$, 1>?@>$7BA C%DE43 *212F#G1IHI:KJ%L
8 $91491;:?M@49NOD$, >>>>

Y  QPR %:?Z[#\], Z9154A $=


^_7BA 9*,  QPR %:Z[#\F D1KO=$, 1
 *2D47UE*' >$7BA *+E4=4' $3 N$@*2E4=49154A $=
 QPR %:Z[#\], 492`0S 9N%I<4A 0F 1 D IO=$, *2D47UE*' >$7BA *+E4=4' $36N$*2E%=492`0S 9N$ a

Y  QPR %:?Z[#\], b%`<$a


Y 7j, d_1OM2E*TI$36E`44 $3S 24W0*=$9*2e>%7BA 9*,(7fFiG2*2%7U:?V)W)X;La

Y $3S 2$a&1m4m$' k0& Y  $3S 2$a

Y 7c, d_1;M@E*+I$36E`4 $3S 24Wi*=$9*2$a


Y  QPR %:Z[#\Q,(b%`<$a

Y  _P_ 4:?Z[#\Q,(Z9154A $=$a




:6'/ :HE6HUYLFHV 'HVFULSWLRQ /DQJXDJH

• WSDL es una gramática XML para especificar


una interfaz pública de un servicio Web.

• Esta interfaz puede incluir información de:

• métodos disponibles,
• tipos de datos de los mensajes,
• protocolos a utilizar,
• dirección donde localizar el servicio.




7
(MHPSORGH:6'/
• < ?xml version= "1.0"?>
– < definitions name= "StockQuote"
targetNamespace= "http:/ / example.com/ stockquote.wsdl"
xmlns:tns= "http:/ / example.com/ stockquote.wsdl"
xmlns:xsd1= "http:/ / example.com/ stockquote.xsd"
xmlns:soap= "http:/ / schemas.xmlsoap.org/ wsdl/ soap/ "
xmlns= "http:/ / schemas.xmlsoap.org/ wsdl/ ">
– < types>
• < schema targetNamespace= "http:/ / example.com/ stockquote.xsd"
xmlns= "http:/ / www.w3.org/ 2000/ 10/ XMLSchema">
– < element name= "TradePriceRequest">
» < complexType>
» < all>
» < element name= "tickerSymbol" type= "string"/ >
» < / all>
» < / complexType>
– < / element>
– < element name= "TradePrice">
» < complexType>
» < all>
» < element name= "price" type= "float"/ >
» < / all>
» < / complexType>
– < / element>
• < / schema>
– < / types>
o

(MHPSORGH:6'/
< message name= "GetLastTradePriceInput">
< part name= "body" element= "xsd1:TradePriceRequest"/ >
< / message>
< message name= "GetLastTradePriceOutput">
< part name= "body" element= "xsd1:TradePrice"/ >
< / message>
< portType name= "StockQuotePortType">
< operation name= "GetLastTradePrice">
< input message= "tns:GetLastTradePriceInput"/ >
< output message= "tns:GetLastTradePriceOutput"/ >
< / operation>
< / portType>




8
(MHPSORGH:6'/
p_qr 1 s tr s1uls1vwex4yRz?{|K}1~2@€Q1}|Kx{1}1v‚ƒ4r s1tr s1uz#| „‚x4yRzI|Is1…@† {|K}1~2@€Q1}|Kx‡1}ˆ
| ‰1„‚xz+Š
p)…O}1v‚† qr s1t4r s1ue…;| „‹ x4yRzt}1~2wex1s|z
|ˆ6vs1…+‚}ˆ
|OyRz;Œ|6|‚† 2…O~2Œ1xwev…2Ž wl‹ …O}1v‚Ž }ˆ6u2…O}1v‚Œ| |‚z;Š
p)}‚xˆ6v|r }s.s1vwx4yRzI‘#x|?’Tv…;|6‰ˆ
vtx‡ˆKr ~Txz+Š
p)…O}1v‚† }‚xˆ6v|r }s
…O}1v‚“$~O|r }s%yRz;Œ| |‚† 2x@v1wl‚‹ xŽ ~T}wl+‘#x|?’Tv…;|6‰ˆ
vtx‡ˆKr ~Txz;Š
p_r s‚|OŠ
p)…O}1v‚† q}t1„e1…Ox4yRz;‹ r |Kxˆ6v‹ z;1Š
p_r s‚|;Š
p)}|‚|;Š
p)…O}1v‚† q}t1„e1…Ox4yRz;‹ r |Kxˆ6v‹ z;1Š
p_2}|‚|OŠ
p_2}‚xˆ6v|r }s%Š
p_qr s1tr s1u$Š
p)…Oxˆ
”r ~Txes1vwx4yRz?{|K}1~2@€Q1}|Kx1{xˆ
”r ~Txz+Š
p)t}1~2wexs|Kv@|r }s%Š_•]„–Kr ˆ6…;|i…Oxˆ
”r ~Txp_2t}1~2wex1s|Kv|r }s%Š
p_‚}ˆ
|)s1vwexyRz?{|K}1~2@€Q1}| x‡1}ˆ
|Iz_qr s1tr s1u$yRzI|s1…@† {|K}1~2@€Q1}|Kxƒ4r str s1uz+Š
p)…O}1v‚† vtt4ˆ6x…O…‹ }~Tv|r }s%yRz;Œ| |‚† 2x@vwl‚‹ xŽ ~T}w.2…;|K}1~2@—1}|Kxz?Š
p_‚}ˆ
|OŠ
p_2…Oxˆ
”r ~Tx4Š
p_2tx–Kr sr |r }s1…Š




8'', 8QLYHUVDO'HVFULSWLRQ'LVFRYHU\ DQG


,QWHJUDWLRQ RI :HE6HUYLFHV

• UDDI representa la capa de búsqueda de


servicios dentro de los protocolos Web Services.

• Es una especificación acerca de la información


de los registros distribuidos basados en la Web.

• http:/ / www.uddi.org




9
8'', 8QLYHUVDO'HVFULSWLRQ'LVFRYHU\ DQG
,QWHJUDWLRQ RI :HE6HUYLFHV

• El componente principal de UDDI es el registro


de negocios UDDI.

• Consiste en información de los servicios en tres


formas diferentes:

– Páginas blancas
– Incluye dirección, contacto, …
– Páginas amarillas
– Incluye categoría de compañías según taxonomías
estándar.
– Páginas verdes
– Información técnica acerca de los servicios del negocio.




(MHPSORGH6HUYLFLRVGLVSRQLEOHV
• Como ejemplo de funcionamiento de la pila
de protocolos, IBM ofrece un browser para:

– Buscar por servicios Web.

– Ver sus descripciones.

– Invocar a sus servicios. ……

(PHUJLQJ 7HFKQRORJLHV7RRONLW
http:/ / www-106.ibm.com/ developerworks/ webservices/ demos/ ettk/

˜
™

10
/DV$3,V GH-DYD681SDUD;0/
• La API de Java para XML permite escribir aplicaciones Web en Java.
• La API consta de diferentes APIs:

– Orientadas a los documentos


• Java API for XML Processing (-$;3):
– Permite el procesamiento de documentos XML con varios parsers.

• Java Architecture for XML Binding (-$;%)


– Permite el procesamiento de documentos XML usando JavaBeans.

– Orientadas a los procedimientos


• Java API for XML-based RPC (-$;53&):
– Envía llamadas de métodos SOAP a terceras partes en Internet y
recibe los resultados.

• Java API for XML Messaging (-$;0):


– Envía mensajes SOAP en Internet de forma estándar.

• Java API for XML Registries (-$;5):


– Ofrece una forma estándar para acceder a los registros de
negocio y compartir información.
š ›

(MHPSORFRPSOHWR

• El dueño de una cadena de cafeterías (&RIIHH%UHDN)


quiere expandir su negocio vendiendo distintos tipos de
cafés por Internet.

• Le indica al gerente de la compañía que busque nuevos


distribuidores de cafés para conocer sus precios para
poder decidir con que nuevas compañías va a realizar
negocios.

• No desea tener en stock ningún producto.

šI˜

11
&2))((%5($.

• Tareas a realizar según el gerente:

– 7$5($%XVFDUQXHYRVGLVWULEXLGRUHV

– 7$5($6ROLFLWDUOHVODOLVWDGHSUHFLRVGHVXV
SURGXFWRV

– 7$5($&RPSDUDUSUHFLRV\5HDOL]DUORV
SHGLGRVDOGLVWULEXLGRU

– 7$5($9HQWDGHFDIp SRU,QWHUQHW

š š

&2))((%5($.
• El gerente indica al Ingeniero del Software (IS) que realice esta tarea
buscando en las diferentes compañías.

• 7$5($%XVFDUQXHYRVGLVWULEXLGRUHV

– El IS decide que la mejor forma es buscar un registro UDDI (Universal


Description, Discovery, and Integration (UDDI) registry), donde la propia
empresa se ha registrado.
– El IS utiliza JAXR para enviar una consulta de búsqueda de distribuidores
de café. La implementación con JAXR utiliza JAXM para enviar el query al
registro, aunque esto es transparente para el IS.
– El registro UDDI recibe la pregunta y aplica el criterio de búsqueda
indicado en código JAXR para buscar las empresas que cumplen dicho
criterio de búsqueda.
– Cuando la búsqueda se ha completado, el registro devuelve la información
de cómo contactar con dichas empresas. Aunque el registro utiliza JAXM
detrás de todo este proceso, la respuesta al IS es código JAXR.

š œ

12
&2))((%5($.
• 7$5($6ROLFLWDUODOLVWDGHSUHFLRVGHVXVSURGXFWRV

– El siguiente paso del IS es solicitar la lista de precios de cada uno


de los distribuidores.

– En la tarea anterior obtuvo una descripción WSDL de cada uno de


los distribuidores, que indica el procedimiento para obtener los
precios y además también la URI a donde se debe enviar la
request.

– La aplicación realiza las llamadas a los procedimientos remotos


RPC a través de la API JAX-RPC y obtiene las respuestas de los
distribuidores.

– La empresa ya tenía implementado con el distribuidor anterior el


intercambio de mensajes basado en XML-schemas para realizar las
compras. Se utilizaba la API JAXM para solicitar el precio actual y
el distribuidor devolvía la lista de precios en un mensaje JAXM.
š6

&2))((%5($.
• 7$5($&RPSDUDUSUHFLRV\5HDOL]DUORVSHGLGRVDO
GLVWULEXLGRU

– Al recibir las respuestas con los precios, el IS procesará la lista


usando SAX.

– Una vez que la aplicación tiene todos los precios de los distintos
distribuidores, los compara y presenta los resultados.

– Cuando el dueño de la empresa y el gerente deciden que


distribuidores escoger, se podrá comenzar a hacer negocios con
ellos solicitando los pedidos

– Los pedidos a los nuevos distribuidores se envían a través de JAX-


RPC; las peticiones al distribuidor anterior se realizaba con JAXM.
Cada distribuidor, que utilice JAX-RPC o JAXM, debe responder
enviando un mensaje de confirmación con la orden del pedido y la
fecha de envío.
š ž

13
&2))((%5($.
• 7$5($9HQWDGHFDIp SRU,QWHUQHW

– Al mismo tiempo que las tareas anteriores, la empresa se ha


estado preparando para la venta de café por Internet.

– Publicará en I nternet un formulario con los precios que además


sirva como pedido.

– Antes de que realice dicha publicación, la compañía debe


determinar que precios pondrá a los productos.

– El IS escribe una aplicación que cargará a cada producto un 135%


al inicial.

– El IS utiliza JSP para crear un pedido por I nternet según las


productos y las cantidades seleccionadas por el cliente.

š Ÿ

,PSOHPHQWDFLyQGH&2))((%5($.

• Servidor
– Servlets
– JSP
– Java Beans
• Cliente
– HTML

š  

14
JAX-RPC Distributor Service
• El servidor Coffee Break también actual de cliente al realizar llamadas
remotas sobre el servicio distribuidor JAX-RPC.

• El código del servicio consiste en una interfaz del servicio, una clase de
implementación del servicio y diferentes Beans que son utilizados como
parámetros en algunos métodos y como valores de retorno.

• ,QWHUID]GHOVHUYLFLR 6HUYLFH ,QWHUIDFH


– ¢I£]¤ ¥;¦
§@¨ © £Tª0«2§2¬;­I§@¨ ®@¤ ¯O¤ °]±o²³2´2´2¬ ¤ §2¨(µK¶;·(¸+«2§T©o¤ ¥T§Q¬ °2­#¹_º;¦o°+«2°2­%»³T§Q´2³T§O«2§@¥_­K§@¨¬ ¬ £@¹R£T«2°2­
´O°¨¬ °2­%¯O¬ ¤ §2¥;¦
§T­#¨ §@¹R°T¦o°2­?¼+¢I°2­i´O£@¨ ½¹_§;¦K¨ °2­4¾Q¬ °2­#¨ §T­;³2¬ ¦o£T«2°2­i¨ §;¦o°¨o¥O£T«2°2­0­K°¥
¯°¹]´O°¥O§@¥;¦
§T­%¿I£O®T£@À2§O£¥2¼

• Á1«2«¨ §T­I­?À@§O£@¥#Âä ¥O© °¨o¹R£T¯O¤ Ä¥)«@§2¬?¯O¬ ¤ §2¥O¦


§Q´O£@¨ £]¬ £_§2¥O¦ ¨ §OÅ2£@¼

• Æ@°¥O©o¤ ¨
¹R£O¦ ¤ °¥2À@§O£¥#Âǵ
«@§2¥O¦ ¤ ©o¤ ¯£T¯O¤ Ä¥)«2§2¬T´O§O«¤ «2°R¾)© §O¯TÈO£R«2§2¬+¹]¤ ­?¹R°¼

• Æ1³T­ ¦o°¹_§2¨oÀ@§O£¥#¤ ¥T© °¨


¹R£T¯O¤ Ä¥)«2§)¯?°¥;¦o£T¯I¦o°_«@§2¬?¯O¬ ¤ §2¥;¦
§@¼

• ¢;¤ ¥O§2µo¦
§@¹]À@§O£@¥#¤ ¦
§2¹c«@§2¬T´O§O«¤ «2°¼

• É ¨ «2§2¨oÀ@§O£¥#¤ «2§@¥;¦ ¤ ©o¤ ¯£T«2°¨«2§Q´O§O«¤ «2°T¸+¯O¬ ¤ §2¥;¦


§;¸+«¤ ¨ §O¯¯O¤ Ä¥;¸¬ ¤ ­ ¦o£R«2§Q¤ ¦
§2¹Q­ ¸´2¨ §O¯O¤ °
$
¦o°T¦o£@¬ ¼

• Ê@¨o¤ ¯§2µo¦
§@¹]À@§O£@¥#¬ ¤ ­ ¦o£T«2°_«2§]´2¨ §O¯O¤ °@­0±6¥O°¹]Ë@¨ §)«2§2¬?¯£T© º#¾]´2¨ §O¯O¤ °_«¤ ­ ¦ ¨o¤ Ë@³2¤ «2°¨ · ¼

• Ê@¨o¤ ¯§@¢;¤ ­ ¦ À@§O£¥#¬ ¤ ­ ¦o£R«2§]´2¨ §O¯O¤ °2­?¼


š ¡

JAX-RPC Distributor Service

• Debido a que estos componentes se utilizan en otros ejemplos, se


han puesto en el directorio:
< JWSDP_HOME> / docs/ tutorial/ examples/ cb/ common/ src

• El código fuente de la interfaz 6XSSOLHU,) está en:


< JWSDP_HOME> / docs/ tutorial/ examples/ cb/ jaxrpc/ src.

package com.sun.cb;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface SupplierI F extends Remote {
public ConfirmationBean placeOrder(OrderBean order) throws
RemoteException;
public PriceListBean getPriceList() throws RemoteException;
}

š ™

15
JAX-RPC Distributor Service
• ,PSOHPHQWDFLyQGHO6HUYLFLR
– La clase “6XSSOLHU,PSO” implementa los métodos “SODFH2UGHU” y
“JHW3ULFH/LVW”, definidos en la interfaz “6XSSOLHU,)”.

– Estos métodos son muy sencillos para dejar más visible el código
relacionado con JAX-RPC.

• El método “SODFH2UGHU” acepta como entrada un pedido de café y devuelve


la confirmación de tal pedido. Para simplificar, este método confirma toda
petición y pone como día de envío el siguiente día de haber hecho el pedido.
(La fecha es calculada por “'DWH+HOSHU”, una clase útil que reside en el
directorio cb/ common.

public ConfirmationBean placeOrder(OrderBean order) {


Date tomorrow = com.sun.cb.DateHelper.addDays(new Date(), 1);
ConfirmationBean confirmation = new ConfirmationBean(order.getI d(),
tomorrow);
return confirmation;
}
œ ›

JAX-RPC Distributor Service


• El método “JHW3ULFH/LVW” devuelve un objeto “3ULFH/LVW%HDQ” con la lista
de los nombres de café y su precio que pueden solicitarse con este servicio.

• El método “JHW3ULFH/LVW” crea elobjeto PriceListBean invocando al método


privado llamado loadPrices. En este caso los precios se toman del fichero
“6XSSOLHU3ULFHVSURSHUWLHV”.

public PriceListBean getPriceList() {


PriceListBean priceList = loadPrices();
return priceList;
}
private PriceListBean loadPrices() {
String propsName = "com.sun.cb.SupplierPrices";
Date today = new Date();
Date endDate = DateHelper.addDays(today, 30);
PriceItemBean[ ] priceItems = PriceLoader.loadItems(propsName);
PriceListBean priceList = new PriceListBean(today, endDate,
priceItems);
return priceList;
}
œI˜

16
JAX-RPC Distributor Service
• 3XEOLFDFLyQGHO6HUYLFLRHQHO5HJLVWUR

– Como deseamos que los clientes encuentren nuestro


servicio, debemos publicarlo en un registro.

– OrgPublisher: programa que publica el servicio.


– OrgRemover: programa que elimina el servicio del registro.

– Ninguno es parte de la aplicación Web, son programas


independientes que se ejecutan con el comando siguiente:
ant set-up-service

– Una vez que el servicio se instale, se publica en el registro.


De la misma forma, justo antes de que el servicio sea
eliminado, se elimina del registro.
œ š

2UJ3XEOLVKHU ^«`
ÌÍÎ2Ï@ÍÐÑÒÎTÓÔUÕ Ö+×ØÕ Î2ÙÚ
Û ÔlÌÓÜ
Ý4Þ ÍßÍàÕ àÔlá Õ Ü6ÑÐ Û Ö;ÝÜ
âÕ ãÚ Û ÔlÌÓÜ
Ý4Þ ÍßÍÕ ×Ý Û á Õ ä%ÑÖOÓ×Ü6ÎTÑå4×Ø1æá ÑÚ Û ÔlÌÓÜ
Ý4Þ ÍßÍÕ Û ÓÕ ãÚ

2UJ3XEOLVKHU ç
Ì×Ùá Û Î]Î@á ÍÖTÖ
Ì×Ùá Û Î]Ö;ÝKÍÝ Û ÎQßÓ Û ælÔeÍ Û ØèKéÝÜ Û Ø1Ð4êKë0ÍÜ6ÐÖTì
ç
ä%ÑÖOÓ×Ü6ÎTÑå4×Ø1æá ÑeÜ6ÑÐ Û Ö;ÝÜ
âå×Ø1æá ÑUíîä%ÑÖOÓ×Ü6ÎTÑå4×Ø1æá ÑÕ ÐÑÝ?å×Ø1æá Ñ
èIïÎTÓÔUÕ Ö+×ØÕ Î2ÙÕ ð4Óñ
ñ6ÑÑä%ÑÐ Û Ö;ÝÜ
âï?ì Ú
éÝÜ Û Ø1Ðeò×1ÑÜ
â1ó)äiôÃíîÜ6ÑÐ Û Ö;ÝÜoâå4×Ø1æá ÑÕ Ð1ÑÝIéÝÜ Û Ø1ÐèIïò×1ÑÜoâÕ ×ÜKá ïì Ú
éÝÜ Û Ø1ÐlÌ×Ùá Û Ö+õó)äiôÒíîÜ
ÑÐ Û Ö;ÝÜ
âå4×Ø1æá ÑÕ ÐÑÝIéÝÜ Û Ø1ÐèIï;Ì×Ùá Û Ö+õÕ ×ÜKá ï?ì Ú
éÝÜ Û Ø1Ðl×1ÖOÑÜKØ1ÍԐÑUíîÜ
ÑÐ Û Ö;ÝÜ
âå4×Ø1æá ÑÕ Ð1ÑÝIéÝÜ Û Ø1ÐèIï;Ü6ÑÐ Û Ö;ÝÜ
âÕ ×ÖOÑÜKØ1ÍÔeÑï?ì Ú
éÝÜ Û Ø1ÐlÌÍÖOÖ;öÓÜ6æíîÜ6ÑÐ Û Ö;ÝÜ
âå4×Ø1æá ÑÕ Ð1ÑÝIéÝÜ Û Ø1ÐèIï;Ü6ÑÐ Û Ö;ÝÜ
âÕ ÌÍÖOÖ;öÓÜ6æï?ì Ú
éÝÜ Û Ø1ÐeÑØ1æÌÓ Û ØÝ_íîÜ6ÑÐ Û Ö;ÝÜ
âå4×Ø1æá ÑÕ ÐÑÝIéÝÜ Û Ø1ÐèIïÑØ1æÌÓ Û ØÝï?ì Ú
éÝÜ Û Ø1ÐlÏ@Ñâ÷ Û á ÑUíîÜ6ÑÐ Û Ö;ÝÜ
âå×Ø1æá ÑÕ ÐÑÝIéÝÜ Û Ø1ÐèIï;Ï@Ñ@âÕ ñ Û á Ñï?ì Ú
øOù%ú äiû×Ùá Û Ö+õ1ÑÜiÌ×Ùá Û Ö+õ1ÑÜRíîØ1Ñ@ö øOù%ú äiû×Ùá Û Ö+õ1ÑÜKèKì Ú
Ì1×Ùá Û Ö+õ1ÑÜIÕ ÔeÍÏ@Ñð4ÓØØ1ÑÎOÝ Û ÓØè ò×1ÑÜ
âó#äiôOüÌ×Ùá Û Ö+õó#äiô+ì Ú
éÝÜ Û Ø1ÐlÏ@ÑâlíîÌ×Ùá Û Ö+õ1ÑÜIÕ Ñ@à1ÑÎ2×ÝKÑû×Ùá Û Ö+õ.èI×1ÖOÑÜKØ1ÍÔeÑüÌÍÖOÖ;öÓÜ6æ1üÑØ1æÌÓ Û ØÝIì Ú
ÝÜ
â
ç
÷ Û á ÑýîÜ Û ÝKÑÜ$Ó×Ý_ífØ1Ñ@öþ÷ Û á ÑýîÜ Û ÝKÑÜKèIÏ@Ñâ÷ Û á Ñ1ì Ú
Ó×Ý?Õ ö.Ü Û Ý ÑèIÏ@Ñâ1ì ÚÿÓ×Ý?Õ ñKá ×1Ö+õèKì Ú Ó×Ý?Õ Î2á Ó1ÖOÑèKì Ú
 ÎTÍÝKÎ2õ.è+àÎTÑÌÝ Û ÓؐÑ@àì éâÖ;ÝKÑ1ÔUÕ Ó×ÝÕ ÌÜ Û ØÝá Øè Ñ@à4Õ ÐÑÝÑÖOÖOÍÐÑèKìIì Ú
 ç



œ œ

17
OrgPublisher
• El programa “OrgPublisher” comienza cargando los valores de las
propiedades del fichero “CoffeeRegistry.properties”.

• A continuación el programa instancia una clase de utilidades


“-$;53XEOLVKHU”.

• “OrgPublisher” se conecta al registro invocando el método “makeConnection”


de “JAXRPublisher”.

• Para publicar el servicio, “OrgPublisher” llama al método “executePublish”,


que acepta como entrada el nombre del usuario, la clave y un punto de fin.
– El username y passwd son requeridos por el Servidor de Registro.
– El punto de fin es la URL que los usuarios remotos usarán para contactar
con el servicio JAX-RPC.

• El método “executePublish” de JAXRPublisherdevuelve una clave que


identifica de manera única el servicio en el registro.

• OrgPublisher guarda esta clave en un fichero texto llamado “orgkey.txt”.

œ6

JAXRPublisher.java
• En primer lugar, el método “makeConnection” crea una conexión al Servidor
de Registro. Debe especificar algunas propiedades de conexión usando la
URL de query y de publicación desde “CoffeeRegistry.properties”.

Properties props = new Properties();


props.setProperty("javax.xml.registry.queryManagerURL", queryUrl);
props.setProperty("javax.xml.registry.lifeCycleManagerURL", publishUrl);

• A continuación, el método “makeConnection” crea la conexión usando las


propiedades:
ConnectionFactory factory = ConnectionFactory.newInstance();
factory.setProperties(props);
connection = factory.createConnection();

• El método “executePublish” tiene tres argumentos: username, passwd y URl


final. Comienza por obtener un objeto “RegistryService”, después un objeto
“BusinessQueryManager” y finalmente un objeto “BusinessLifeCycleManager”
que permite realizar queries y manejar datos del registro.
rs = connection.getRegistryService();
bqm = rs.getBusinessQueryManager();
blcm = rs.getBusinessLifeCycleManager();
œ ž

18
JAXRPublisher.java
• Como es necesario identificarse por clave para publicar datos, utiliza el username y
passwd para establecer
ù Û
lasÛ credenciales:
ù ù Û Û
û1ÍÖOÖ;öÓÜ6æ ×ÝIõ1ÑØÝ ÎTÍÝ ÓØ.ÌÍÖOÖ;öæ ×Ýõ"ífØ1Ñ@öþû1ÍÖOÖ;öÓÜ6æ ×Ýõ1Ñ1ØÝ ÎTÍÝ ÓØè
×1ÖOÑÜKØ1Í1ÔeÑüÌÍÖOÖ;öÓÜ6æ4Õ Ý Ó1ð$õ1ÍÜ ù KÜ Ü6ÍâèKìIì Ú
é1Ñ@ÝiÎ2Ü6ÑæÖÃíîØÑ
ö 0ÍÖ+õé1ÑÝèKì6Ú
Î2Ü6ÑæÖ2Õ ÍææèIÌÍÖOÖ;öæ ù ×Ýõì Ú
ÎTÓØØÑÎOÝ Û ÓØÕ ÖOÑÝ ð$Ü6ÑæÑ1ØÝ Û Íá Ö+è Î2Ü6ÑæÖTì Ú

• Crea un objeto “2UJDQL]DWLRQ” con el nombre “-$;53&&RIIHH'LVWULEXWRU” y


utiliza un objeto tipo User que servirá como primer contacto.

§T­K°³2¨ ¯?§2À³@¥O«¬ §QË@³2¥O«¬ § §T­K°³2¨ ¯?§@À³2¥O«¬ §2¼ Å@§;¦ À1³2¥O«¬ §2±o¯°¹]¼ ­;³2¥@¼ ¯OË2¼ Æ@°2© © §T§ §OŤ ­ ¦ ¨ ¾6·
°¨  Å eË2¬ ¯O¹¼ ¯O¨ §O£O¦
§TÉ$¨ Å2£@¥2¤ ª£O¦ ¤ °¥2±6Ë2³@¥O«¬ §2¼ Å2§O¦
²T¦K¨o¤ ¥Oűo°¨ ż ¥O£¹_§6·
·
µK¥;¦
§@¨o¥O£O¦ ¤ °¥O£@¬ ²T¦ ¨o¤ ¥OÅ] ­ eË2¬ ¯T¹]¼ ¯O¨ §O£O¦
§+µI¥;¦
§2¨
¥O£O¦ ¤ °¥O£@¬ ²+¦ ¨o¤ ¥OÅ
±6Ë2³@¥O«¬ §2¼ Å@§;¦
²T¦K¨o¤ ¥OÅ
± o°¨ ż «2§+­K¯O¨o¤ ´;¦ ¤ °¥
·6·
 °¨ ż ­K§O¦ §T­K¯T¨o¤ ´;¦ ¤ °¥+±o­·  
­K§@¨´2¨o¤ ¹R£¨ ¾TÆ@°¥;¦o£T¯I ¦ .Ë2¬ ¯O¹]¼ ¯O¨ §O£O¦
§ ­I§@¨(±
 · 
ÊT§@¨ ­K° ¥ £@¹_§Q ´ £@¹_ § eË2¬ ¯O¹¼ ¯O¨ §O£O¦
§2Ê+§@¨ ­K° ¥ £@¹_§+±6Ë@³2¥O«¬ §@¼ Å2§;¦
²+¦ ¨o¤ ¥OÅ ±  ´T§2¨(­K°¥2¼ ¥O£@¹_§6·
·
´2¨o¤ ¹R£@¨ ¾TÆ@°¥;¦o£T¯I¦ ¼ ­I§;¦KÊ+§2¨ ­K°
¥ £@¹_§2±6 ´ £@¹R§+ · 

œ Ÿ

JAXRPublisher.java
• Proporciona al objeto “JAXRPCCoffeeDistributor” una clasificación basada
en North American Industry Classification System (NAI CS). En concreto se
utilizará la clasificación de “Other Grocery and Related Products
Wholesalers".
ð$á ÍÖOÖ Û ñ Û ÎTÍÝ Û ÓؐÎ2á ÍÖOÖ Û ñ Û ÎTÍÝ Û ÓØ"íîè ð$á ÍÖOÖ Û ñ Û ÎTÍÝ Û ÓØì
Ùá Î2ÔUÕ Î2Ü6ÑÍÝKÑð$á ÍÖOÖ Û ñ Û ÎTÍÝ Û ÓØè Î2é1Î2õ1ÑÔeÑü
Ù×Ø1æá ÑÕ Ð1ÑÝIéÝÜ Û Ø1ÐèIïÎ2á ÍÖOÖ Û ñ Û Î+ÍÝ Û ÓØÕ Ø1ÍÔeÑ1ï?ì ü
Ù×Ø1æá ÑÕ Ð1ÑÝIéÝÜ Û Ø1ÐèIïÎ2á ÍÖOÖ Û ñ Û Î+ÍÝ Û ÓØÕ ßÍá ×1Ñï?ìIì Ú
ð4Óá á ÑÎOÝ Û ÓؐÎ2á ÍÖOÖ Û ñ Û ÎTÍÝ Û ÓØ1ÖÃíîØ1Ñö ù ÜKÜ6Íâô Û Ö;ÝèKì Ú
Î2á ÍÖTÖ Û ñ Û ÎT
Í Ý Û ÓØ1Ö2Õ Í1ææè Î@á ÍÖTÖ Û ñ Û ÎTÍÝ Û ÓØì Ú
ÓÜ6Ð4Õ Íææð$á ÍÖOÖ Û ñ Û ÎTÍÝ Û ÓØ1Ö+èKÎ2á ÍÖTÖ Û ñ Û ÎTÍÝ Û ÓØ1ÖTì Ú

• Seguidamente añade el servicio “JAX-RPC” denominado “JAXRPCCoffee


Service” y le hace el bind. La URI del servicio para que accedan los cliente
es:

KWWSORFDOKRVWMD[USFFRIIHHVXSSOLHUMD[USF6XSSOLHU,)
œ  

19
JAXRPublisher.java
Collection services = new ArrayList();
Service service = blcm.createService(bundle.getString("service.name"));
InternationalString is = blcm.createInternationalString
(bundle.getString("service.description"));
service.setDescription(is);
/ / Create service bindings Collection serviceBindings = new ArrayList();
ServiceBinding binding = blcm.createServiceBinding();
is = blcm.createInternationalString (bundle.getString("service.binding"));
binding.setDescription(is);
try { binding.setAccessURI(endpoint);
} catch (JAXRException je) {
throw new JAXRException("Error: Publishing this " + "service in the registry has
failed because " + "the service has not been installed on Tomcat.");
} serviceBindings.add(binding);
/ / Add service bindings to service
service.addServiceBindings(serviceBindings);
/ / Add service to services, then add services to organization
services.add(service);
org.addServices(services);
œ ¡

Servicio Distribuidor -$;0


• Realiza las gestiones para el intercambio de mensajes entre
el distribuidor y el Coffee Break.

– Que tipo de mensajes se mandarán.


– El formato de esos mensajes.
– Que tipo de envío de mensajes realizarán (full-half..).

• El servidor del &RIIHH %UHDN envía dos tipos de mensajes:


– Petición de precios actuales al mayorista
– Peticiones de café de los clientes de Coffee Break

• El mayorista de cafés JAXM responde con dos tipos de


mensajes:
– Lista de precios actuales
– Confirmación de pedidos.
œ ™

20
Servicio Distribuidor -$;0
• Todos los mensajes intercambiados deben seguir una estructura
XML especificada en un DTD para cada tipo de mensaje.

• Esto permite intercambiar mensajes incluso cuando cada uno


utiliza formatos diferentes en sus documentos.

• Los cuatro tipos anteriores se especifican en los siguientes DTD:


• request-prices.dtd
• price-list.dtd
• coffee-order.dtd
• confirm.dtd
• Todos los mensajes intercambiados deben seguir una estructura
XML especificada en un DTD para cada tipo de mensaje.



price-list.xml
! " )ð$# %iû$ ÌÜ Û ÎTÑ & á Û Ö;Ý
ûó)å%ô'  ð"ï & (( é×Ø) Û Î2Ü6Ó1Ö;âÖ;ÝKÑ1ÔeÖ;ü*;Ø1Î@Õ (+(+" # " ÌÜ Û ÎTÑô Û Ö;Ý (+( -,)ï
ï õÝ ÝÌ . (+( Þ Í@ßÍÕ Ö+×ØÕ ÎTÓÔ ( öÒÑÙÖOÑÜ
ß Û ÎTÑÖ ( æ1ÝKæÖ ( ÌÜ Û ÎTÑ & á Û Ö;Ý?Õ æ1ÝKæ ï'/
 ÌÜ Û ÎTÑ & á Û Ö;Ý
 ÎTÓñoñ6ÑÑ /
 ÎTÓñ
ñ6ÑÑ & Ø1Í1ÔeÑ / ù Ü6ÍÙ Û ÎTÍ 0( ÎTÓñ
ñ6ÑÑ & Ø1ÍÔÑ /
 ÌÜ Û ÎTÑ /2$ 1 Õ 354 0( ÌÜ Û ÎTÑ /
( ÎTÓñ
ñ6ÑÑ /
 ÎTÓñoñ6ÑÑ /
 ÎTÓñ
ñ6ÑÑ & Ø1Í1ÔeÑ / 0 Ó×1ÖOÑå4á ÑØ1æ 0( ÎTÓñ
ñ
ÑÑ & Ø1ÍÔeÑ /
 ÌÜ Û ÎTÑ /6 3 Õ 4*4 0( ÌÜ Û ÎTÑ /
( ÎTÓñ
ñ6ÑÑ /
 ÎTÓñoñ6ÑÑ /
 ÎTÓñ
ñ6ÑÑ & Ø1Í1ÔeÑ / @  Ö+ÌÜ6ÑÖOÖOÓ 0( ÎOÓñ
ñ6ÑÑ & Ø1Í1ÔeÑ /
 ÌÜ Û ÎTÑ /6 3 Õ 4*4 0( ÌÜ Û ÎTÑ /
( ÎTÓñ
ñ6ÑÑ /
 ÎTÓñoñ6ÑÑ /
 ÎTÓñ
ñ6ÑÑ & Ø1Í1ÔeÑ / " ÓÜ6ÍæÍ 0( ÎTÓñoñ6ÑÑ & Ø1ÍÔÑ /
 ÌÜ Û ÎTÑ /84 7 Õ 4*4 0( ÌÜ Û ÎTÑ /
( ÎTÓñ
ñ6ÑÑ /
0( ÌÜ Û ÎTÑ & á Û Ö;Ý /



21
Cliente -$;0
• El servidor Coffee Break es un cliente JAXM envía una petición al
distribuidor JAXM.

• Como se está usando el formato de request-response del sistema de


mensajes JAXM, las aplicaciones cliente utilizan el método
SOAPConnection para enviar mensajes.

SOAPMessage response = con.call(request, endpoint);

• El cliente tiene dos tareas importante s arealziar:


– Crear y enviar la petición
– Extraer el contenido de la respuesta.
• Estas tareas las realizan las clases PriceListRequest y OrderRequest.

9

Cliente -$;0

• &UHDU\(QYLDUODSHWLFLyQSDUDREWHQHUXQDOLVWDDFWXDOL]DGD
– La lista es obtenida por el método getPriceList de PriceListRequest.

– El método “JHW3ULFH/LVW” comienza por crear la conexión para hacer la


petición.
– A continuación obtiene un objeto “0HVVDJH)DFWRU\´ por defecto de forma
que puede crear un mensaje tipo SOAPMessage.

SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();


SOAPConnection con = scf.createConnection();
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage msg = mf.createMessage();

– Luego accede al objeto “62$3(QYHORSH”, que será utilizado para crear un


objeto “1DPH´ para cada nuevo elemento que se crea y para acceder al
objeto “62$3%RG\”, donde se pondrá en contenido del mensaje.

SOAPPart part = msg.getSOAPPart();


SOAPEnvelope envelope = part.getEnvelope();
SOAPBody body = envelope.getBody();

:

22
Cliente -$;0
• El fichero “UHTXHVWSULFHGWG´ especifica que el elemento más alto en
la jerarquía es “UHTXHVWSULFHV´ y que contiene un elemento
“UHTXHVW´.

• El texto añadido a request es el texto a enviar con la request.

• Cada elemento nuevo que se añada a un mensaje deberá tener un


objeto “1DPH” para identificarlo, el cual es creado por el método
createName de “(QYHORSH´.

1DPH ERG\1DPH HQYHORSHFUHDWH1DPH UHTXHVWSULFHV


5HTXHVW3ULFHVKWWSVRQDWDFRIIHHEUHDNFRP 
62$3%RG\(OHPHQW UHTXHVW3ULFHV 
ERG\DGG%RG\(OHPHQW ERG\1DPH 



Cliente -$;0
• En las siguientes líneas se añade al elemento “request-prices” (representado por
SOAPBodyElement requestPrices. Entonces se añade un nuevo nodo de texto conteniendo
el texto de la petición.
ÖOÍßÑð%õ1ÍØ1ÐÑÖ=<
• Como no hay más elementos en la request, el código llama al método “
sobre el mensaje a guardar.
,iÍÔeÑeÜ
Ñò×1ÑÖ;Ý,iÍÔeÑlícÑØßÑá ÓÌÑÕ Î2Ü6ÑÍÝKÑ5,iÍÔeÑèIï;Ü
Ñò×1ÑÖ;Ýï?ì Ú
é- ù û$á ÑÔeÑ1ØÝ)Ü
Ñò×1ÑÖ;Ý_íîÜ6Ñò×ÑÖ;Ý?ûÜ Û ÎTÑÖ2Õ Íææð$õ Û á æ>á ÑÔeÑØÝèIÜ6Ñò×1ÑÖ;Ý?,iÍ1ÔeÑ1ì Ú
Ü6Ñò×1ÑÖ;Ý?Õ Íææ-#Ñ@àÝ?,iÓ1æÑèIï?é1Ñ1Ø1æl×ÌæÍÝKÑælÌÜ Û ÎTÑeá Û Ö;Ý?Õ ï?ì Ú
ÔeÖOÐ4Õ ÖOÍßÑð$õ1Í1Ø1ÐÑÖ+èKì Ú

• Una vez creado el mensaje, ese envía el mensaje al suministrador de café JAXM.
é- ù û1ð4ÓØØ1ÑÎOÝ Û ÓØ5< é- ù û$ÑÖOÖOÍÐÑ-<
• @ElÔemensaje
ÖOÐ*< enviado vía el objeto “ es el objeto tipo “
, y el destino es la URI del suministrador JAXM.
ó)äiôQÑØ1æÌÓ Û ØÝQífØ1Ñ@ö ó)äiô2ècï;õÝ6ÝÌ . (+( á Ó1ÎTÍá õ1Ó1Ö;Ý . A 4 A 4 ( Þ ÍàÔ & ÎTÓñoñ6ÑÑ &
Ö+×ÌÌá Û ÑÜ ( ÐÑÝ?ûÜ Û ÎTÑô Û Ö;Ýï?ì Ú
é- ù û$ÑÖOÖOÍÐÑeÜ6ÑÖ+ÌÓØ1ÖOÑUíjÎTÓØÕ ÎTÍá á èIÔeÖOÐ1üÑØ1æÌÓ Û ØÝIì Ú
ÎTÓØÕ Î2á Ó1ÖOÑèKìKÚ

ÎTÍá á ûÜ Û ÎTÑô Û Ö;ÝIé1ÑÜ


ßá ÑÝ
• Cuando se ejecuta el método “ ”é-, Tomcat ejecuta
ù û*ÇÑÖOÖOÍÐÑ el servlet “ ”. Este
servlet crea y devuelve un objeto “ ” cuyo contenido es la lista precios de
los distribuidores JAXM.
;

23
Cliente -$;0
• 2EWHQHUODOLVWDGHSUHFLRV
– En esta parte se realizan las siguientes tareas:
• Recuperar la lista de precios de la respuesta, el objeto “SOAPMessage” devuelto
por el método call. ûÜ Û ÎTÑô Û Ö;Ý?åÑÍØ
• Devolver la lista de precios como un bean tipo “ ”.

• Se crea un objeto tipo Vector vacío que contendrá los elementos “coffee-name” y “price”
que han sido extraidos de la respuesta.
é- ù ûåÓ1æ1â-<
• De la respuesta se accede al objeto “ , que contiene el contenido del mensaje.
C  Ñ ÎOÝKÓÜiá Û Ö;ÝQíîØ1Ñ@ö C ÑÎOÝKÓÜKèKì Ú
é- ù ûåÓ1æ1âeÜ6ÑÖ+ÌÓØ1ÖOÑåÓ1æ1âlí
Ü6ÑÖ+ÌÓØ1ÖOÑÕ ÐÑÝIé- ù ûû1ÍÜ
ÝèKì?Õ ÐÑÝ?ØßÑá ÓÌÑèKì?Õ ÐÑÝ?åÓ1æâèKì Ú

• El siguiente paso consiste en recuperar el objeto “SOAPBodyElement”.


ÐÑÝKð$õ Û á æ>á ÑÔeÑ1ØÝKÖ=<
• El método “ devuelve un objeto Û ÝED Iterator que contiene todos
é- ù ûåÓ1æ1â*los
á Ñ1ÔeÑØÝ
elementos
ÙÓ1æ1â*á hijos del elemento que fue llamado.
ÌÜ Û ÎTÑ & á Û Ö;ÝF< contiene el objeto
“ ”, que representa el elemento “ .
IÝKÑÜ6ÍÝKÓÜ Û ÝED.ífÜ6ÑÖ+ÌÓØ1ÖOÑåÓ1æ1âÕ Ð1ÑÝ ð$õ Û á æ>á ÑÔeÑØÝKÖ+èKì Ú
ö.õ Û á Ñeè Û ÝED1Õ õ1ÍÖ,iÑ@à1ÝèKìIì
é  ù ûåÓ1æ1â*á ÑԐÑØÝ)ç ÙÓ1æ1â*áíîèKé- ù 
- û åÓ1æ1â*á Ñ1ÔeÑØÝIì Û ÝED1Õ ØÑ@à1ÝIèKì

B

Cliente -$;0
• El objeto Iterator “LW” tiene los elementos hijo de bodyEl, que representa
elementos “FRIIHH´.

• Al llamar al método “QH[W´ con “LW” recuperamos el primer elemento de


“FRIIHH´ en el elemento “ERG\(O´. Si “LW” tiene otro elemento, el método
“QH[W” devolverá un nuevo elemento de “FRIIHH”
,WHUDWRU LW ERG\(OJHW&KLOG(OHPHQWV 
ZKLOH LWKDV1H[W ^
62$3(OHPHQW FKLOG  62$3(OHPHQW LWQH[W 

• Para coger los valores de los elementos:

Iterator it3 = child2.getChildElements();


while (it3.hasNext()) {
SOAPElement child3 = (SOAPElement)it3.next();
String value = child3.getValue();
list.addElement(value);
}
}
}

G

24
Cliente -$;0
• El siguiente paso es poner en un $UUD\/LVW SULFH,WHPV los nombres de los
cafés y sus precios. Devolverá un bean tipo “3ULFH/LVW%HDQ´.

ArrayList priceItems = new ArrayList();


for (int i = 0; i < list.size(); i = i + 2) {
priceItems.add(new PriceItemBean(list.elementAt(i).toString(), new
BigDecimal(list.elementAt(i + 1).toString())));
System.out.print(list.elementAt(i) + " ");
System.out.println(list.elementAt(i + 1));
}
Date today = new Date();
Date endDate = DateHelper.addDays(today, 30);
PriceListBean plb = new PriceListBean(today, endDate, priceItems);

H

3HGLGRGH&DIp
• El otro tipo de mensaje que el servidor Coffee Break puede enviar al
distribuidor JAXM es la petición de café.

• Esto se lleva a cabo con el método “SODFH2UGHU´ de


“2UGHU5HTXHVW” según el DTD “FRIIHHRUGHUGWG”

• &UHDUHOSHGLGR

– Como en el caso del cliente que requiere una lista de precios, el


método “SODFH2UGHU´ comienza creando un objeto
“62$3&RQQHFWLRQ´, un objeto “62$30HVVDJH”, y accediendo a
los objetos “62$3(QYHORSH´ y “62$3%RG\”.
62$3&RQQHFWLRQ)DFWRU\ VFI 
62$3&RQQHFWLRQ)DFWRU\QHZ,QVWDQFH 
62$3&RQQHFWLRQ FRQ VFIFUHDWH&RQQHFWLRQ 
0HVVDJH)DFWRU\ PI 0HVVDJH)DFWRU\QHZ,QVWDQFH 
62$30HVVDJH PVJ PIFUHDWH0HVVDJH 
62$33DUW SDUW PVJJHW62$33DUW 
62$3(QYHORSH HQYHORSH SDUWJHW(QYHORSH 
62$3%RG\ ERG\ HQYHORSHJHW%RG\ 
I

25
3HGLGRGH&DIp
• A continuación, se crean y añaden elementos XML a la petición.
• Como es requerido, el primer elemento es un “62$3%RG\(OHPHQW´,
en este caso un “FRIIHHRUGHU”.

Name bodyName = envelope.createName("coffee-order",


"PO", "http:/ / sonata.coffeebreak.com");
SOAPBodyElement order = body.addBodyElement(bodyName);

• La aplicación añade el siguiente nivel de los elementos, poniendo


primero “RUGHU,'”.
• El valor dado a “RUGHU,'” se obtiene del objeto “2UGHU%HDQ´
pasado al método “2UGHU5HTXHVWSODFH2UGHG´.
Name orderI DName = envelope.createName("orderI D");
SOAPElement orderID = order.addChildElement(orderIDName);
orderID.addTextNode(orderBean.getId());

;

3HGLGRGH&DIp
• El siguiente elemento “FXVWRPHU” tiene varios
hijos con información del usuario-cliente. Esta
información está en el bean “2UGHU%HDQ”.
J>K LNMO=P Q R S5J>K LNMTUM+VWM+R X YM+Z O=[\M'K]M+J^K+LNM_F`O=ab]X LNM+[`cd
e fhghi-j R MLNM+V]>O=ab]X-LNM+[hTUX-[kS M+[Z KS S+l$P Q R S j R MLNM+V]_O=P Q R S5J^K+LNM'cd
+
O=P Q R S5J>K LNMTUM+VWM+R X YM+Z O=[\M'K]M+J^K+LNM_F`R Kb]mVK LNM+`cd
e+fhghi-j R MLNM+V]hR Kb]J>K LNMTUO=ab]X LNM+[Z KS S l$P+Q R S j R MLNM+V]_O=P Q R S5J>K+LMcd
R Kb]FJ>K+LNM+Z KS Sn M'o]J>X+S M_X-[kS M+[p M'K V Z q M']l$ab]X LNM+[\_cZ'q M']Fr?Kb]FJ>K LNM_ccd
O=P Q R S5J>K LNMTUM+VWM+R X YM+Z O=[\M'K]M+J^K+LNM_F`sQ [\b]mVK+LNM+`cd
e+fhghi-j R MLNM+V]$sQ [\b]J^K+LNMtTUO=ab]X LNM+[Z KS S l$P+Q R S j R MLNM+V]_O=P Q R S5J>K+LMcd
sQ [\b]FJ^K+LNM+Z KS+Sn M'o]J^XS M_X-[\S M+[p+MK V Z q M']l$ab]X LNM+[\_cZ q M']u'Q [\b]J^K+LM_ccd
O=P Q R S5J>K LNMTUM+VWM+R X YM+Z O=[\M'K]M+J^K+LNM_F`Y PX-VMmV a LtvM+[`cd
e+fhghi-j R MLNM+V]hY PX-VM+Ja+LtvM+[hTUOEab]X-LNM+[Z KS S l$P+Q R S j R MLNM+V]_O=P Q R S5J>K LNM'cd
Y PX-VM+Ja LvM+[Z KS Sn M'o]J>X+S M_X-[kS+M+[p MK V Z q M']l$ab]X-LNM+[\_cZ q M'] i PX-VM+Ja+LtvM+[\_ccd
O=P Q R S5J>K LNMTUM+VWM+R X YM+Z O=[\M'K]M+J^K+LNM_F`M+LK Q R m\KS+S5[\Mb?bE`cd
e+fhghi-j R MLNM+V]>M+LK Q R g S S5[\Mb?bTUOEab]X-LNM+[Z KS S l$P+Q R S j R MLNM+V]_O=P Q R S5J>K LNM'cd
M+LNK Q R g S+S5[\Mb?bEZ KS+Sn M'o]J^XS M_X-[\S+M+[p MK V Z q M']l$ab]X-LNM+[\_cZ q M'] j LNK Q R g S S5[\Mb?bw_ccd
Z Z KS S5[\Mb?by Z Z y+OwKs\z'y+O?K V]Q S+KS{|Y [\MO=Q X
x x x)x

;F

26
3HGLGRGH&DIp
• Una vez completado el mensaje, la aplicación lo
envía y cierra la conexión.

URL endpoint = new URL( "http:/ / localhost:8080/ jaxm-


coffee-supplier/ orderCoffee");
SOAPMessage reply = con.call(msg, endpoint);
con.close();

;9

&OLHQWH:HE«

;:

27

Potrebbero piacerti anche