Escolar Documentos
Profissional Documentos
Cultura Documentos
Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/
DOCUMENTOS WSDL
La forma correcta de bajar el wsdl desde xmethods es dando clic con botón derecho
sobre el vínculo del URL del wsdl e indicando “Guardar destino como …”
Para guardar el wsdl bajado desde xmethods.net, ponga el nombre del archivo entre
comillas dobles “AgenteelCP.wsdl”, asegúrese que la extensión quede como “wsdl” y
que tipo sea “Todos los archivos”
C:\wsdk_v5\bin\AgenteelCP.wsdl
A new Web-Service "Agenteel" has been created successfully in the project direct
ory C:\WSDK_v5\bin\Agenteel.
To complete the Web-Service, you can now fill in your implementation code in the
following classes:
AgenteelCodigoPostalBindingImpl.java
C:\WSDK_v5\bin>
Y con ello se creó el fólder “Agenteel” con una secuencia de subcarpetas. En esa
carpeta, descienda hasta encontrar el archivo “compile.bat” y duplíquelo, ahora con el
nombre de “compile2.bat”.
@echo off
set USER_CLASSPATH=
set
SYSTEM_CLASSPATH=C:\WSDK_v5\appserver\lib\axis.jar;C:\WSDK_v5\appserver
\lib\commons-logging-
api.jar;C:\WSDK_v5\appserver\lib\j2ee.jar;C:\WSDK_v5\appserver\lib\jaxrpc.jar;C:\W
SDK_v5\appserver\lib\qname.jar;
"C:\WSDK_v5\appserver\java\bin\javac" -classpath
"%SYSTEM_CLASSPATH%;%USER_CLASSPATH%"
C:\WSDK_v5\bin\Agenteel\Agenteel\agenteelcodigopostal\*.java
client-side\
C:\WSDK_v5\bin\Agenteel\Agenteel\ client-side\agenteelcodigopostal\*.java
Entérese que se trata que compile2.bat encuentre los archivos *.java que se encuentran
en la rama client-side, de allí, la necesidad de crear este ruta en específico. Ahora,
guarde los cambios hechos en compile2.bat
A partir de la rama client-side, descienda hasta encontrar los archivos *.java y allí, con
ellos, cree el cliente que consumirá el servicio Web, con el nombre Client.java. Este
deberá programarse, por ejemplo, usando JCreator a partir del siguiente formato:
package XXX;
Creamos el objeto “loc” en base a la clase del archivo *locator.java, que para este
específico caso se llama:
AgenteelCodigoPostalServiceLocator.java
Ahora, declaramos el objeto “port” con base en la clase del archivo *portType.java o
*port.java, que para este específico caso se llama:
AgenteelCodigoPostalPort.java
AgenteelCodigoPostalPort port = …
En esa misma línea de código, instanciamos al objeto “port” con base a un método
“get” del objeto “loc” antes creado
public AgenteelCodigoPostal.AgenteelCodigoPostalPort
getAgenteelCodigoPostalPort() throws javax.xml.rpc.ServiceException
package ….;
….
….
}
catch(Exception e) { }
}
}
Del archivo del cual se obtuvo la clase para declaración del objeto “port” podemos
copiar el package, para nuestro Client.java:
package AgenteelCodigoPostal;
Note que el package desciendo de la rama “client-side”, y aunque en ese caso solo se
presenta un nivel de descenso, en otros casos, la ruta de descenso del package es más
extensa.
Clic sobre JDK Versión 1.5.0_06 (que en este caso es el java que se instaló), el cual
debe resaltarse en color azul, y a continuación oprimimos el botón “Edit”, “Add” y
luego elegimos el botón “Path”
Damos “Aceptar”
Sin embargo, JCreator agregará este Path hasta el final de una serie de elementos:
Allí, con nuestro “Path” remarcado en azul, súbalo hasta el tope, con el botón “Up”.
Vea que este ilustración ya aparecen agregados los elementos tales como:
webservices.jar, úname.jar, axis.jar, etc. Sin embargo, si es su primera experiencia con
la creación de Clientes, entonces JCreator no le va a presentar dichos elementos, hay
que agregarlos:
Los elementos que deben agregarse están señalados en el archivo compile2.bat que
antes se mostró:
@echo off
set USER_CLASSPATH=
set SYSTEM_CLASSPATH=C:\WSDK_v5\appserver\lib\axis.jar;
C:\WSDK_v5\appserver\lib\commons-logging-api.jar;
C:\WSDK_v5\appserver\lib\j2ee.jar;
C:\WSDK_v5\appserver\lib\jaxrpc.jar;
C:\WSDK_v5\appserver\lib\qname.jar;
"C:\WSDK_v5\appserver\java\bin\javac" -classpath
"%SYSTEM_CLASSPATH%;%USER_CLASSPATH%"
C:\WSDK_v5\bin\Agenteel\Agenteel\agenteelcodigopostal\*.java
Compile2.bat nos indica que dichos elementos deben agregarse, y además nos dice la
ruta donde encontrarlos:
axis.jar;
commons-logging-api.jar;
j2ee.jar;
jaxrpc.jar;
qname.jar;
webservices.jar
commons-discovery.jar
De modo, que para nuestro primer ejercicio de creación de Cliente para un wsdl,
JCreator debe presentar un Path y siete archivos *.jar incrustrados:
Y la forma de agregar, dichos *.jar es a traves del botón “Add” y luego “Add archive”
Y se procede a extraer los *.jar, uno a uno, desde la ruta que nos indicó el archivo
“compile2.bat”. Recuerde que el Path con el que se desea trabajar, debe quedar en
primerísimo posición. En esta ocasión no existiría conflicto dado que éste es único. Sin
embargo, cuando se trabaje con dos o más Client.java para diversos wsdl, JCreator solo
invocará al primer Path que encuentre, de allí que el de interés debe estar en primera
posición.
Siempre aplique el botón “Apply”, y luego el botón “OK” que se indica durante el
proceso anterior.
Ahora, los métodos que nos proporciona el servicio Web, se obtienen del objeto “port”
y dado que éste deriva de la clase *PortTye.java allí encontraremos los métodos de
“port”.
/**
* AgenteelCodigoPostalPort.java
*
* Este archivo se ha generado automáticamente a partir de WSDL
* por el emisor de Apache Axis WSDL2Java.
*/
package AgenteelCodigoPostal;
public AgenteelCodigoPostal.CPResult[]
getCodigoPostalFromAsentamiento(AgenteelCodigoPostal.AsentamientoQuery elasentamiento) throws
java.rmi.RemoteException;
public AgenteelCodigoPostal.AgenteelMessageResult
getMessageFromAgenteel(AgenteelCodigoPostal.AgenteelMessageQuery foo) throws java.rmi.RemoteException;
}
AgenteelCodigoPostal.CPResult[]
getCodigoPostalFromMunicipio(AgenteelCodigoPostal.MunicipioQuery
elasentamiento);
Vea que antes de invocar el método del objeto “port” requerimos dos variables. Una de
tipo: MunicipioQuery y otra que es un arreglo de tipo:
AgenteelCodigoPostal.CPResult[]
// ahora la instanciamos
elasentamiento. setMunicipio(“Orizaba”);
AgenteelCodigoPostal.MunicipioQuery elasentamiento;
elasentamiento = new AgenteelCodigoPostal.MunicipioQuery();
elasentamiento. setMunicipio(“Orizaba”);
AgenteelCodigoPostal.CPResult[] miarrayCPResul;
Abramos el archivo CPResul.java y descubramos que por ejemplo, esta clase posee un
método que se llama:
int getCodigoPostal()
El cual podemos aplicar al array obtenido para obtener los códigos postales.
Siempre tenga como REGLA que si un método devuelve un array, entonces este solo
debe declararse para cuando se invoque el método correspondiente este le otorgue el
tamaño correspondiente. Obviamente, yo no puedo instanciar un array con, digamos,
cinco elementos cuando el método tal vez me devuelva diez elementos.
package AgenteelCodigoPostal;
try
{
AgenteelCodigoPostalServiceLocator loc =
new AgenteelCodigoPostalServiceLocator();
AgenteelCodigoPostal.MunicipioQuery elasentamiento;
elasentamiento = new AgenteelCodigoPostal.MunicipioQuery();
elasentamiento.setMunicipio("Orizaba");
}
catch(Exception e){ }
}
Ahora solo nos resta desentrañar la información del array: miarrayCPResul cuyos
métodos se encuentran en el archivo: CPResult.java, dado que de allí proviene su clase.
package AgenteelCodigoPostal;
AgenteelCodigoPostal.CPResult[]miarrayCPResul;
// Vea que solo está declarada. Porque desconozco
// el tamaño que la invocación del método de "port" le asigne.
System.out.println
("***********Códigos Postales México, 16-dic-2006 ****************");
}
catch(Exception e){}
}
Se puede optar por, provisionalmente, usar JCreator para compilar, esto tiene la ventaja
que nos ilustra de errores en la codificación. Y como ya mencioné, en varios casos, la
compilación con JCreator será suficiente. Sin embargo, no siempre funciona y si
compilamos con él; ahora borre la carpeta que el compilar con JCreator crea y proceda a
compilar con compile2.bat.
Si no borra la carpeta que JCreator crea, entonces esta entrará en conflicto con la
compilación de “compile2.bat”
Si compile2.bat crea todas las clases exitosamente. Ahora use JCreator solo (solo) para
ejecutar el Client.java antes creado.
miclasePortType port = …
miclaseportType port = …
es decir,
throws javax.xml.rpc.ServiceException
4) Los métodos que proporciona el servicio son métodos que se invocan sobre el
objeto “port”, por tanto, se localizan en la clase de la cual deriva dicho objeto
“port”
miclaseportType port = …
http://services.javaportal.it/kservices/JIPNews.jws?wsdl
Recuerde la forma correcta de descargar el wsdl, este debe quedar con la extensión
*.wsdl, en caso que no presentara originalmente ésta.
**********************************************************************
C:\WSDK_v5\bin>dir j*wsdl
Directorio de C:\WSDK_v5\bin
C:\WSDK_v5\bin>
El sistema responde:
To complete the Web-Service, you can now fill in your implementation code in the
following classes:
JIPNewsSoapBindingImpl.java
C:\WSDK_v5\bin>
Con lo cual, ya tengo una carpeta con el nombre: JavaPortal con subcarpetas en el.
Con la novedad, que no se presenta un archivo *portType.java, por tanto, con block de
notas abro el wsdl (JavaPortalNews.wsdl ) y encuentro que:
<wsdl:portType name="JIPNews">
JIPNews es el archivo Java que me dira la clase para el objeto “port”, en la construcción
del Client.java
Vea que efectivamente, existe un archivo JIPNews.java, del cual extraigo el nombre de
la clase para la declaración de mi objeto “port”. Entonces, en JIPNews.java están los
métodos que proporcionan el servicio Web.
Por ejemplo:
Recuerda que el package se encuentran en el archive donde está la clase para el objeto
“port”, es decir, donde están los métodos del servicio:
package it.javaportal.www;
No basta con escribirlo en el Client.java, hay que indicarlo al entorno de JCreator, dicho
package
La selección del Path llega solo hasta client-side. Damos Aceptar, y con el botón Up
debemos subir nuestro Path hasta la cima.
No olvide que el JCreator debe tener incorporado ciertos archivos *.jar, tal como indica
el archivo “compile.bat”
IMPORTANTE:
Puede compilar con JCreator, unicamente para identificar errores y corregirlos, cuando
la compilación ya no encuentre errores y esta se haga exitosamente, proceda a borrar la
carpeta que junto a los *.java, JCreator crea. Y ahora compile con una copia de
compile.bat.
Vea la carpeta que creo la compilación con JCreator, “it”, proceda a eliminarla y
compile con una copia de compile.bat (compile2.bat) Pero antes, a compile2.bat debe
insertarse el elemento \client-side para que se encuentren los *.java a compilarse.
@echo off
set USER_CLASSPATH=
set SYSTEM_CLASSPATH=C:\WSDK_v5\appserver\lib\axis.jar;
C:\WSDK_v5\appserver\lib\commons-logging-api.jar;
C:\WSDK_v5\appserver\lib\j2ee.jar;
C:\WSDK_v5\appserver\lib\jaxrpc.jar;
C:\WSDK_v5\appserver\lib\qname.jar;
"C:\WSDK_v5\appserver\java\bin\javac" -classpath
"%SYSTEM_CLASSPATH%;%USER_CLASSPATH%"
C:\WSDK_v5\bin\JavaPortal\JavaPortal\client-side\it\javaportal\www\*.java
Compilamos con compile2.bat. Ahora se han creado los *.class junto a los *.java
package it.javaportal.www;
resultado = port.giveMe_EN(news_Number);
Para ahora si, utilizar el método ya con los argumentos preparados de antemano.
resultado = port.giveMe_EN(news_Number);
Ejercicio: hacer un cliente para el servicio Web: Ignyte's Retrieve Theaters and Movie
Showtimes de xmethods.
C:\wsdk_v5\bin
C:\WSDK_v5\bin>
wsdl2webservice -createservice theaters -project theater moviefunctions.wsdl
A new Web-Service "theaters" has been created successfully in the project direct
ory C:\WSDK_v5\bin\theater.
To complete the Web-Service, you can now fill in your implementation code in the
following classes:
MovieInformationSoapImpl.java
Con el mensaje anterior se indica que todo salió bien y se ha creado este contenido:
@echo off
set USER_CLASSPATH=
set SYSTEM_CLASSPATH=C:\WSDK_v5\appserver\lib\axis.jar;
C:\WSDK_v5\appserver\lib\commons-logging-api.jar;
C:\WSDK_v5\appserver\lib\j2ee.jar;
C:\WSDK_v5\appserver\lib\jaxrpc.jar;
C:\WSDK_v5\appserver\lib\qname.jar;
"C:\WSDK_v5\appserver\java\bin\javac" -classpath
"%SYSTEM_CLASSPATH%;%USER_CLASSPATH%"
C:\WSDK_v5\bin\theater\theaters\client-side\com\ignyte\www\*.java
Ahora, junto a los *.java del lado de client-side, creamos nuestro Client.java. Con el
procedimiento ya conocido:
Con la novedad que en la construcción del cliente, dado que no se presenta un archivo
*portType.java, entonces procedo a abrir, con block de notas, el documento wsdl y
busco la línea:
<wsdl:portType name="MovieInformationSoap">
A manera de estrategia, para poder usar el método de port que ofrece el servicio
propiamente dicho, primero atraiga la información del método de port con todo y
parámetros de envío y recepción y tengalos a la vista:
com.ignyte.www.ArrayOfTheater getTheatersAndMovies
(java.lang.String zipCode, int radius)
Ahora empieza desglosando sus miembros, por ejemplo, empiece a trabajar con los
parámetros de envío:
//com.ignyte.www.ArrayOfTheater
Aunque dice que es un array, estrictamente hablando no lo es, por tanto procede su
declaración e instanciación de una vez. (si fuera un array incluiría la expresión [])
Ahora sí, tiene los elementos preparados para usar el método del objeto “port”
com.ignyte.www.Theater[] getTheater()
Siguiendo la analogía, necesitamos preparar un objeto del tipo Theater[], ahora si array (
[ ] ) para poder usar el método:
Y cada vez que se genere un objeto por la aplicación de algún método sobre un objeto
existente, necesitamos ver la clase de que proviene, abrimos su archivo java y allí
encontramos sus respectivos métodos.
En el archivo java del cual provino el objeto port encontramos el package a utilizarse:
package com.ignyte.www;
Pero ya sabemos que no vasta con escribirlo, hay que indicarlo a JCreator en su entorno
de desarrollo
CONFIGURE / OPTIONS / JDK PROFILES / JDK Versión 1.5 (en mi caso) / Edit /
ADD / ADD PATH
Con el botón UP debemos subir nuestro PATH hasta el tope, ya que si no, JCreator
trabajaría con otro PATH.
Luego, recuerda que JCreator debe tener anexado estos ARCHIVOS que son jar
especificados por compile.bat, incluso en la figura siguiente aparecen dos más.
(compile.bat indica la ruta donde estos están)
Recuerde que conviene compilar con JCreator, solo para detectar y corregir errores en la
construcción del Client.java, una vez compilado con JCreator, porque ya no hay errores,
procedamos a borrar la carpeta que JCreatro crea
Vea la carpeta “com” creada por la compilación con JCreator, borrela y luego compile
con compile2.bat
El código de Client.java
package com.ignyte.www;
//com.ignyte.www.ArrayOfTheater
//com.ignyte.www.Theater[] getTheater()
miTheater = miArrayOfTheater.getTheater();
Cree una carpeta raiz para los proyectos clientes en JSP’s y en esa carpeta raiz coloque
la subcarpeta “Agenteel” para el proyecto de los códigos postales de México y en ésta,
las subcarpetas “classes” y “lib”, ambas en el mismo nivel de jerarquía.
Para este caso, el package solo tiene una carpeta que se llama “AgenteelCodigoPostal”
Por otra parte, a la subcarpeta “lib” copiamos los jar que utiliza JCreator, estos los
encontramos en la ruta que indica el archivo “compile.bat”
Ahora, sobre la raiz del proyecto agentel, es decir, la carpeta Agenteel, allí creamos, un
archivo indice.jsp que recibe parámetros de envío, y creamos un archivo invoke.jsp que
propiamente es el que invoca y presenta el servicio Web.
<body>
<div align="center">
<p><strong>Servicio Web de Agenteel </strong></p>
<form name="form1" method="post" action="invoke.jsp">
<p>Inserte el codigo Postal</p>
<p>
<input type="text" name="textfield">
</p>
<p>
<input type="submit" name="Submit" value="Enviar">
</p>
<p> </p>
</form>
<p><strong></strong> </p>
</div>
</body>
</html>
Este código:
<body>
<% String valorcp=request.getParameter("textfield");%>
<%
try
{
int codigo;
String asentamiento;
String tipo;
String municipio;
String estado;
String ciudad;
%>
<div align="center">
<p><strong>Resultado de la invocacion </strong></p>
<p> </p>
<table width="100%" border="1">
<tr bgcolor="#9999CC">
<td> <div align="center"><strong>Codigo Postal</strong></div></td>
<td> <div align="center"><strong>Asentamiento</strong></div></td>
<td> <div align="center"><strong>Tipo de asentamiento</strong></div></td>
<td> <div align="center"><strong>Minicipio</strong></div></td>
<td> <div align="center"><strong>Estado</strong></div></td>
<td> <div align="center"><strong>Ciudad</strong></div></td>
</tr>
<%
AgenteelCodigoPostal.CPResult[]
resultado=port.getCodigoPostalFromNumber(codigo2);
for(int i=0;i<resultado.length;i++)
{
codigo=resultado[i].getCodigoPostal();
asentamiento=resultado[i].getAsentamiento();
tipo=resultado[i].getTipoAsentamiento();
municipio=resultado[i].getMunicipio();
estado=resultado[i].getEstado();
ciudad=resultado[i].getCiudad();
%>
<tr>
<td><%=codigo%> <div align="center"></div></td>
<td><%=asentamiento%> <div align="center"></div></td>
<td><%=tipo%> <div align="center"></div></td>
<td><%=municipio%> <div align="center"></div></td>
<td><%=estado%> <div align="center"></div></td>
<td><%=ciudad%> <div align="center"></div></td>
</tr>
<%}
}catch(Exception e){}
%>
</table>
<p><strong></strong> </p>
</div>
</body>
</html>
Con estos elementos, ahora creamos un archivo *.WAR con la herramienta : Java(TM)
WebServices Developer Pack 1_0_01 Deploytool
El crear un archivo War para un sistema JSP tiene todo un procedimiento que
acontinuación de describe:
Un archivo war, por ejemplo, miwar.war da acceso a un sistema jsp sin importar donde
esté ubicada la carpeta que contiene dicho sistema. Siempre que sea ejecutado por la
herramienta con que se crea. (Más adelante veremos que podemos usar el TomCat de
Yakarta y poner mi war en la carpeta correspondiente para ejecutarlo con dicho TomCat
y no depender del TomCat de la herramienta original con la que creamos el war)
http://localhost:8080/miwar <intro>
1.- Instalar JBuilder 2005. Por que se requiere la máquina virtual y la de JBuilder 2005
es válida.
2.- Instalar jwsdp 1_0_01 …exe. El nombre oficial del programa es Java (TM) Web
Services.
EDIT
Busco la carpeta que contiene mi sistema JSP y selecciono todos sus archivos. O más
fácil, simplemente selecciono la carpeta raíz de mi sistema.
ADD
OK
NEXT
Elijo JSP
NEXT
JSP FileName: * En este punto, despliego ↓ y elijo mi archive JSP principal (index.jsp,
por ejemplo)
NEXT
FINISH
FILE REFS
ADD
Welcome Files.- doy clic en el espacio en blanco, despliego ↓ y elijo mi archivo JSP
principal (index.jsp)
Doy clic en
Server / localhost:8080
Ahora doy clic en la aplicación que yo cree. Por ejemplo, miwar y con el botón derecho
doy DEPLOY
CLOSE
Servers / localhost:8080
http://localhost:8080/miwar
Desventaja: Si se modifica algún JSP se requiere crear otro war con repetición del
proceso de creación del war.
Arrancar el Deploytool
Usuario: enrique
Clave: ADMIN
Busco la carpeta de mi proyecto (Agenteel) doy doble clic sobre ella, para desplegar su
contenido, y a continuación doy clic en el botón ADD, luego OK y NEXT
Elijo JSP
NEXT
NEXT
FINISH
Doy clic en pestaña FILE REFS luego en botón ADD, a continuación clic en espacio
en blanco de Welcome Files, despliego, y elijo index.jsp
Doy clic en Server / localhost:8080 y veo que mi aplicación todavía no está corriendo.
Ahora doy clic con botón derecho en mi aplicación Agenteel17dic y con botón derecho
doy DEPLOY
http://localhost:8080/Agenteel17dic
Cerrar el Deploytool
Cerra el TomCat de Java (TM) WebServices
Dado que el TomCat está ACTIVO con el solo hecho de pegar el archivo War en la
carpeta webapps da como resultado que tomCat cree AUTOMATICAMENTE, la
carpeta raíz Agenteel17dic con todo su contenido dentro.
Obvio, si TomCat estuviera apagado, no podría crear dicha carpeta por el hecho de
pegar el war.
http://localhost:8080/Agenteel17dic
http://localhost:8080/Agenteel17dic/Agenteel/index.jsp
Se hará un documento wsdl para responder al cliente Proxy para dos métodos de
AmazonBox. Dicho docto. Wsdl debe ser del tipo “document” y “literal” y además
deben cumplirse ciertas condiciones ya que por primera vez se harán dos métodos en el
documento wsdl.
Dado que para cada método de AmazonBox se debe enviar un parámetro tipo String y
se recibe otro parámetro también de tipo String, la regla 1 dice que el parámetro de
envio (de tipo String) debe ser irrepetible para cada método. Dado que voy a programar
nada más dos métodos, requiero dos parámetros diferentes para envio.
Creo el segundo parámetro de envío, también de tipo String, ahora con el nombre
DVDPalabra.
Para la respuesta, no es necesario crear un argumento único para cada método. Allí
puedo re-usar.
Creo el argumento de nombre “Respuesta” de tipo String. Me servirá para los dos
métodos que he de programar.
Ahora, necesito crear una pareja de estos para el método para DVD’s
Ahora conecto BookRequest con BookPalabra, BookResponse con respuesta; por otra
parte, conecto DVDRequest con DVDPalabra y DVDResponse con respuesta
Para el Message BookRequest creo un Parts de nombre palabra del tipo BookPalabra.
Por otra parte, necesito definir dos métodos, el sistema ya me provee del primero.
Para el metodo getBook, en la pestaña de Messages, me aseguro que Request esté con
BookRequest y Response con BookResponse.
Para cada método, note que en la pestaña Parameters se encuentran asignados los
parámetros que corresponde a cada método. Donde, el parámetro Request es exclusivo a
cada método y el parámetro Response se comparte entre ambos métodos.
Nos vamos a la pestaña Response, damos ADD y aparece como part resp, suprimimos
esta con el manualmente.
Repito: se debe dar clic tanto en la pestaña Request como Response, en ambas aparecerá
algo en Parts, procedemos a borrar, en ambos casos, el contenido de Parts, de tal forma
que dimos ADD y borramos el contenido de parts.
Regla 3: Para cada método es necesario dar ADD para la pestaña Request y la
pestaña Response y borrar lo que presenta Parts.
parts=""
Sobre nuestro proyecto, creamos un servicio Web, de nosotros para nuestro cliente
Proxy.
Se crea nuestro servicio Web con los dos métodos: getBook y getDVD
La acción anterior crea código automático, en un try – match, bórrelo para ambos
métodos.
La clave para programar los métodos está en la jerarquía de ramas que presenta el
servicio Web de AmazonBox.
Vea la relación entre los objetos del servicio Web y la programación del método.
______________________________________________________________________
______________________________________________________________________
http://localhost:8080/WebApplication12/
http://localhost:8080/WebApplication12/amazonproxy?wsdl
La forma de guardar el wsdl es con guardar como y poner el nombre con comillas
dobles y con la extensión wsdl.
Con
http://localhost:8080/WebApplication12/amazonproxy?Tester
Probamos el servicio
2) Borrar la carpeta en documentos en setting/ enrique ruiz diaz/ netbeans. (Ya que
dicha carpeta no es borrada por el des-instalador y si se deja es motivo de errores
posteriores.)
a) sjsas_pe-9_0_01-nb-5_5-win.exe
b) netbeans-visualweb-5_5-windows.exe
c) netbeans-profiler-5_5-win.exe
d) netbeans-mobility-5_5-win.exe
e) netbeans-cnd-5_5-windows.exe
f) netbeans-ent_pack-5_5-windows.exe
NO INSTALAR netbeans-5_5-windows.exe
1) Crear un proyecto.
Name: WebApplication1
2) Crear un servicio Web (del portal en su modo Proxy para sus clientes).
Dar clic con botón derecho sobre el proyecto antes creado: WebApplication1.
3) Crear un Cliente, de Portal en su modo Proxy, para consumir el servicio Web del
proveedor externo.
Dar clic con botón derecho sobre el proyecto antes creado: WebApplication1.
Allí, o bien aplico el URL del documento WSDL del proveedor externo, o bien,
si ya tengo en mi poder dicho WSDL lo atraigo desde donde lo almacené.
4) Programar el servicio Web, creando un objeto del tipo de Servicio Client (del
proveedor externo) para invocar un método, recibir la respuesta, en su caso
formatear ésta, y retornarla como parte de la respuesta del servicio Web para los
clientes del Portal en su modo Proxy.
Para programar el servicio Web para el cliente del modo Proxy, se debe comenzar
por arrastrar uno de estos objetos (no recuerdo exactamente cual) “WSAmazonBox”
o “AmazonBox” o “AmazonBoxSoap” que se encuentran en la rama “Web Services
Reference" y se debe soltar dentro del entorno de programación del servicio Web
para el modo Proxy.
Note como empiezo instanciando un objeto del servicio Web cliente de la rama más
superior:
Vea como con un punto (en el entorno de programación NetBeans) se ofrece los
paquetes disponibles.
Vea que de la rama www descienden todos los elementos a programarse que
interesan. Vea la siguiente figura:
5) Ejecutar el proyecto
WebApplication1 / Run
6) Atraemos el WSDL que creo NETBEANS 5.5 (NO es el mismo WSDL creado,
anteriormente, con Soa Editor).
http://localhost:8080/WebApplication2/proxyAmazon?wsdl
NOTA: Este wsdl sería el que se entregaría al cliente del portal en su modo
Proxy, para que consuma el servicio que se le ofrece intermediariamente.
7) Para efecto de Probar, sin necesidad de crear nuestro propio cliente consumidor
del servicio Proxy con dicho documento WSDL, podemos comprobar el servicio
con la orden: ?Tester, la cual se agrega, al URL que presenta como palabra final
el nombre del documento wsdl.
http://localhost:8080/WebApplication2/proxyAmazon?Tester
Se despliega lo siguiente
Como en este ejemplo, se trata del servicio de Amazon Box, requerimos enviar una
palabra, por ejemplo, “Java” e invocar el método del servicio Web Proxy, para que este,
internamente, invoque al Proveedor externo.
Recordar que el modo correcto de guardar el documento wsdl que se le dará al cliente
del modo Proxy, es que una vez que esté desplegado, por NetBeans, dicho documento
wsdl da la orden guardar y se pone el nombre del archivo entre comillas dobles, de esta
forma:
Next
2) Creamos un servicio Web (el de nosotros para nuestros clientes del modo
Proxy).
Para este ejemplo, se especifico, en el wsdl que el método de invocación del cliente,
en modo Proxy, enviaría un String y se le regresa un String de respuesta.
Vea que las ramas finales de ambos servicios Web representan los métodos que
finalmente proveen el servicio Web.
Así, podemos ver, que nuestra primera tarea es obtener el objeto MovieInformation
Con el objeto obtenido del punto anterior, ya podemos acceder a los métodos que nos
proveen el servicio Web.
5) Recordar, que para invocar el segundo servicio Web, el cual posee un nombre de
package propio. Es necesario volver a cargar el IDE.
Creamos el elemento de respuesta que se espera del método de nuestro servicio Web
Proxy, es decir, un String, en este caso.
6) Ejecutamos el proyecto.
http://localhost:8080/WebApplication3/proxyAmazon?wsdl
http://localhost:8080/WebApplication3/proxyAmazon?Tester
Así, el servicio Web Proxy provee una funcionalidad, para la cual requiere
internamente consumir dos servicios Web diferentes. A continuación, Vea la
respuesta con ?Tester.
TAREA 1
Name: a_tarea1
OK
Messages
• NewMessageRequest
• NewMessageResponse
Para “MessageRequest” defino el parámetro de envío para solicitar el servicio (es decir,
del lado del cliente). Por ejemplo, “code” de tipo “int”. (uno solo)
MessageRequest
Parts
code Type: int
Para “MessageResponse” define los parámetros que para darle la respuesta al cliente
sobre el registro de la base de datos (parámetros que se actualizarán por referencia)
MessageResponse
Parts
Add
Nombre Type: String
Add
Description Type: String
Add
Precio Type: double
Binding / a_tarea1Binding/
Binding / a_tarea1Binding/NewOperation
Use: encoded
Style: rpc
Luego damos clic en la pestaña “Response”, damos “Add” y se deben agregar a “Parts”,
automáticamente, todas nuestras variables de repuesta.
Asignamos:
Use: encoded
Style: rpc
A) Crear un proyecto
Name : a_tarea1
Name: a_tarea1
Package = www.a_tarea1.edu
// Poner aquí el código Java para la implementación del servicio Web tarea1.
package www.a_tarea1.edu;
import java.io.*;
import java.util.*;
import java.net.*;
import java.sql.*;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion =
canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
}
catch (java.lang.ClassNotFoundException e){} catch(SQLException e)
{};
try
{
// String sql de EJEMPLO PARA CUANDO SON VARIOS DATOS, NOTA:
ESTE STRING INDICA QUE TODOS SON CADENAS DE
CARACTERES
// String sql = "SELECT * FROM Tabla WHERE (Nombre like '%" + Nom +
"%') OR Direccion='" + Dir + "' OR Estado='" + Edo + "'";
tabla2 = instruccion.executeQuery(sql);
// forma de asignar valor a una variable holders: nombre.value="refresco 1 C";
if (tabla2!=null)
{
while(tabla2.next())
{
code = Integer.parseInt(tabla2.getString(1)); // Por las
dudas la tabla exija aplicar el índice 1
// cerrando resultset
tabla2.close();
}
instruccion.close();
canal.close();
} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e)
{};
}
}
“JSP Page”
Con el URL:
http://localhost:8080/a_tarea1/
a_tarea1?wsdl
"a_tarea1.wsdl"
Guárdese dicho documento en un lugar aparte del wsdl creado antes con Soa
Editor
NOTA: este wsdl creado con NetBeans internamente presenta la URL apropiada
para cuando se cree el cliente que consuma el servicio Web.
package com.your_company.www;
try
{
System.out.println ("hola a");
System.out.println
("*********************************************
**********************************");
System.out.println ("(a_tarea1)
....................................................................");
TAREA 2
Name: a_tarea2
OK
Messages
• NewMessageRequest
• NewMessageResponse
MessageRequest
Parts
Arg1 (remove)
Schema
Insert Complex Type
Name: datos1
Child Elements
Add
code Type: int
Add
nombre Type : String
Add
description Type : String
Add
Schema
Insert SOAP encoded Array
Name: Arraydatos2
Type: datos1
Ok
MessageResponse
Parts
Add
Name : resultado Type: Arraydatos2
Binding / a_tarea2Binding/
Binding / a_tarea2Binding/NewOperation
Use: encoded
Style: rpc
Parts : (vacío)
Luego damos clic en la pestaña “Response”, damos “Add” y se deben agregar a “Parts”,
automáticamente, nuestro parámetro de respuesta.
resultado
Asignamos:
Use: encoded
Style: rpc
E) Crear un proyecto
Name : a_tarea2
Name: a_tarea2
Package = www.a_tarea2.edu
// Poner aquí el código Java para la implementación del servicio Web tarea2.
package www.a_tarea2.edu;
import java.io.*;
import java.util.*;
import java.net.*;
import java.sql.*;
import java.util.*;
/**
* This is the implementation bean class for the a_tarea2 web service.
* Created 30/11/2006 02:00:53 PM
* @author enrique ruiz diaz
*/
www.a_tarea2.edu.Datos[] _retVal;
Statement instruccion=null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion =
canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
}
catch (java.lang.ClassNotFoundException e){} catch(SQLException e)
{};
try
{
// String sql de EJEMPLO PARA CUANDO SON VARIOS
DATOS, NOTA: ESTE STRING INDICA QUE TODOS SON
CADENAS DE CARACTERES
// String sql = "SELECT * FROM Tabla WHERE (Nombre like
'%" + Nom + "%') OR Direccion='" + Dir + "' OR Estado='" +
Edo + "'";
if (tabla2!=null)
{
while(tabla2.next())
{
int codigo = Integer.parseInt(new
String(tabla2.getString(1)));
String nombre = new String (new String
(tabla2.getString(2)));
String description = new String (new String
(tabla2.getString(3)));
double precio = Double.parseDouble(new String
(tabla2.getString(4)));
tabla2.close();
}
instruccion.close();
canal.close();
} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e)
{};
Informacion tempInfor;
tempInfor = (Informacion) Milista.get(w); // todo array !! REQUIERE
INICIALIZACIÓN CADA UNA DE LAS POSICIONES. !!
MiVal[w].setCode(cod);
MiVal[w].setNombre(nombre);
MiVal[w].setDescription(description);
MiVal[w].setPrecio(costo);
}
return MiVal;
}
public Informacion (int micode, String nom, String descrip, double pre)
{
code = new Integer (micode);
nombre = nom;
description = descrip;
precio = new Double (pre);
}
“JSP Page”
Con el URL:
http://localhost:8080/a_tarea2/
a_tarea2?wsdl
"a_tarea2.wsdl"
Guárdese dicho documento en un lugar aparte del wsdl creado antes con Soa
Editor
NOTA: este wsdl creado con NetBeans internamente presenta la URL apropiada
para cuando se cree el cliente que consuma el servicio Web.
package com.your_company.www;
try
{
// com.your_company.www.Datos[] newOperation()
com.your_company.www.Datos[] resultado;
resultado = port.newOperation();
System.out.println
("***************************************************
********");
System.out.println ("a_tarea2 -------------------------------------------
-------");
}
catch (Exception e)
{
}
}
}
TAREA 3
Definición: Obtener la información de todos los productos con el precio más bajo. Es
decir, si el precio más bajo es de $100 pesos ¿Cuáles son los productos que tienen ese
precio?.
Vea que no se requiere enviar parámetro alguno y se requiere un array de respuesta que
puede contener n registros de la base de datos.
Estos requerimientos se cubren perfectamente con el wsdl creado con Soa Editor para la
tarea 2, entonces creemos una copia de a_tarea2.wsdl (creado con Soa editor) y
pongámosle de nombre a_tarea3.wsdl
Obviamente, el cambio principal está en la programación del servicio Web, el cual debe
capturar los productos con el precio más bajo.
package www.a_tarea3.edu;
import java.io.*;
import java.util.*;
import java.net.*;
import java.sql.*;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion =
canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
}
catch (java.lang.ClassNotFoundException e){} catch(SQLException e)
{};
try
{
// String sql de EJEMPLO PARA CUANDO SON VARIOS DATOS,
NOTA: ESTE STRING INDICA QUE TODOS SON CADENAS DE
CARACTERES
// String sql = "SELECT * FROM Tabla WHERE (Nombre like '%" +
Nom + "%') OR Direccion='" + Dir + "' OR Estado='" + Edo + "'";
if (tabla2!=null)
{
while(tabla2.next())
{
int codigo = Integer.parseInt(new
String(tabla2.getString(1)));
String nombre = new String (new String
(tabla2.getString(2)));
String description = new String ("a_tarea3 " + new String
(tabla2.getString(3)));
Milista.add(infor);
}; // fin while
// cerrando resultset
tabla2.close();
}
instruccion.close();
canal.close();
} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e)
{};
temp[w].setCode(cod);
temp[w].setNombre(nombre);
temp[w].setDescription(description);
temp[w].setPrecio(costo);
if (w==0)
{
minimo=costo.doubleValue();
}
int contadorDeMinimos = 0;
if (precio.doubleValue()==minimo)
{
contadorDeMinimos = contadorDeMinimos + 1;
}
}
int k=0;
if (precio2.doubleValue()==minimo)
{
MiVal[k]= new www.a_tarea3.edu.Datos(); // !! REQUIERE
INICIALIZACIÓN CADA UNA DE LAS POSICIONES. !!
MiVal[k].setCode(temp[w].getCode());
MiVal[k].setNombre(temp[w].getNombre());
MiVal[k].setDescription(temp[w].getDescription());
MiVal[k].setPrecio(temp[w].getPrecio());
k=k+1;
}
}
return MiVal;
public Informacion (int micode, String nom, String descrip, double pre)
{
code = new Integer (micode);
nombre = nom;
description = descrip;
precio = new Double (pre);
}
package com.your_company.www;
// com.your_company.www.Datos[] newOperation()
com.your_company.www.Datos[] resultado;
resultado = port.newOperation();
System.out.println
("***************************************************
********");
System.out.println ("a_tarea3 -------------------------------------------
-------");
}
catch (Exception e)
{
}
}
}
TAREA 4
Definición: Dado un array de codigos, obtener los registros de la base de datos para
cada uno de los códigos proporcionados como entrada.
Se requiere dos documentos wsdl el primero para el servicio Web 4 y el segundo para el
servicio web 1 que se consume internamente por el servicio Web 4
Vea que el wsdl 1 ya lo tenemos, solo hace falta crear el wsdl para el servicio web 4, el
cual recibe un array de codigos y devuelve un array con los registros de la base de datos
para cada codigo.
Name: a_tarea4
OK
Messages
• NewMessageRequest
• NewMessageResponse
Name: arraycodes
Type: Strings
Minimo = 0
Maximum = Unbounded
Name: datos1
Add
codigo Type: String
Add
nombres Type: Strings
Add
description Type: String
Add
precio Type: double
Name: arraydatos
Type: datos1
Minimun : 0
Maximum: Unbounded
Definition Type: (x) Complex Type
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 118
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web
Para “MessageRequest” en este caso, define el parámetro codigos del tipo “arraycodes”
MessageRequest
Parts
codigos Type: arraycodes
MessageResponse
Parts
Add
Name: respuesta Type: arraydatos
Binding / a_tarea4Binding/
Binding / a_tarea4Binding/NewOperation
Use: encoded
Style: rpc
Luego damos clic en la pestaña “Response”, damos “Add” y se deben agregar a “Parts”,
automáticamente, nuestra variable de repuesta.
respuesta
Asignamos:
Use: encoded
Style: rpc
I) Crear un proyecto
Name : a_tarea4
Name: a_tarea4sw
Package = www.a_tarea4.edu
Allí atraigo el documento WSDL antes creado con Soa Editor para el
servicio Web 4
// Poner aquí el código Java para la implementación del servicio Web tarea4.
package www.a_tarea4.edu;
/**
* This is the implementation bean class for the a_tarea4sw web service.
* Created 30/11/2006 04:28:31 PM
* @author enrique ruiz diaz
*/
try
{
A_tarea1PortType_Impl tarea1 = new A_tarea1PortType_Impl();
javax.xml.rpc.holders.StringHolder nombre= new
javax.xml.rpc.holders.StringHolder();
javax.xml.rpc.holders.StringHolder description= new
javax.xml.rpc.holders.StringHolder();
javax.xml.rpc.holders.DoubleHolder precio = new
javax.xml.rpc.holders.DoubleHolder();
_retVal[i].setCodigo(codigos[i]);
_retVal[i].setNombre(nombre.value);
_retVal[i].setDescription(description.value + "a_tarea4");
_retVal[i].setPrecio(new Double(precio.value));
}
}
catch (Exception e)
{}
return _retVal;
}
}
Name: a_tarea1sw
Package = www.a_tarea4.edu
Allí atraigo el documento WSDL antes creado con Soa Editor para el
servicio Web 1. El cual fue hecho para la tarea 1
// Poner aquí el código Java para la implementación del servicio Web tarea1.
package www.a_tarea4.edu;
import java.io.*;
import java.util.*;
import java.net.*;
import java.sql.*;
/**
* This is the implementation bean class for the a_tarea1sw web service.
* Created 30/11/2006 04:30:00 PM
* @author enrique ruiz diaz
*/
public class A_tarea1PortType_Impl implements
www.a_tarea4.edu.A_tarea1PortType, java.rmi.Remote {
public void newOperation(int code, javax.xml.rpc.holders.StringHolder nombre,
javax.xml.rpc.holders.StringHolder description, javax.xml.rpc.holders.DoubleHolder
precio) throws
java.rmi.RemoteException {
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion =
canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
}
catch (java.lang.ClassNotFoundException e){} catch(SQLException e)
{};
try
{
// String sql de EJEMPLO PARA CUANDO SON VARIOS DATOS,
NOTA: ESTE STRING INDICA QUE TODOS SON CADENAS DE
CARACTERES
// String sql = "SELECT * FROM Tabla WHERE (Nombre like '%" +
Nom + "%') OR Direccion='" + Dir + "' OR Estado='" + Edo + "'";
tabla2 = instruccion.executeQuery(sql);
// forma de asignar valor a una variable holders: nombre.value="refresco
1 C";
if (tabla2!=null)
{
while(tabla2.next())
{
code = Integer.parseInt(tabla2.getString(1)); // Por las
dudas la tabla exija aplicar el índice 1
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 123
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web
// cerrando resultset
tabla2.close();
}
instruccion.close();
canal.close();
} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e)
{};
}
}
“JSP Page”
Con el URL:
http://localhost:8080/a_tarea4/
a_tarea4sw?wsdl
"a_tarea4sw.wsdl"
Guárdese dicho documento en un lugar aparte del wsdl creado antes con Soa
Editor
NOTA: este wsdl creado con NetBeans internamente presenta la URL apropiada
para cuando se cree el cliente que consuma el servicio Web.
package com.your_company.www;
try
{
A_Tarea4SwLocator loc = new A_Tarea4SwLocator();
A_Tarea4PortType port = loc.geta_tarea4PortTypePort();
// com.your_company.www.Datos[]
newOperation(java.lang.String[] codigos)
com.your_company.www.Datos[] resultado;
resultado = port.newOperation(codigos);
System.out.println
("***************************************************
********");
System.out.println ("a_tarea4 -------------------------------------------
-------");
}
catch (Exception e)
{
}
}
}
Name: m_tarea1
OK
Messages
• NewMessageRequest
• NewMessageResponse
Para “MessageRequest” defino el parámetro de envío para solicitar el servicio (es decir,
del lado del cliente). Por ejemplo, “code” de tipo “int”. Pero, como es para móviles ya
no puede ser un dato simple, ahora este dato debe prepararlo así:
Name: code1
Type: String
OK
• (x) Element
• (x) Secuence
Name: datos2
Add
• code Type: String
Add
• Para “MessageRequest”
o Parts
Name: codigo Type: code1
• Para “MessageResponse”
o Parts
Add
Name: resultado: Type: datos2
Binding / m_tarea1Binding/
Style: document
Binding / m_tarea1Binding/NewOperation
Style: document
Use: literal
Parts = “ ”
Parts = “ “
O) Crear un proyecto
Name : m_tarea1
Name: m_tarea1
Package = www.m_tarea1.edu
package www.m_tarea1B.edu;
import java.io.*;
import java.util.*;
import java.net.*;
import java.sql.*;
/**
* This is the implementation bean class for the m_tarea1B web service.
* Created 28/11/2006 08:18:15 PM
* @author enrique ruiz diaz
*/
public class M_tarea1PortType_Impl implements
www.m_tarea1B.edu.M_tarea1PortType, java.rmi.Remote {
public www.m_tarea1B.edu.Misdatos newOperation(java.lang.String codigo)
throws
java.rmi.RemoteException {
Statement instruccion=null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion =
canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
}
catch (java.lang.ClassNotFoundException e){} catch(SQLException e)
{};
try
{
tabla2 = instruccion.executeQuery(sql);
//nombre.value="refresco 1 C";
if (tabla2!=null)
{
while(tabla2.next())
{
code3 = tabla2.getString(1); // Trabaja con el indice inicial en 1
nombre = tabla2.getString(2) + " esta es el el proyecto prueba
2";
description = tabla2.getString(3);
precio = tabla2.getString(4);
}; // fin while
// cerrando resultset
tabla2.close();
}
instruccion.close();
canal.close();
} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e)
{};
_retVal.setCodigo(code3);
_retVal.setNombre(nombre);
_retVal.setDescripcion(description);
_retVal.setPrecio(precio);
return _retVal;
}
}
“JSP Page”
m_tarea1?wsdl
Cópiese la dirección URL del navegador que presenta dicho docto. WSDL.
Name : m_tarea1_
Si todo salió bien debe desplegarse un celular con acceso al método del servicio
Web Mobil. En espera de que le proporcionemos un código para solicitar el
servicio.
Name: m_tarea2
OK
Messages
• NewMessageRequest
• NewMessageResponse
Name: code1
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 134
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web
Type: String
OK
Los cuatro elementos creados con Schema / Create Element From Type
Name: arraydedatos2
• (x) Element
• (x) Secuence
Add
Ocurrence
• codigo Type: code1
múltiple
Add
• nom Type: nombre múltiple
Add
• descrip Type: descripción múltiple
Add
• pre Type: precio múltiple
o Parts
Add
Name: resultado: Type: arraydedatos2
Binding / m_tarea2Binding/
Style: document
Binding / m_tarea2Binding/NewOperation
Style: document
Use: literal
Parts = “ ”
Parts = “ “
package www.m_tarea2.edu;
import java.io.*;
import java.util.*;
import java.net.*;
import java.sql.*;
import java.util.*; // necesario para la Lista Dinamica
/**
* This is the implementation bean class for the m_tarea2 web service.
* Created 28/11/2006 09:26:46 PM
* @author enrique ruiz diaz
*/
public class M_tarea2PortType_Impl implements
www.m_tarea2.edu.M_tarea2PortType, java.rmi.Remote {
public www.m_tarea2.edu.Arraydedatos newOperation() throws
java.rmi.RemoteException {
Statement instruccion=null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion =
canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
}
catch (java.lang.ClassNotFoundException e){} catch(SQLException e)
{};
try
{
tabla2 = instruccion.executeQuery(sql);
if (tabla2!=null)
{
while(tabla2.next())
{
//i = i + 1;
int codigo = Integer.parseInt(new
String(tabla2.getString(1)));
String nombre = new String (new String
(tabla2.getString(2)));
String description = new String (new String
(tabla2.getString(3)));
double precio = Double.parseDouble(new String
(tabla2.getString(4)));
Milista.add(infor);
}; // fin while
// cerrando resultset
tabla2.close();
}
instruccion.close();
canal.close();
catch(SQLException e)
{};
Informacion tempInfor;
tempInfor = (Informacion) Milista.get(w);
MiVal.setCode(ArrayCodes);
MiVal.setNombre(ArrayNombre);
MiVal.setDescripcion(ArrayDescriptions);
MiVal.setPrecio(ArrayPrecios);
return MiVal;
public Informacion (int micode, String nom, String descrip, double pre)
{
code = new Integer (micode);
nombre = nom;
description = descrip;
precio = new Double (pre);
}
Name: m_tarea3
OK
Messages
• NewMessageRequest
• NewMessageResponse
Name: code1
Type: String
OK
Los cuatro elementos creados con Schema / Create Element From Type
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 141
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web
Name: arraydedatos2
• (x) Element
• (x) Secuence
Add
Ocurrence
• codigo Type: code1
múltiple
Add
• nom Type: nombre múltiple
Add
• descrip Type: descripción múltiple
Add
• pre Type: precio múltiple
o Parts
Add
Name: resultado: Type: arraydedatos2
Binding / m_tarea3Binding/
Style: document
Binding / m_tarea3Binding/NewOperation
Style: document
Use: literal
Parts = “ ”
Parts = “ “
package www.m_tarea3B.edu;
import java.io.*;
import java.util.*;
import java.net.*;
import java.sql.*;
import java.util.*; // necesario para la Lista Dinamica
/**
* This is the implementation bean class for the m_tarea3B web service.
* Created 29/11/2006 03:12:04 PM
* @author enrique ruiz diaz
*/
public class M_tarea3PortType_Impl implements
www.m_tarea3B.edu.M_tarea3PortType, java.rmi.Remote {
public www.m_tarea3B.edu.Arraydatos newOperation() throws
java.rmi.RemoteException {
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion =
canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
}
catch (java.lang.ClassNotFoundException e){} catch(SQLException e)
{};
try
{
// String sql de EJEMPLO PARA CUANDO SON VARIOS DATOS,
NOTA: ESTE STRING INDICA QUE TODOS SON CADENAS DE
CARACTERES
// String sql = "SELECT * FROM Tabla WHERE (Nombre like '%" +
Nom + "%') OR Direccion='" + Dir + "' OR Estado='" + Edo + "'";
if (tabla2!=null)
{
while(tabla2.next())
{
String codigo = new String(tabla2.getString(1));
String nombre = new String(tabla2.getString(2));
String description = new String(tabla2.getString(3));
String precio = new String(tabla2.getString(4));
Milista.add(infor);
}; // fin while
// cerrando resultset
tabla2.close();
}
instruccion.close();
canal.close();
catch(SQLException e)
{};
if (w==0)
{ minimo=precio.doubleValue(); }
int contadorDeMinimos = 0;
if (precio.doubleValue()==minimo)
{
contadorDeMinimos = contadorDeMinimos + 1;
}
}
/*
*LECCION: Vea como un Array requiere inicilizarse para cada posición en
especifico,
*para poderlo usar (para cada posición w):
*
* www.enrique.edu.Midato[] = new www.enrique.edu.Midato[10];
* MiVal[w]= new www.enrique.edu.Midato();
*/
int k=0;
if (precio2.doubleValue()==minimo)
{
int code = temp3.getCode();
String nombre = new String(temp3.getNombre());
String description = new String(temp3.getDescription());
k=k+1;
}
}
_retVal.setCodigo(ArrayCodigos);
_retVal.setNombre(ArrayNombres);
_retVal.setDescripcion(ArrayDescriptions);
_retVal.setPrecio(ArrayPrecios);
return _retVal;
public Informacion (int micode, String nom, String descrip, double pre)
{
code = new Integer (micode);
nombre = nom;
description = descrip;
precio = new Double (pre);
}
NOTAS:
1) Este ejercicio requiere de dos documentos wsdl uno para la el servicio Web
Mobil número 4 al cual no se envía parámetro alguno y retorna un array con
uno o más registros de la base de datos. Vea que estas características se
cumplen perfectamente en el documento wsdl que ya se desarrolló tanto para
el ejercicio numero 2 como para el número 3 ya que en ambos, no se envía
parámetro alguno y se recibe un array conteniendo x número de registros de
la base de datos. Entonces ya se cuenta con el wsdl para la tarea 4.
2) Ahora, la tarea 4 requiere, internamente, implementar el servicio Web de la
tarea 1, ese wsdl de la tarea 1 ya se creó, entonces simplemente lo
tomaremos.
V) Crear un proyecto
Name : m_tarea4
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 148
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web
Name: m_tarea4ws
Package = www.m_tarea4ws.edu
// Poner aquí el código Java para la tarea4 Mobil en su servicio Web Mobil
principal .
package www.m_tarea4ws.edu;
/**
* This is the implementation bean class for the m_tarea4ws web service.
* Created 29/11/2006 04:00:27 PM
* @author enrique ruiz diaz
*/
public class M_tarea2PortType_Impl implements
www.m_tarea4ws.edu.M_tarea2PortType, java.rmi.Remote {
public www.m_tarea4ws.edu.Arraydedatos newOperation() throws
java.rmi.RemoteException {
// codigos arbitrario.
try
{
M_tarea1PortType_Impl tarea1 = new M_tarea1PortType_Impl();
_retVal.setCode(ArrayCodes);
_retVal.setNombre(ArrayNombre);
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 150
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web
_retVal.setDescripcion(ArrayDescription);
_retVal.setPrecio(ArrayPrecios);
return _retVal;
}
}
Name: m_tarea1ws
Package = www.m_tarea4ws.edu
// Poner aquí el código Java para la tarea4 Mobil, servicio Web Mobil 1.
package www.m_tarea4ws.edu;
import java.io.*;
import java.util.*;
import java.net.*;
import java.sql.*;
Statement instruccion=null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion =
canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
}
catch (java.lang.ClassNotFoundException e){} catch(SQLException e)
{};
try
{
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 152
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web
tabla2 = instruccion.executeQuery(sql);
if (tabla2!=null)
{
while(tabla2.next())
{
code3 = tabla2.getString(1); // Por las dudas la tabla exija
comenzar con el indice 1
nombre = tabla2.getString(2) + " esta es el el proyecto prueba
2";
description = tabla2.getString(3);
precio = tabla2.getString(4);
}; // fin while
// cerrando resultset
tabla2.close();
}
instruccion.close();
canal.close();
} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e)
{};
_retVal.setCodigo(code3);
_retVal.setNombre(nombre);
_retVal.setDescripcion(description);
_retVal.setPrecio(precio);
return _retVal;
}
}
“JSP Page”
http://localhost:8080/m_tarea4/
m_tarea4ws?wsdl
Cópiese la dirección URL del navegador que presenta dicho docto. WSDL.
http://localhost:8080/m_tarea4/m_tarea4ws?wsdl
http://localhost:8080/m_tarea4/
m_tarea1ws?wsdl
Cópiese la dirección URL del navegador que presenta dicho docto. WSDL.
http://localhost:8080/m_tarea4/m_tarea1ws?wsdl
Name : m_tarea4_
http://localhost:8080/m_tarea4/m_tarea4ws?wsdl
Si todo salió bien debe desplegarse un celular con acceso al método del servicio
Web Mobil 4, el cual internamente accede al servicio Web movil 1.
El servidor debe estar corriendo para esos servicios Web móviles, si se ha seguido estos
procedimientos y no se ha cerrado NetBeans lo más seguro es que estos servicios
móviles estén activos.
1) Detener el servidor
Recuerde que ya tenemos creados nuestros PROYECTO Web para moviles, estos son:
m_tarea1,
m_tarea2,
m_tarea3 y
m_tarea4
http://localhost:8080/m_tarea1/m_tarea1?wsdl
http://localhost:8080/m_tarea2/m_tarea2?wsdl
http://localhost:8080/m_tarea3/m_tarea3?wsdl
http://localhost:8080/m_tarea4/m_tarea4ws?wsdl
Note que el URL para el wsdl para el proyecto 4 tiene este contenido
http://localhost:8080/m_tarea4/m_tarea4ws?wsdl
Vea que: “m_tarea4ws“ porque así se nombró al Servicio Web principal del proyecto de
la tarea 4 para moviles.
Name : Todosmoviles_
10) Crear un “J2ME Web Service” para cada una de las URL’s antes copiadas
http://localhost:8080/m_tarea1/m_tarea1?wsdl