Você está na página 1de 157

M.C.

Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

GUIAS PARA CREAR Y


MANEJAR SERVICIOS WEB
(nota: son varias guías en este documento)

M.C. Enrique Ruiz Díaz.

Estoy titulado en la Maestría en Ciencias de la


Computación, Misma que estudié en el Instituto Tecnológico
de Orizaba, Ver, México.
Generación 2005-2007.

Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 1
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

COMO HACER CLIENTES PARA

DOCUMENTOS WSDL

M.C. Enrique Ruiz Díaz

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 2
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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”

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 3
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Ahora, copiamos el wsdl “AgenteelCP.wsdl” a la carpeta bin de la carpeta wsdk_v5

C:\wsdk_v5\bin\AgenteelCP.wsdl

Utilice el comando: WSDL2WebService de la siguiente manera:

28/10/2006 07:09 a.m. 2,689 test.wsdl


27/09/2006 07:46 p.m. <DIR> TheaterMovie
25/09/2006 04:39 p.m. 8,305 TranslateService.wsdl
10/11/2006 12:37 p.m. <DIR> two_methods
10/11/2006 12:36 p.m. 5,252 two_methods.wsdl
31/05/2003 12:22 a.m. 1,236 UDDIPublish.bat
31/05/2003 12:22 a.m. 1,242 UDDIUnpublish.bat
26/09/2006 08:08 p.m. <DIR> Urate2city
27/09/2006 10:20 a.m. <DIR> USHolidayService
27/09/2006 10:18 a.m. 19,663 USHolidayService.wsdl
31/05/2003 12:22 a.m. 1,217 version.bat
18/09/2006 03:31 p.m. <DIR> ws1
18/09/2006 09:49 a.m. 1,942 ws1.wsdl
18/09/2006 03:34 p.m. <DIR> ws2
18/09/2006 09:48 a.m. 1,620 ws2.wsdl
31/05/2003 12:22 a.m. 1,386 wsdkHelp.bat
22/09/2006 04:48 p.m. <DIR> wsdl codigo postales México
21/09/2006 06:21 p.m. <DIR> wsdl dos ciudades
31/05/2003 12:22 a.m. 1,336 WSDL2WebService.bat
26/09/2006 07:56 p.m. <DIR> Xrate2city
20/09/2006 12:52 p.m. <DIR> Zcode5
20/09/2006 07:03 p.m. <DIR> ZipCode del profe Giner
20/09/2006 10:17 a.m. 2,727 ZipCode.wsdl
20/09/2006 10:51 a.m. 3,097 ZipCode2.wsdl

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 4
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

20/09/2006 12:49 p.m. 2,748 ZipCode5.wsdl


20/09/2006 12:49 p.m. 2,748 ZipCode6.wsdl
20/09/2006 07:07 p.m. <DIR> zipcode_giner
20/09/2006 07:37 p.m. <DIR> zipcode_giner2
50 archivos 342,579 bytes
61 dirs 41,366,937,600 bytes libres

C:\WSDK_v5\bin>WSDL2WebService -createService Agenteel -project Agenteel


AgenteelCP.wsdl

En donde “Agenteel” son carpetas a crearse, y “AgenteelCP.wsdl” es nuestro


documento wsdl.

Si todo va bien, el sistema debe generar los siguientes mensajes:

Creating new Web-Service: Agenteel ...

Creating build script...

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

Then compile the code using the provided script C:\WSDK_v5\bin\Agenteel\Agenteel


\compile.bat and run the tool again with the -createEar option.

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 5
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Abra en modo de edición “compile2.bat”

El cual presenta el siguiente contenido:

@echo off

REM Generated by WSDK 5.0 on Sat Dec 16 09:53:24 CST 2006

REM Set the USER_CLASSPATH to any extra dependencies required by your


implementation.

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 6
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

A al última instrucción (en negritas) agrege:

client-side\

Para que quede así:

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;

public class Client


{
public static void main (String[] args)
{
try
{
… … ..
}
catch(Exception e) { … }

AgenteelCodigoPostalServiceLocator loc = new AgenteelCodigoPostalServiceLocator();

Creamos el objeto “loc” en base a la clase del archivo *locator.java, que para este
específico caso se llama:

AgenteelCodigoPostalServiceLocator.java

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 7
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

Por lo que la declaración de nuestro objeto “port” queda así:

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

AgenteelCodigoPostalPort port =loc.get…( );

El nombre exacto de ese método, lo obtendremos buscándolo en el archivo


*locator.java, dicho método tiene las siguientes características:

• está en la clase *locator.java.


• comienza con la expresión “get”.
• Generalmente termina con la expresión “port”.
• No recibe parámetro alguno.
• Lanza una: throws javax.xml.rpc.ServiceException
El método que cubre estas características es:

public AgenteelCodigoPostal.AgenteelCodigoPostalPort
getAgenteelCodigoPostalPort() throws javax.xml.rpc.ServiceException

Por tanto, la declaración e instanciación del objeto “port” queda así:

AgenteelCodigoPostalPort port = loc.getAgenteelCodigoPostalPort();

Con esto, nuestro cliente (Client.java) lleva esta forma;

package ….;

public class Client


{
public static void main (String[] args)
{
Try {
AgenteelCodigoPostalServiceLocator loc = new AgenteelCodigoPostalServiceLocator();
AgenteelCodigoPostalPort port = loc.getAgenteelCodigoPostalPort();

….
….
}
catch(Exception e) { }
}
}

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 8
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

Sin embargo, no basta con expresarlo textualmente, ahora debemos configurar al


JCreator para que reconozca dicho packege:

Elegimos / Configure/ JDK Profiles /

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”

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 9
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Buscamos la carpeta principal de nuestro proyecto “Agenteel” y descendemos hasta


“client-side” nada más.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 10
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

REM Generated by WSDK 5.0 on Sat Dec 16 09:53:24 CST 2006

REM Set the USER_CLASSPATH to any extra dependencies required by your


implementation.

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;

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 11
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

Sin embargo, también agregue estos elementos:

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”

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 12
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 13
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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 interface AgenteelCodigoPostalPort extends java.rmi.Remote {


public AgenteelCodigoPostal.CPResult[] getCodigoPostalFromNumber(AgenteelCodigoPostal.CPQuery codigo)
throws java.rmi.RemoteException;

public AgenteelCodigoPostal.CPResult[]
getCodigoPostalFromAsentamiento(AgenteelCodigoPostal.AsentamientoQuery elasentamiento) throws
java.rmi.RemoteException;

public AgenteelCodigoPostal.CPResult[] getCodigoPostalFromMunicipio(AgenteelCodigoPostal.MunicipioQuery


elasentamiento) throws java.rmi.RemoteException;

public AgenteelCodigoPostal.AgenteelMessageResult
getMessageFromAgenteel(AgenteelCodigoPostal.AgenteelMessageQuery foo) throws java.rmi.RemoteException;
}

Si optamos por usar el método getCodigoPostalFromMunicipio

Sus parámetros son:

AgenteelCodigoPostal.CPResult[]
getCodigoPostalFromMunicipio(AgenteelCodigoPostal.MunicipioQuery
elasentamiento);

Ante ello, procedamos a copiar los elementos de envío y de retorno:

AgenteelCodigoPostal.MunicipioQuery elasentamiento; // parámetro de envío

AgenteelCodigoPostal.CPResult[] // parámetro de recepción

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[]

Procedamos a declarar nuestra variable de tipo: MunicipioQuery

AgenteelCodigoPostal.MunicipioQuery elasentamiento; // solo está declarada.

Elasentamiento = new AgenteelCodigoPostal.MunicipioQuery();

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 14
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

// ahora la instanciamos

Ahora procedemos a abrir el archivo MunicipioQuery.java para enterarnos que esta


clase posee un método que se llama:

void setMunicipio(java.lang.String municipio)

el cual procedemos a invocar para aplicar un valor de origen a la variable


“elasentamiento”

elasentamiento. setMunicipio(“Orizaba”);

AgenteelCodigoPostal.MunicipioQuery elasentamiento;
elasentamiento = new AgenteelCodigoPostal.MunicipioQuery();

elasentamiento. setMunicipio(“Orizaba”);

Ahora, para nuestra variable de recepción, necesitamos declarar un array de tipo:


CPResult

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.

AgenteelCodigoPostal.CPResult[]miarrayCPResul; // Vea que solo está declarada.

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.

miarrayCPResul = port. getCodigoPostalFromMunicipio (elasentamiento);

Con lo cual, nuestro Client.java va así:

package AgenteelCodigoPostal;

public class Client


{
public static void main (String[] args)
{
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 15
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

try
{
AgenteelCodigoPostalServiceLocator loc =
new AgenteelCodigoPostalServiceLocator();

AgenteelCodigoPostalPort port = loc.getAgenteelCodigoPostalPort();

AgenteelCodigoPostal.MunicipioQuery elasentamiento;
elasentamiento = new AgenteelCodigoPostal.MunicipioQuery();

elasentamiento.setMunicipio("Orizaba");

AgenteelCodigoPostal.CPResult[]miarrayCPResul; // Vea que solo está declarada.


// Porque desconozco el tamaño que la invocación del método de "port" le asigne.

miarrayCPResul = port.getCodigoPostalFromMunicipio (elasentamiento);

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

Nuestro Client.java queda así:

package AgenteelCodigoPostal;

public class Client


{
public static void main (String[] args)
{
try
{
AgenteelCodigoPostalServiceLocator loc =
new AgenteelCodigoPostalServiceLocator();

AgenteelCodigoPostalPort port = loc.getAgenteelCodigoPostalPort();

AgenteelCodigoPostal.MunicipioQuery elasentamiento ; // declarada


elasentamiento = new AgenteelCodigoPostal.MunicipioQuery(); // instanciada
elasentamiento.setMunicipio("Orizaba"); // con asignación de valor específico.

AgenteelCodigoPostal.CPResult[]miarrayCPResul;
// Vea que solo está declarada. Porque desconozco
// el tamaño que la invocación del método de "port" le asigne.

miarrayCPResul = port.getCodigoPostalFromMunicipio (elasentamiento);

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 16
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

System.out.println
("***********Códigos Postales México, 16-dic-2006 ****************");

for (int i=0; i<miarrayCPResul.length; i++)


{
System.out.println
("Codigo postal = " + miarrayCPResul[i].getCodigoPostal());
}

}
catch(Exception e){}
}

Ahora resta compilarlo y ejecutarlo. De acuerdo a experiencia personal, en algunos


casos es suficiente con utilizar el compilador y ejecutor de JCreator, sin embargo, para
ciertos servicios Web, el JCreator no los compila perfectamente. En todos los casos,
será preferible utilizar “compile2.bat” para compilar, y utilizar JCreator solo para
ejecutar, no para compilar.

En modo MS-DOS, ejecutemos compile2.bat, recordar que ya se modificó, por tanto


compilará todos los *.java en la ruta de client-side, que es la que nos interesa.

El uso de compile2.bat, creará los *.class junto a los *.java.

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 17
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

La ejecución exitosa nos devuelve los codigos postales de acuerdo al municipio


proporcionado, y así pudiéramos experimentar con los demás métodos que nos
proporciona dicho servicio Web.

REPASANDO LAS REGLAS PARA CREAR UN CLIENTE (Client.java) PARA


UN SERVICIO WEB SEGÚN SU WSDL

La ejecución del comando WSDL2WebService crea un árbol de carpetas, seguimos la


ruta de la carpeta “client-side” y donde aparecen los *.java, allí creamos el Client.java,
con las siguientes reglas:

1) Para crear el objeto “loc” busco el archivo *locator.java y tomo el nombre de la


clase principal de ese archivo.

Miclaselocator loc = new Miclaselocator ();

2) Use la opción A o B según se indica a continuación.

A) Para crear el objeto “port” busco el archivo *portType.java y copio el


nombre de la clase principal.

miclasePortType port = …

B) Si no existiera el archivo *PortType.java, entonces abro con block de


notas el archivo *.wsdl y busco la línea
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 18
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

portType name = “miclaseportType”

el valor de name es la clase que estoy buscando para el objeto “port”

miclaseportType port = …

3) Busco el método que invocará el objeto “loc” el cual se encuentra en el archivo


*locator.java casi siempre con el nombre:

get + (el nombre de la clase del objeto “port”)

es decir,

miclaseportType port = loc.get miclaseportType ( ) ;

Ese metodo get miclaseportType ( ) debe verificarse que efectivamente exista en


la clase *locator.java, si no se encuentra así, identifícalo con la siguiente
estructura:

get…..port ( ) throws javax.xml.rpc.service exception;

Vea que este método no tiene argumentos, y además lanza una :

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 = …

y “miclaseportType” se encuentra en el archivo *portType.java (o el que


corresponda) y allí están los métodos a invocarse.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 19
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Ejercicio: Hacer un cliente para el servicio Web de xmethods: JavaPortal News.

Descargamos el wsdl desde xmethods:

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.

Efectivamente, este archivo, originalmente, presentaba la extensión xml, por lo que


procedo a guardarlo con extensión wsdl.

Ahora, copio dicho wsdl en la carpeta donde está el comando :

**********************************************************************
C:\WSDK_v5\bin>dir j*wsdl

Directorio de C:\WSDK_v5\bin

25/09/2006 04:48 p.m. 6,188 JavaPortalNews.wsdl

C:\WSDK_v5\bin>

Ahora ejecuto el comando: wsdl2webservice

C:\WSDK_v5\bin> wsdl2webservice -createservice JavaPortal -project JavaPortal


JavaPortalNews.wsdl

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 20
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

El sistema responde:

Creating new Web-Service: JavaPortal ...


A new Web-Service "JavaPortal" has been created successfully in the project dire
ctory C:\WSDK_v5\bin\JavaPortal.

To complete the Web-Service, you can now fill in your implementation code in the
following classes:

JIPNewsSoapBindingImpl.java

Then compile the code using the provided script C:\WSDK_v5\bin\JavaPortal\JavaPo


rtal\compile.bat and run the tool again with the -createEar option.

C:\WSDK_v5\bin>

Con lo cual, ya tengo una carpeta con el nombre: JavaPortal con subcarpetas en el.

Proceda a realizar el Client.java, en la subcarpeta www del lado del client-side.

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 21
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

JIPNews port = loc.getJIPNews();

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:

java.lang.String giveMe_EN(int news_Number)

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;

Vea que este package es la derivación después de client-side

No basta con escribirlo en el Client.java, hay que indicarlo al entorno de JCreator, dicho
package

JDK Profiles / JDK Version 1.5 / Edit /

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 22
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Agregarmos Path hasta el client-side de nuestra carpeta JavaPortal. Note que la


diferencia para llegar hasta los *.java, después del client-side, está especificado en el
package package it.javaportal.www;

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 23
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

No olvide que el JCreator debe tener incorporado ciertos archivos *.jar, tal como indica
el archivo “compile.bat”

Dicho archivo “compile.bat” especifica la ruta donde se encuentran estos *.jar. Si


JCreator todavía no los ha incorporado, agregue los siete que indica la anterior figura.
Aunque compile.bat solo mencione como cinco.

IMPORTANTE:

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 24
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

Recuerde, que en algunos casos la compilación con JCreator es insuficiente.

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

REM Generated by WSDK 5.0 on Sat Dec 16 12:46:00 CST 2006

REM Set the USER_CLASSPATH to any extra dependencies required by your


implementation.

set USER_CLASSPATH=

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 25
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

Con JCreator solo ejecutamos, no compilamos, el Client.java

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 26
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

La construcción de Client.java quedó así:

package it.javaportal.www;

public class Client


{
public static void main (String[] args)
{
try {
System.out.println
("************ Java Portal News.- 16- dic. 2006 - **************");

JIPNewsServiceLocator loc = new JIPNewsServiceLocator();


JIPNews port = loc.getJIPNews();

// java.lang.String giveMe_EN(int news_Number)

java.lang.String resultado = new String();


int news_Number = 3;

resultado = port.giveMe_EN(news_Number);

System.out.println ("Resultado = " + resultado);


}
catch(Exception e){ }

A manera de estrategia, siempre atraiga el método a utilizarse y péguelo como


comentario:

// java.lang.String giveMe_EN(int news_Number)

De esa forma, sabemos como preparar los argumentos de envío y de recepción

java.lang.String resultado = new String();


int news_Number = 3;

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 27
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 28
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Originalmente, trae la extención xml pero debemos cambiarla a la extensión wsdl, y


guardar con tipo “todos los archivos” para que no se altere la extensión del archivo.

Ahora copiamos el archivo “moviefuctions.wsdl” a la carpeta

C:\wsdk_v5\bin

Ejecutamos el commando: wsdl2webservice

C:\WSDK_v5\bin>
wsdl2webservice -createservice theaters -project theater moviefunctions.wsdl

Creating new Web-Service: theaters ...

Creating build script...

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

Then compile the code using the provided script C:\WSDK_v5\bin\theater\theaters\


compile.bat and run the tool again with the -createEar option.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 29
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Con el mensaje anterior se indica que todo salió bien y se ha creado este contenido:

Copiamos el archivo compile.bat como compile2.bat, en su misma carpeta de origen:

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 30
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

A compile2.bat lo abrimos con block de notas y agregamos la expresión “client-side\”


en la línea correspondiente a la búsqueda de los archivos *.java, y guardamos los
cambios:

@echo off

REM Generated by WSDK 5.0 on Sun Dec 17 16:40:53 CST 2006

REM Set the USER_CLASSPATH to any extra dependencies required by your


implementation.

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:

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 31
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

En donde, el valor de name: MovieInformationSoap, me indica que abra ese archivo


java y allí encontraré la clase para la instanciación del objeto “port”

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:

//java.lang.String zipCode, int radius

java.lang.String zipCode = “10034”; // código posta de los Estados Unidos de América.


int radius = 2;

Ahora prepare el argumento de recepción:

//com.ignyte.www.ArrayOfTheater

com.ignyte.www.ArrayOfTheater miArrayOfTheater = new


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”

miArrayOfTheater = port.getTheatersAndMovies (zipCode, radius);

Ahora, como miArrayOfTheater pertenece a la clase ArrayOfTheater entonces, abrimos


el archivo ArrayOfTheater.java y encontramos que posee un método que se llama:

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:

com.ignyte.www.Theater[] miTheater; // solo declaración

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 32
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Recuerda la regla, si se trata de un array no puedo instanciarlo con el operador new,


porque desconozco de antemano la magnitud que finalmente tendrá el array.

Ahora ya puedo usar el método:

miTheater = miArrayOfTheater. getTheater();

Análogamente, los metodos de miTheater los encontramos en su clase y ésta se


encuentra en el archivo Theater.java

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 33
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Buscamos la carpeta raiz de nuestro proyecto y descendemos solo hasta client-side,


nada más, allí damos ACEPTAR.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 34
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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)

Cuando salga, no olvide aplicar el botón APPLY.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 35
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

Por cada *.java, incluyendo a Client.java, compile2.bat crea un *.class

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 36
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Ahora, con JCreator, solo ejecutamos, no compilar, el Client.java.

El código de Client.java

package com.ignyte.www;

public class Client


{
public static void main (String[] args)
{
try

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 37
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

MovieInformationLocator loc = new MovieInformationLocator ();


MovieInformationSoap port = loc.getMovieInformationSoap();

// com.ignyte.www.ArrayOfTheater getTheatersAndMovies (java.lang.String zipCode,


int radius)

java.lang.String zipCode = "10034"; // código posta de los Estados Unidos de América.


int radius = 2;

//com.ignyte.www.ArrayOfTheater

com.ignyte.www.ArrayOfTheater miArrayOfTheater = new


com.ignyte.www.ArrayOfTheater ( );

miArrayOfTheater = port.getTheatersAndMovies (zipCode, radius);

//com.ignyte.www.Theater[] getTheater()

com.ignyte.www.Theater[] miTheater; // solo declaración, al tratarse


de un array desconozco el tamaño que tendrá //ya que se instanciará con un método.

miTheater = miArrayOfTheater.getTheater();

// OJO, VEA QUE EL RECORRIDO DEL ARREGLO DEBE SER DESDE 0, ES


DECIR, i=0

for (int i=0; i<miTheater.length; i++)


{
String NombreTeatro = miTheater[i].getName();
String Direccion = miTheater[i].getAddress();
System.out.println ("Nombre del teatro: " +NombreTeatro );
System.out.println ("Direccion: "+ Direccion);

ArrayOfMovie Peliculas = miTheater[i].getMovies();


com.ignyte.www.Movie[] ArraydePeliculas = Peliculas.getMovie();

for (int w=0; w<ArraydePeliculas.length; w++)


{
java.lang.String
NombreDePelicula = ArraydePeliculas[w].getName(); // Todo array
comienza con indice = 0
java.lang.String Clasificacion =
ArraydePeliculas[w].getRating();
java.lang.String horario = ArraydePeliculas[w].getRunningTime();

System.out.println("Pel: " +NombreDePelicula + " Clas: " +


Clasificacion + " hor: " + horario);
}
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 38
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

System.out.println ("************* Theaters and Movies. 17-dic-2006


****************");
}
catch(Exception e)
{ }

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 39
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

CREACIÓN DE CLIENTES EN VERSIÓN JSP

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.

En la subcarpeta “classes” copie el package completo utililizado en Agenteel, recuerde


que dicho package comienza a derivar inmediatamente después de “client-side”

Para este caso, el package solo tiene una carpeta que se llama “AgenteelCodigoPostal”

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 40
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Entonces, copiamos “AgenteelCodigoPostal” con todo su contenido a la subcarpeta


“classes” antes creada, en nuestro proyecto para JSP’S

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”

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 41
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

Codigo del index.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java"
import="java.sql.*" errorPage="" %>
<html>
<head>
<title>Documento sin t&iacute;tulo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 42
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios 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>&nbsp; </p>
</form>
<p><strong></strong> </p>
</div>
</body>
</html>

Este código:

<%@ page contentType="text/html;charset=UTF-8" language="java"


import="java.sql.*" errorPage="" %>

Entíendase como un requisito para la funcionalidad del servicio.

Por otra parte, el código para invoke.jsp es el siguiente

<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*,


AgenteelCodigoPostal.*" errorPage="" %>
<html>
<head>
<title>Documento sin t&iacute;tulo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<% String valorcp=request.getParameter("textfield");%>

<%
try
{

AgenteelCodigoPostalServiceLocator loc = new


AgenteelCodigoPostalServiceLocator();
AgenteelCodigoPostal.AgenteelCodigoPostalPort port =
loc.getAgenteelCodigoPostalPort();
AgenteelCodigoPostal.CPQuery codigo2=new AgenteelCodigoPostal.CPQuery();
codigo2.setCodigoPostal(Integer.parseInt(valorcp));

int codigo;
String asentamiento;
String tipo;

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 43
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

String municipio;
String estado;
String ciudad;

%>

<div align="center">
<p><strong>Resultado de la invocacion </strong></p>
<p>&nbsp;</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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 44
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

El crear un archivo War para un sistema JSP tiene todo un procedimiento que
acontinuación de describe:

DESCRIPCIÓN GENERAL DEL PROCEDIMIENTO PARA


CREAR UN ARCHIVO WAR
PARA EJECUTAR SISTEMAS JSP.

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)

De tal forma que con:

http://localhost:8080/miwar <intro>

Accedo al sistema jsp, obviamente, ingresando por la página de bienvenida a dicho


sistema.

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 45
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

3.- Arrancar el TomCat de Java (TM) Web Services Developer.

Programas / Java (TM) Web Services / Start TomCat

4.- Arrancar DeployTool

Programas / Java (TM) Web Services / Deploy Tool

Dentro de la aplicación Deploy Tool

File / New Web Application / Next

Module File Name: miwar

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

“Please cose the type of Web component you are creating

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

y veo que mi aplicación (miwar) todavía no está corriendo

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 46
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Ahora doy clic en la aplicación que yo cree. Por ejemplo, miwar y con el botón derecho
doy DEPLOY

CLOSE

Si ahora doy clic en

Servers / localhost:8080

Puedo ver que miwar está corriendo

Abro el explorador y ejecuto

http://localhost:8080/miwar

y se ejecuta el archivo principal (index.jsp) que da acceso al todo el sistema.

La ventaja es que el sistema puede estar en una carpeta con ubicación X.

Desventaja: Si se modifica algún JSP se requiere crear otro war con repetición del
proceso de creación del war.

UTILIZANDO LA HERRAMIENTA Java (TM) Web Services / Deploy Tool


PARA CREAR UN WAR PARA EL SISTEMA JSP Agenteel

Nota: mi PC ya tiene el JBuilder 2005, el cual se requiere por su máquina virtual. Y ya


tengo instalado Java (TM) Web Services en su versión 1_0_01 …

Arranco TomCat de Java (TM) Web Services.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 47
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Arrancar el Deploytool

Actualmente entro entrar como

Usuario: enrique
Clave: ADMIN

Entro a FILE / New Web Aplication / Next

Y allí, en Modulo File especifico el nombre que tendrá mi war: Agenteel17dic

Doy clic en botón EDIT

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 48
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

Vea que el contenido de la carpeta Agenteel debe copiarse a “Contens of Agentel17dic”

Elijo JSP

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 49
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

NEXT

A continuación, despliego JSP Filename y elijo index.jsp

NEXT
FINISH

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 50
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

Si ahora doy clic en

Servers / localhost:8080 puedo ver que mi aplicación está corriendo

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 51
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Abro el explorador y ejecuto

http://localhost:8080/Agenteel17dic

y se ejecuta el archivo principal, index.jsp que da acceso al sistema jsp

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 52
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

EJECUTAR EL Agenteel17dic.war con el TomCat de Yakarta (el típico TomCat)

Cerrar el Deploytool
Cerra el TomCat de Java (TM) WebServices

Arrancamos el TomCat de Yakarta

Busco el archivo war antes creado: Agenteel17dic.war y lo copio a: la carpeta webapps


del TomCat que estoy usando

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 53
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

Abro el explorador y ejecuto

http://localhost:8080/Agenteel17dic

Automáticamente, éste busca el archivo de presentación: index.jsp y lo despliega

http://localhost:8080/Agenteel17dic/Agenteel/index.jsp

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 54
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

COMO HACER EL SERVICIO PROXY


PARA AMAZONBOX

M.C.. Enrique Ruiz Díaz

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 55
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

Nombre del wsdl: amazonproxy

Regla 1: CONDICIÓN: Se deben especificar tantos parámetros de envío


(Request) como métodos se vayan a programar.

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 primer parámetro de envío de nombre BookPalabra:

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 56
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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 tengo lo siguiente:

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 57
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Regla 2: Para cada método que programe requiere Messages exclusivos

Aprovecho que ya tengo un MessageReques y un MessageResponse y los re-nombro


como BookRequest y BookResponse, respectivamente.

Ahora, necesito crear una pareja de estos para el método para DVD’s

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 58
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Ahora conecto los Messages con los tipos de datos

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.

Para el Message BookResponse creo un Parts de nombre resp de tipo Respuesta.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 59
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Para el Message DVDRequest creo un Parts de nombre palabra de tipo DVDPalabra.

Para el Message DVDResponse creo un Parts de nombre resp de tipo Respuesta.

Por otra parte, necesito definir dos métodos, el sistema ya me provee del primero.

Renombre NewOperation como getBook, y creo un nuevo método de nombre getDVD.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 60
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Para el metodo getBook, en la pestaña de Messages, me aseguro que Request esté con
BookRequest y Response con BookResponse.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 61
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Para el método getDVD asigno en la pestaña Messages, en Request a DVDRequest y en


Response asigno DVDResponse.

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 62
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

En la primera rama que deriva de Bindings debemos especificar Style: document.

Dentro de bindings descendemos al primer método getDVD, en la pestaña Request


damos “ADD” aparece la parte “palabra”, suprimimos esta con el cursor.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 63
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

Note que para ambos métodos el Style es document y el Use es Literal.

Guardamos el archivo, abrimos con block de notas y borramos la parte de

parts=""

la cual aparece cuatro veces

Creamos un proyecto nuevo en NetBeans 5.5

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 64
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

New Proyect / Web / Web Application

Sobre el proyecto, creamos un cliente para nosotros consumir el servicio Web de


AmazonBox.

WebApplication11/ New / Web Service Client /

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 65
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

http://www.xmlme.com/WSAmazonBox.asmx?WSDL URL del servicio Web de


Amazon Box.

Indicamos el URL del servicio Web de Amazon e indicamos un paquete: www.amazon

Se agrega un cliente (o sea nosotros) para el servicio Web de Amazon Box.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 66
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Sobre nuestro proyecto, creamos un servicio Web, de nosotros para nuestro cliente
Proxy.

WebApplication11/ New / Web Service from WSDL …

Asignamos un nombre Enrique, asignamos el mismo package www.amazon


Y atraemos el wsdl antes creado con soa editor

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 67
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Se crea nuestro servicio Web con los dos métodos: getBook y getDVD

Ahora programamos ambos métodos de acuerdo a reglas ya conocidas.

Los métodos que se generan, listos para programarse.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 68
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Buscamos el objeto BookBox del servicio Web de AmazonBox y lo arrastramos y


soltamos dentro de nuestro método getBook.

Por otra parte, Apuntamos al objeto DvdBox lo arrastramos y soltamos dentro de


nuestro método getDVD.

Si no pasa nada cierre el IDE y cárguelo de nuevo


.

La acción anterior crea código automático, en un try – match, bórrelo para ambos
métodos.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 69
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 70
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

______________________________________________________________________

public String getBook(String palabra) {

String resul = "";

try { // Call Web Service Operation


www.amazon.AmazonBox clien = new www.amazon.AmazonBox();
www.amazon.AmazonBoxSoap obj = clien.getAmazonBoxSoap();
resul = obj.bookBox(palabra);

} catch (Exception ex) {


// TODO handle custom exceptions here
}
return resul;
}

______________________________________________________________________

Una vez programados ambos métodos, ejecutamos nuestro proyecto.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 71
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Nos despliega una pagina JSP PAGE con el siguiente URL

http://localhost:8080/WebApplication12/

A este url agregamos:

http://localhost:8080/WebApplication12/amazonproxy?wsdl

y se despliga el documento WSDL el que debemos entregar a nuestro cliente Proxy, no


el creado con SOA EDITOR, (NO ES EL MISMO)

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 72
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 73
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 74
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

COMO RESOLVER EL MODO PROXY

Autor: M.C. Enrique Ruiz Díaz

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 75
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Como instalar correctamente NetBeans 5.5.

1) Desinstalar el netbeans actual (por ejemplo 5.0).

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

3) Desinstalar el servidor que está en c:\sun\appservers\.

4) Borrar la carpeta: c:\sun\appservers\.

5) Desinstalar, si los hubiera, paqueterías complementarias al NetBeans que se está


desistalando. Tales como relativos a dispositivos moviles, etc.

5) Instalar la paquetería NetBeans 5.5 en este orden:

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 76
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

COMO CONSTRUIR LOS WSDL PARA LOS CLIENTES


DEL PORTAL EN SU MODO PROXY.
Con el procedimiento idéntico para la creación de WSDL’s estilo: DOCUMENT y
LITERAL con SOA Editor. Recordar que estos tipos de WSDL requieren datos con
determinado formato. Dichas reglas para creación de datos para este tipo de WSDL’s es
importante.

Nota: NetBeans 5.5 no me aceptó un documento WSDL estilo RPC y ENCODED.

COMO CREAR EL SERVICIO PROXY

1) Crear un proyecto.

FILE / NEW PROYECT / WEB / WEBAPPLICATION

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.

NEW / Web Service From WSDL … /

Allí, atraigo el WSDL antes creado con SOA Editor.

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.

NEW / Web Service Client … /

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

NOTA: TANTO EL SERVICIO WEB COMO EL CLIENTE, DEBEN TENER UN


PACKAGE QUE DEBE SER EXACTAMENTE EL MISMO.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 77
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Como aparece el servicio Web cliente que se agregó al proyecto

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.

Programación del servicio Web para el cliente del modo Proxy

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 78
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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:

www.edu.AmazonBox clien = new www.edu.AmazonBox();

Sobre el objeto antes creado, aplico el correspondiente método que me permita


instanciar un objeto de una rama secundaria a la rama principal.

www.edu.AmazonBoxSoap obj = clien.getAmazonBoxSoap();

Note que “AmazonBoxSoap” es una rama que desciende de la rama principal


“AmazonBox”

Por último, de la anterior rama secundaria, aplico el método o métodos de interes


para obtener objetos que derivan de dicha rama secundaria. Y que en este caso, son
elementos de respuesta concreta que el proveedor externo ofrece.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 79
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

String resul = obj.bookBox(palabra);


Note que “bookBox” es una rama que desciende de la rama secundaria
“AmazonBoxSoap” y su producto, el objeto String “resul” ya es un elemento de
respuesta neto del proveedor externo del servicio Web.

Note la importancia de haber empleado el mismo package www.edu tanto para la


inclusión, al proyecto, del servicio Web cliente (de nosotros al proveedor externo)
como para la programación del servicio Web que se ofrece en modo Proxy, para los
clientes del portal en este modo.

De todos modos, no olvidar el arrastrar y soltar los componentes antes citados, en el


entorno de programación. Recordar que en dicho entorno de programación, cuando
se escribe un punto (.) NetBeans expresa los paquetes que están disponibles.

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:

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 80
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Los elementos de la paquetería www.edu de allí la importancia de utilizar el mismo


package.

5) Ejecutar el proyecto

WebApplication1 / Run

Debe desplegar una página JSP

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 81
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 82
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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:

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 83
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 84
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

COMO HACER UN SERVICIO PROXY, QUE INTERNAMENTE, INVOQUE A


DOS PROVEEDORES EXTERNOS INDEPENDIENTES ENTRE SI.

1) Crear un nuevo proyecto:

FILE / New Proyect / Web / Web Application

Next

Asignamos un nombre, por ejemplo: WebApplication3

2) Creamos un servicio Web (el de nosotros para nuestros clientes del modo
Proxy).

WebApplication3 (botón derecho)

New / Web Service From WSDL /

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 85
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 86
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Requerimos especificar un package, por ejemplo, www.prueba y atraemos el


documento WSDL que se hizo, previamente, con Soa Editor, para el servicio que se
entregará a los clientes del modo Proxy. (No obstante, recordar que el documento
WSDL definitivo para los clientes del modo Proxy lo genera NetBeans, pero toma
como punto de partida el WSDL creado, primeramente, con Soa Editor).

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 87
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

NetBeans crea automáticamente el método, obviamente, con la programación del


mismo a nuestra responsabilidad.

Este servio invocará, internamente, a dos proveedores distintos de servicios Web, es


decir, seremos, a su vez, cliente de éstos.

3) Agregamos el primer servicio cliente

WebApplication3 / New / Web Service Client. ..

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 88
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

A continuación, expresamos el URL del documento wsdl del primer proveedor


externo que estamos agregando, o bien, si ya descargamos su documento WSDL lo
invocamos localmente. Además, especificamos un package, expresemos el mismo
que se empleo cuando se creo el servicio Web. Es decir, www.prueba

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 89
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Se debe agregar, automáticamente, al entorno de nuestro proyecto el primer


proveedor externo de servicio Web.

Siguiendo un procedimiento análogo, agreguemos el segundo proveedor externo de


servicio Web. Sin embargo, no nos aceptará el mismo package www.prueba por lo
que ahora, especifiquemos el package www.prueba2

Ahora, el entorno NetBeans presenta dos proveedores externos de servicio Web

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 90
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Vea que las ramas finales de ambos servicios Web representan los métodos que
finalmente proveen el servicio Web.

PRUEBE ARRASTRANDO Y SOLTANDO, DICHOS MÉTODOS DE


SERVICIOS WEB, AL ENTORNO DE PROGRAMACIÓN DEL SERVICIO
WEB (de nosotros para los clientes Proxy).

NO OBSTANTE LO ANTERIOR, PARA QUE RECONOZCA EL SEGUNDO


PACKAGE, ES NECESARIO CERRAR EL IDE Y VOLCAR A CARGARLO.

4) Para empezar a invocar a un proveedor externo, el símbolo:

Nos indica el primer objeto que hay que obtener:

Así, podemos ver, que nuestra primera tarea es obtener el objeto MovieInformation

www.prueba.MovieInformation clien = new www.prueba.MovieInformation();

Siguiendo la lógica, nuestra segunda tarea, es obtener un objeto de la rama derivada de


la primera, es decir, de la rama MovieInformationSoap

www.prueba.MovieInformationSoap obj = clien.getMovieInformationSoap();

Con el objeto obtenido del punto anterior, ya podemos acceder a los métodos que nos
proveen el servicio Web.

www.prueba.ArrayOfTheater ArrayOfTheater = obj.getTheatersAndMovies("10034", 2);

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 91
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios 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.

Se sigue un procedimiento análogo al punto anterior. Note que cada invocación


de servicio Web tiene el package que en su momento se le asignó.

Creamos el elemento de respuesta que se espera del método de nuestro servicio Web
Proxy, es decir, un String, en este caso.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 92
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

6) Ejecutamos el proyecto.

Se debe desplegar, el navegador un una expresión “JSP PAGE”

7) Atraemos el WSDL creado con NetBeans que es el que se entregaría a los


clientes del modo Proxy del portal.

http://localhost:8080/WebApplication3/proxyAmazon?wsdl

8) Sin necesidad de programar un cliente para el anterior WSDL, usando la


expresión ?Tester podemos comprobar el buen funcionamiento.

http://localhost:8080/WebApplication3/proxyAmazon?Tester

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 93
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 94
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

TUTORIAL SOBRE COMO CREAR


SERVICIOS WEB
CON NETBEANS (Versión 1)
_____________________________________________________

AUTOR: M.C.. ENRIQUE RUIZ DIAZ

Maestría en Ciencias en Ciencias Computacionales


Instituto Tecnológico de Orizaba

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 95
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

TAREA 1

Definición: Dado un número de código obtener la información del registro de la base de


datos para ese número de código.

1) CREANDO EL DOCTO. WSDL CON SOA EDITOR.

Name: a_tarea1
OK

A continuación reduzco el nombre de los dos elementos de “Message”.

Messages

• NewMessageRequest
• NewMessageResponse

Hacer: a ambos le quito la expresión “New”

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

Ahora nos dirigimos a “Binding”

Binding / a_tarea1Binding/

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 96
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Asignamos a “Style” el valor “rpc”

Ahora, allí mismo descendemos un nivel:

Binding / a_tarea1Binding/NewOperation

En pestaña “Request” damos “Add” y se debe agregar, automáticamente, a “Parts” la


variable “code” que es el parámetro de solicitud. Luego, asigno:

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.

Nombre, description, precio

Asignamos:

Use: encoded
Style: rpc

Y guardamos el docto. WSDL

2) CREANDO EL SERVICIO WEB CON NETBEANS

A) Crear un proyecto

File / New Proyect / Web / Web Application

Name : a_tarea1

B) Crear el servicio Web dentro del proyecto “a_tarea1”

a_tarea1 / New / WebService

(use el botón derecho del Mouse)

Name: a_tarea1

En package especifico una URL apropiado al tema, por ejemplo

Package = www.a_tarea1.edu

(x) From Local WSDL File

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 97
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Allí atraigo el documento WSDL antes creado con Soa Editor

C) Programar el método que se genera en el servicio Web del proyecto. El cual, si


está correcto debe presentar un parámetro de recepción para un número de
código y debe variables holders que constituyen parámetros actualizados por
referencia para tomar la información del registro de la base de datos.

// 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.*;

public class A_tarea1PortType_Impl implements www.a_tarea1.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 {

Connection canal = null;


ResultSet tabla2= null;
Statement instruccion=null;
String sitiobase = "c:/mybase/BD1.mdb";
String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +
sitiobase;

// detectando y cargando el objeto submit de html

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 98
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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 + "'";

// ESTA LINEA FUNCIONA SI Codigo es de valor Texto en la base de


datos, porque 'code' está como valor cadena
// String sql = "SELECT * FROM Tabla WHERE Codigo='" + code + "'";

String sql = "SELECT * FROM Tabla WHERE Codigo=" + code;

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

nombre.value= (String) tabla2.getString(2);


description.value = (String) tabla2.getString(3);
precio.value = Float.parseFloat(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)
{};

}
}

D) Dar “Run Proyect” al proyecto “a_tarea1. No al Servicio Web del proyecto


“a_tarea1”

Debe desplegarse el navegador con una página con el mensaje

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 99
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

“JSP Page”

Con el URL:

http://localhost:8080/a_tarea1/

Al URL que presenta el navegador le agrego la expresión:

a_tarea1?wsdl

Se debe desplegar el documento WSDL generado por NetBeans (que no es el


mismo al antes generado con Soa Editor).

Cópiese este documento WSDL con

Archivo / Guardar como /

"a_tarea1.wsdl"

Vea el uso de las comillas dobles y la asignación de la extención wsdl y no xml.

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.

3) CREAR EL CLIENTE QUE CONSUMA EL SERVICIO


WEB DE LA TAREA 1

El como crear un cliente para consumir un servicio Web descrito en un


documento wsdl tiene un determinado procedimiento que antes o posteriormente
será descrito. En este momento se dará por hecho que usted saber crear el cliente
dado el documento wsdl. (y este documento wsdl es el creado con netbeans)

La programación del cliente queda así:

package com.your_company.www;

public class Client


{
public static void main (String[] Arg)
{

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 100
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

try
{
System.out.println ("hola a");

A_Tarea1Locator loc = new A_Tarea1Locator();


A_Tarea1PortType port = loc.geta_tarea1PortTypePort();

// void newOperation(int code,


javax.xml.rpc.holders.StringHolder nombre,
javax.xml.rpc.holders.StringHolder description,
javax.xml.rpc.holders.DoubleHolder precio)

int code = 100;

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

port.newOperation(code, nombre, description, precio);

System.out.println
("*********************************************
**********************************");
System.out.println ("(a_tarea1)
....................................................................");

System.out.println (code + " " + nombre.value + " " +


description.value + " " + precio.value);
}
catch (Exception e)
{
}
}
}

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 101
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

TAREA 2

Definición: Obtener la información de toda la base de datos.

1) CREANDO EL DOCTO. WSDL CON SOA EDITOR.

Name: a_tarea2
OK

A continuación reduzco el nombre de los dos elementos de “Message”.

Messages

• NewMessageRequest
• NewMessageResponse

Hacer: a ambos le quito la expresión “New”

Para “MessageRequest” en este caso, le suprimo el argumento de “Parts” porque no


existirá ningún parámetro de envío.

MessageRequest
Parts
Arg1 (remove)

Para “MessageResponse” define el parámetro de respuesta que consistirá en un objeto


Esto de la siguiente manera.

a) Creamos un tipo complejo

Schema
Insert Complex Type

Definition Type (x) Complex Type


Content Model (x) Secuence

Name: datos1

Child Elements
Add
code Type: int
Add
nombre Type : String
Add
description Type : String
Add

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 102
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

precio Type : double


ok
b) Creamos un tipo SOA Encoded Array

Schema
Insert SOAP encoded Array

Name: Arraydatos2

Type: datos1

Minimum number of ítems = 0


Maximum number = Unbounded
Definition type: (x) Complex Type

Ok

En MessageRequest no debe haber contenido alguno en “Parts” dado que no se envía


parámetro alguno en la solicitud.

MessageResponse
Parts
Add
Name : resultado Type: Arraydatos2

Ahora nos dirigimos a “Binding”

Binding / a_tarea2Binding/

Asignamos a “Style” el valor “rpc”

Ahora, allí mismo descendemos un nivel:

Binding / a_tarea2Binding/NewOperation

En pestaña “Request” damos “Add” y no debe agregarse parámetro alguno porque no


existe para Request. Luego, asigno:

Use: encoded
Style: rpc
Parts : (vacío)

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 103
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

Y guardamos el docto. WSDL (sugerencia: guardelo en una carpeta relacionada a la


tarea 2 e indicando que es el wsdl creado con Soa Editor, que no será el mismo wsdl que
luego cree NetBeans)

2) CREANDO EL SERVICIO WEB CON NETBEANS

E) Crear un proyecto

File / New Proyect / Web / Web Application

Name : a_tarea2

F) Crear el servicio Web dentro del proyecto “a_tarea2”

a_tarea2 / New / WebService

(use el botón derecho del Mouse)

Name: a_tarea2

En package especifico una URL apropiado al tema, por ejemplo

Package = www.a_tarea2.edu

(x) From Local WSDL File

Allí atraigo el documento WSDL antes creado con Soa Editor

G) Programar el método que se genera en el servicio Web del proyecto. El cual, si


está correcto no debe presentar parámetro de envío y debe retornar un array de
objeto el cual contendrá todos los registros de la base de datos.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 104
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

// 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
*/

public class A_tarea2PortType_Impl implements www.a_tarea2.edu.A_tarea2PortType,


java.rmi.Remote {
public www.a_tarea2.edu.Datos[] newOperation() throws
java.rmi.RemoteException {

www.a_tarea2.edu.Datos[] _retVal;

Connection canal = null;

ResultSet tabla2= null;

Statement instruccion=null;

String sitiobase = "c:/mybase/BD1.mdb";

String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +


sitiobase;

// detectando y cargando el objeto submit de html

try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

canal=DriverManager.getConnection(strcon);

instruccion =
canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 105
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

}
catch (java.lang.ClassNotFoundException e){} catch(SQLException e)
{};

List Milista = new ArrayList();

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 + "'";

// ESTA LINEA FUNCIONA SI Codigo es de valor Texto en la


base de datos, porque 'code' está como valor cadena
// String sql = "SELECT * FROM Tabla WHERE Codigo='" +
code + "'";

// Donde code es de tipo int y no de tipo String


//String sql = "SELECT * FROM Tabla WHERE Codigo=" +
code;

//String sql = "SELECT * FROM Tabla";

// int code = 100;

String sql = "SELECT * FROM Tabla";


tabla2 = instruccion.executeQuery(sql);

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

Informacion infor = new Informacion (codigo,


nombre, description, precio);
Milista.add(infor);
}; // fin while
// cerrando resultset
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 106
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

tabla2.close();
}
instruccion.close();
canal.close();
} //fin try no usar ; al final de dos o mas catchs

catch(SQLException e)
{};

www.a_tarea2.edu.Datos[] MiVal = new www.a_tarea2.edu.Datos[Milista.size()];

for (int w=0; w<Milista.size(); w++)


{
MiVal[w] = new www.a_tarea2.edu.Datos();

Informacion tempInfor;
tempInfor = (Informacion) Milista.get(w); // todo array !! REQUIERE
INICIALIZACIÓN CADA UNA DE LAS POSICIONES. !!

Integer cod = new Integer (tempInfor.getCode());


String nombre = new String (tempInfor.getNombre());
String description = new String ("a_tarea2" + tempInfor.getDescription());
Double costo = new Double (tempInfor.getPrecio());

MiVal[w].setCode(cod);
MiVal[w].setNombre(nombre);
MiVal[w].setDescription(description);
MiVal[w].setPrecio(costo);
}

return MiVal;
}

public class Informacion


{
private Integer code;
private String nombre;
private String description;
private Double precio;

public Informacion (int micode, String nom, String descrip, double pre)
{
code = new Integer (micode);
nombre = nom;
description = descrip;
precio = new Double (pre);
}

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 107
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

public void setNombre(String nom)


{ nombre=nom; }

public void setDescription (String descrip)


{ description = descrip; }

public int getCode ()


{ return code.intValue();}

public String getNombre ()


{return nombre; }

public String getDescription ()


{ return description; }

public double getPrecio()


{return precio.doubleValue(); }

} // fin de "public class Informacion"

H) Dar “Run Proyect” al proyecto “a_tarea2”.

Debe desplegarse el navegador con una página con el mensaje

“JSP Page”

Con el URL:

http://localhost:8080/a_tarea2/

Al URL que presenta el navegador le agrego la expresión:

a_tarea2?wsdl

Se debe desplegar el documento WSDL generado por NetBeans (que no es el


mismo al antes generado con Soa Editor).

Cópiese este documento WSDL con

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 108
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Archivo / Guardar como /

"a_tarea2.wsdl"

Vea el uso de las comillas dobles y la asignación de la extención wsdl y no xml.

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.

3) CREAR EL CLIENTE QUE CONSUMA EL SERVICIO


WEB DE LA TAREA 1

El como crear un cliente para consumir un servicio Web descrito en un


documento wsdl tiene un determinado procedimiento que antes o posteriormente
será descrito. En este momento se dará por hecho que usted saber crear el cliente
dado el documento wsdl. (y este documento wsdl es el creado con netbeans)

La programación del cliente queda así:

package com.your_company.www;

public class Client


{
public static void main (String[] Arg)
{

try
{

A_Tarea2Locator loc = new A_Tarea2Locator();


A_Tarea2PortType port = loc.geta_tarea2PortTypePort();

// com.your_company.www.Datos[] newOperation()

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 109
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

// vea que al arreglo "resultado" no se le puede especificar un


//tamaño, porque se
// desconoce la cantidad de registros que tendrá la bd. el tamaño
se asigna
// dinamicamente con el método newOperation()

com.your_company.www.Datos[] resultado;

resultado = port.newOperation();

System.out.println
("***************************************************
********");
System.out.println ("a_tarea2 -------------------------------------------
-------");

for (int i=0; i<resultado.length; i++)


{
java.lang.Integer code = resultado[i].getCode();
java.lang.String nombre = resultado[i].getNombre();
java.lang.String description =
resultado[i].getDescription();
java.lang.Double precio = resultado[i].getPrecio();

System.out.println (code.intValue() + " " + nombre + " " +


description + " " + precio.doubleValue() + "\n\n");
}

}
catch (Exception e)
{
}
}
}

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 110
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

1) CREANDO EL DOCTO. WSDL CON SOA EDITOR.

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

2) CREANDO EL SERVICIO WEB CON NETBEANS

Cree el proyecto y su servicio Web con NetBeans aplicando un procedimiento análogo


al ya visto en los ejercicios anteriores.

Obviamente, el cambio principal está en la programación del servicio Web, el cual debe
capturar los productos con el precio más bajo.

// Programación del servicio Web tarea 3

package www.a_tarea3.edu;

import java.io.*;
import java.util.*;
import java.net.*;
import java.sql.*;

public class A_tarea2PortType_Impl implements www.a_tarea3.edu.A_tarea2PortType,


java.rmi.Remote {
public www.a_tarea3.edu.Datos[] newOperation() throws
java.rmi.RemoteException {

www.a_tarea3.edu.Datos[] _retVal = null;

Connection canal = null;


ResultSet tabla2= null;
Statement instruccion=null;
String sitiobase = "c:/mybase/BD1.mdb";
String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +
sitiobase;

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 111
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

// detectando y cargando el objeto submit de html

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

List Milista = new ArrayList();

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 + "'";

// ESTA LINEA FUNCIONA SI Codigo es de valor Texto en la base de


datos, porque 'code' está como valor cadena
// String sql = "SELECT * FROM Tabla WHERE Codigo='" + code +
"'";

// Donde code es de tipo int y no de tipo String


//String sql = "SELECT * FROM Tabla WHERE Codigo=" + code;

//String sql = "SELECT * FROM Tabla";

String sql = "SELECT * FROM Tabla";


tabla2 = instruccion.executeQuery(sql);

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 112
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

double precio = Double.parseDouble(new String


(tabla2.getString(4)));

Informacion infor = new Informacion (codigo, nombre,


description, precio);

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

www.a_tarea3.edu.Datos[] temp = new www.a_tarea3.edu.Datos[Milista.size()];

double minimo = 0.0;

for (int w=0; w<Milista.size(); w++)


{
Informacion tempInfor = (Informacion) Milista.get(w);

Integer cod = new Integer (tempInfor.getCode());


String nombre = new String (tempInfor.getNombre());
String description = new String (tempInfor.getDescription());
Double costo = new Double (tempInfor.getPrecio());

temp[w]= new www.a_tarea3.edu.Datos(); // !! REQUIERE INICIALIZACIÓN


CADA UNA DE LAS POSICIONES. !!

temp[w].setCode(cod);
temp[w].setNombre(nombre);
temp[w].setDescription(description);
temp[w].setPrecio(costo);

if (w==0)
{
minimo=costo.doubleValue();
}

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 113
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

if (costo.doubleValue() <= minimo)


{
minimo = costo.doubleValue();
}
}

int contadorDeMinimos = 0;

for (int w=0; w<temp.length; w++)


{
Double precio = temp[w].getPrecio();

if (precio.doubleValue()==minimo)
{
contadorDeMinimos = contadorDeMinimos + 1;
}
}

Integer a = new Integer (contadorDeMinimos);

www.a_tarea3.edu.Datos[] MiVal = new


www.a_tarea3.edu.Datos[contadorDeMinimos];

int k=0;

for (int w=0; w<temp.length; w++)


{
Double precio2 = temp[w].getPrecio();

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 114
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

return MiVal;

public class Informacion


{
private Integer code;
private String nombre;
private String description;
private Double precio;

public Informacion (int micode, String nom, String descrip, double pre)
{
code = new Integer (micode);
nombre = nom;
description = descrip;
precio = new Double (pre);
}

public void setNombre(String nom)


{ nombre=nom; }

public void setDescription (String descrip)


{ description = descrip; }

public int getCode ()


{ return code.intValue();}

public String getNombre ()


{return nombre; }

public String getDescription ()


{ return description; }

public double getPrecio()


{return precio.doubleValue(); }

} // fin de "public class Informacion"

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 115
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

3) CREAR EL CLIENTE QUE CONSUMA EL SERVICIO


WEB DE LA TAREA 1

El como crear un cliente para consumir un servicio Web descrito en un


documento wsdl tiene un determinado procedimiento que antes o posteriormente
será descrito. En este momento se dará por hecho que usted saber crear el cliente
dado el documento wsdl. (y este documento wsdl es el creado con netbeans)

La programación del cliente queda así:

package com.your_company.www;

public class Client


{
public static void main (String[] Arg)
{
try
{
A_Tarea3Locator loc = new A_Tarea3Locator();
A_Tarea2PortType port = loc.geta_tarea2PortTypePort();

// com.your_company.www.Datos[] newOperation()

// vea que al arreglo "resultado" no se le puede especificar un


tamaño, porque se
// desconoce la cantidad de registros que tendrá la bd. el tamaño
se asigna
// dinamicamente con el método newOperation()

com.your_company.www.Datos[] resultado;

resultado = port.newOperation();

System.out.println
("***************************************************
********");
System.out.println ("a_tarea3 -------------------------------------------
-------");

for (int i=0; i<resultado.length; i++)


{
java.lang.Integer code = resultado[i].getCode();
java.lang.String nombre = resultado[i].getNombre();
java.lang.String description =
resultado[i].getDescription();
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 116
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

java.lang.Double precio = resultado[i].getPrecio();

System.out.println (code.intValue() + " " + nombre + " " +


description + " " + precio.doubleValue() + "\n\n");
}

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

El Servicio 4 recibe el array de códigos, pero internamente debe consumir el servicio


web de la tarea 1 de una forma iterativa para cada codigo del array recibido

1) CREANDO LOS DOCUMENTOS WSDL CON SOA EDITOR.

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.

A) Creando el wsdl para el servicio Web 4

Name: a_tarea4
OK

A continuación reduzco el nombre de los dos elementos de “Message”.

Messages
• NewMessageRequest
• NewMessageResponse

Hacer: a ambos le quito la expresión “New”


Se requiere enviar un array de codigos, pero al crear el wsdl con Soa editor no puede
hacerse de cualquier forma, porque si se crea un array de holders para codigos para
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 117
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

enviarse como parámetro de envío, el JCreator no lo permite. No es posible trabajar con


un array de holders si este es de petición. Por lo que debo enviar un array de Strings

a) Crear un array de Strings para los códigos de envío

Schema / Insert SOAP encoded array

Name: arraycodes
Type: Strings

Minimo = 0
Maximum = Unbounded

Definition Type: (x) Complex type

b) Crear un array de holders para preparar el dato de recepción.

Schema / Insert Complex Type

Name: datos1

Definition Type: (x) Complex Type

Conten Model: (x) All

Add
codigo Type: String
Add
nombres Type: Strings
Add
description Type: String
Add
precio Type: double

c) Crear un array de datos para la respuesta

Schema / Insert Soap encoded array

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

Para “MessageResponse” define el parámetro de respuesta que consistirá en un objeto


Esto de la siguiente manera.

MessageResponse
Parts
Add
Name: respuesta Type: arraydatos

Ahora nos dirigimos a “Binding”

Binding / a_tarea4Binding/

Asignamos a “Style” el valor “rpc”

Ahora, allí mismo descendemos un nivel:

Binding / a_tarea4Binding/NewOperation

En pestaña “Request” damos “Add” y se debe agregar, automáticamente, a “Parts” la


variable “codigos” que es el parámetro de solicitud. Luego, asigno:

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 119
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Y guardamos el docto. WSDL

2) CREANDO EL SERVICIO WEB CON NETBEANS

I) Crear un proyecto

File / New Proyect / Web / Web Application

Name : a_tarea4

J) Crear el servicio Web dentro del proyecto “a_tarea4sw”

a_tarea4 / New / WebService

(use el botón derecho del Mouse)

Name: a_tarea4sw

En package especifico una URL apropiado al tema, por ejemplo

Package = www.a_tarea4.edu

(x) From Local WSDL File

Allí atraigo el documento WSDL antes creado con Soa Editor para el
servicio Web 4

K) Programar el método que se genera en el servicio Web del proyecto. El cual, si


está correcto debe presentar un parámetro de recepción con un array de codigos
y debe presentar de respuesta un array de datos

// 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
*/

public class A_tarea4PortType_Impl implements www.a_tarea4.edu.A_tarea4PortType,


java.rmi.Remote {
public www.a_tarea4.edu.Datos[] newOperation(java.lang.String[] codigos) throws
java.rmi.RemoteException {

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 120
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

www.a_tarea4.edu.Datos[] _retVal = new


www.a_tarea4.edu.Datos[codigos.length];

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

for (int i=0; i<codigos.length; i++)


{
_retVal[i] = new www.a_tarea4.edu.Datos();

tarea1.newOperation(Integer.parseInt(codigos[i]), nombre, description,


precio);

_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;
}
}

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 121
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

L) Crear el servicio Web “a_tarea1sw” dentro del proyecto a_tarea4

a_tarea4 / New / WebService

(use el botón derecho del Mouse)

Name: a_tarea1sw

En package especifico la misma URL del punto anterior. No puede ser


diferente.

Package = www.a_tarea4.edu

(x) From Local WSDL File

Allí atraigo el documento WSDL antes creado con Soa Editor para el
servicio Web 1. El cual fue hecho para la tarea 1

M) Programar el método que se genera en el servicio Web 1 del proyecto. El cual, si


está correcto debe presentar un parámetro de recepción para un número de
código y debe presentar variables holders que constituyen parámetros que se
actualizaran por referencia para tomar la información del registro de la base de
datos.

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 122
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

java.rmi.RemoteException {

Connection canal = null;


ResultSet tabla2= null;
Statement instruccion=null;
String sitiobase = "c:/mybase/BD1.mdb";
String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +
sitiobase;

// detectando y cargando el objeto submit de html

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 + "'";

// ESTA LINEA FUNCIONA SI Codigo es de valor Texto en la base de


datos, porque 'code' está como valor cadena
// String sql = "SELECT * FROM Tabla WHERE Codigo='" + code +
"'";

String sql = "SELECT * FROM Tabla WHERE Codigo=" + code;

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

nombre.value= (String) tabla2.getString(2);


description.value = (String) tabla2.getString(3);
precio.value = Float.parseFloat(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)
{};

}
}

N) Dar “Run Proyect” al proyecto “a_tarea4.

Debe desplegarse el navegador con una página con el mensaje

“JSP Page”

Con el URL:

http://localhost:8080/a_tarea4/

Al URL que presenta el navegador le agrego la expresión:

a_tarea4sw?wsdl

Se debe desplegar el documento WSDL generado por NetBeans (que no es el


mismo al antes generado con Soa Editor).

Cópiese este documento WSDL con

Archivo / Guardar como /

"a_tarea4sw.wsdl"

Vea el uso de las comillas dobles y la asignación de la extención wsdl y no xml.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 124
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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;

public class Client


{
public static void main (String[] Arg)
{

try
{
A_Tarea4SwLocator loc = new A_Tarea4SwLocator();
A_Tarea4PortType port = loc.geta_tarea4PortTypePort();

// com.your_company.www.Datos[]
newOperation(java.lang.String[] codigos)

// vea que al arreglo "resultado" no se le puede especificar un


tamaño, porque se
// desconoce la cantidad de registros que tendrá la bd. el tamaño
se asigna
// dinamicamente con el método newOperation()

com.your_company.www.Datos[] resultado;

java.lang.String[] codigos = new String [3];

codigos[0] = new String("106");


codigos[1] = new String("105");
codigos[2] = new String("104");

resultado = port.newOperation(codigos);

System.out.println
("***************************************************
********");
System.out.println ("a_tarea4 -------------------------------------------
-------");

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 125
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

for (int i=0; i<resultado.length; i++)


{
java.lang.String code = resultado[i].getCodigo();
java.lang.String nombre = resultado[i].getNombre();
java.lang.String description =
resultado[i].getDescription();
java.lang.Double precio = resultado[i].getPrecio();

System.out.println (code + " " + nombre + " " +


description + " " + precio.doubleValue() + "\n\n");
}

}
catch (Exception e)
{
}
}
}

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 126
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

TUTORIAL SOBRE COMO CREAR


SERVICIOS WEB PARA MOVILES
CON NETBEANS (Versión 1)
_____________________________________________________

AUTOR: M.C. ENRIQUE RUIZ DIAZ

Maestría en Ciencias en Ciencias Computacionales


Instituto Tecnológico de Orizaba

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 127
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

RESOLVIENDO LA TAREA 1 PARA MÓVILES

Definición: Dado un número de código obtener la información del registro de la base de


datos con ese número de código.

1) CREANDO EL DOCTO. WSDL CON SOA EDITOR.

Name: m_tarea1
OK

A continuación reduzco el nombre de los dos elementos de “Message”.

Messages

• NewMessageRequest
• NewMessageResponse

Hacer: a ambos le quito la expresión “New”

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í:

Schema / Create Element From Type

Name: code1
Type: String
OK

Para “MessageResponse” preparo el parámetro de respuesta:

Schema / Insert Complex Type

• (x) Element
• (x) Secuence

Name: datos2

Add
• code Type: String
Add

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 128
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

• nombre Type: String


Add
• descripción Type: String
Add
• precio Type: String

(no utilice “double” porque posteriormente se transforma en un dato


wrapper Double y el celular no lo puede procesar dice que falla la
comunicación. Por lo mismo tenga cuidado con los datos int, porque si se
convierten en Integer el celular no los procesa.)

Nota: “Occurrence” queda con el valor “opcional”

Ahora, establezco los parámetros para “MessageRequest” y “MessageResponse”.

• Para “MessageRequest”
o Parts
 Name: codigo Type: code1

• Para “MessageResponse”

o Parts
Add
 Name: resultado: Type: datos2

Ahora nos vamos a

Binding / m_tarea1Binding/

Asignamos a “Style” el valor “document”

Style: document

Ahora, allí mismo descendemos un nivel:

Binding / m_tarea1Binding/NewOperation

Asegurémonos que en “Parts” tanto para la pestaña “Request” como para


la pestaña “Response” no debe haber contenido alguno. Si aparece algún
contenido en la parte “Parts” suprimalo.

Además, tanto para “Request” como para “Response” se configura así:

Style: document
Use: literal

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 129
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Guardo el documento WSDL, luego lo abro con WordPad y busco:

Parts = “ ”
Parts = “ “

Suprimo, únicamente, estas dos expresiones y guardo el documento WSDL con la


modificación.

2) CREANDO EL SERVICIO WEB MOVIL CON NETBEANS

O) Crear un proyecto

File / New Proyect / Web / Web Application

Name : m_tarea1

P) Crear el servicio Web dentro del proyecto “m_tarea1”

m_tarea1 / New / WebService

(use el botón derecho del Mouse)

Name: m_tarea1

En package especifico una URL apropiado al tema, por ejemplo

Package = www.m_tarea1.edu

(x) From Local WSDL File

Allí atraigo el documento WSDL antes creado con Soa Editor

Q) Programar el método que se genera en el servicio Web del proyecto. El cual, si


está correcto debe presentar un parámetro de recepción para un número de
código y debe retornar un dato complejo, que es el que contendrá toda la
información del registro a consultarse en la base de datos.

// Poner aquí el código Java para la tarea1 Mobil.

package www.m_tarea1B.edu;

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 130
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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 {

www.m_tarea1B.edu.Misdatos _retVal = new


www.m_tarea1B.edu.Misdatos();

Connection canal = null;

ResultSet tabla2= null;

Statement instruccion=null;

String sitiobase = "c:/mybase/BD1.mdb";

String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +


sitiobase;

// detectando y cargando el objeto submit de html

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

//leyendo tabla en disco y pasandola al resultset


25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 131
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

String code3 = "";


String nombre = "";
String description ="";
String precio = "";

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 + "'";

// ESTA LINEA FUNCIONA SI Codigo es de valor Texto en la base de


datos, porque 'code' está como valor cadena
// String sql = "SELECT * FROM Tabla WHERE Codigo='" + code + "'";

Integer code = new Integer (codigo);


int code2 = code.intValue();

String sql = "SELECT * FROM Tabla WHERE Codigo=" + code2;

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 132
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

catch(SQLException e)
{};

_retVal.setCodigo(code3);
_retVal.setNombre(nombre);
_retVal.setDescripcion(description);
_retVal.setPrecio(precio);

return _retVal;
}
}

R) Dar “Run Proyect” al proyecto “m_tarea1. No al Servicio Web del proyecto


“m_tarea1”

Debe desplegarse el navegador con una página con el mensaje

“JSP Page”

Al URL que presenta el navegador le agrego la expresión:

m_tarea1?wsdl

Se debe desplegar el documento WSDL generado por NetBeans (que no es el


mismo al antes generado con Soa Editor).

Cópiese la dirección URL del navegador que presenta dicho docto. WSDL.

S) Generar el proyecto Mobil

File / New Proyect / Mobile / Mobile Application

Name : m_tarea1_

En “Create Adicional Templates” selecciona

(x) Select All

T) Crear un “J2ME Web Service” sobre el proyecto “Mobil”

m_tarea1_ / New / J2ME Web Service Client

Pegar la dirección URL del documento WSDL desplegado por NetBeans.


25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 133
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Oprime la orden: “Retrieve WSDL”

U) Dar “Run” al proyecto Mobil “m_tarea1_”. Al proyecto mobil, no al J2ME Web


Service Client.

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.

OBSERVACIÓN: Recuerde que servicio funcionará siempre y cuando no haya


cerrado el servidor de NetBeans con su respectivo servicio Web.

RESOLVIENDO LA TAREA 2 PARA MÓVILES


Definición: se invoca el método de este servicio movil y se obtiene un array de datos
con toda la información de la base de datos.

1) CREANDO EL DOCTO. WSDL CON SOA EDITOR.

Name: m_tarea2
OK

A continuación reduzco el nombre de los dos elementos de “Message”.

Messages

• NewMessageRequest
• NewMessageResponse

Hacer: a ambos le quito la expresión “New”

Para “MessageRequest” en esta ocasión no se define algún parámetro de envío para


solicitar el servicio (es decir, del lado del cliente). Dado que solo se invoca el método y
este debe devolver toda la información de la base de datos

Para “MessageResponse” preparo el parámetro de respuesta:

Schema / Create Element From Type

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

Repetir el procedimiento para crear un dato para “nombre”, “descripción” y


“precio” Todos de type String (recordar que si se especifica un double, por ejemplo,
luego se traslada a un Double y el celular no procesa Wrappers)

code Type: String


nombre Type: String
descripción Type: String
precio Type: String

Los cuatro elementos creados con Schema / Create Element From Type

Ahora creamos un nuevo complejo dato con la instrucción:

Schema / Insert Complex 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

Importante: “Occurrence” toma el valor de “múltiple”

Ahora, establezco los parámetros para “MessageResponse”.


• Para “MessageResponse”

o Parts
Add
 Name: resultado: Type: arraydedatos2

Ya que para “MessageRequest” en esta tarea no se requiere parámetro, entonces


debemos eliminar el parámetro que aparece en “parts”.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 135
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Ahora nos vamos a

Binding / m_tarea2Binding/

Asignamos a “Style” el valor “document”

Style: document

Ahora, allí mismo descendemos un nivel:

Binding / m_tarea2Binding/NewOperation

Asegurémonos que en “Parts” tanto para la pestaña “Request” como para


la pestaña “Response” no debe haber contenido alguno. Si aparece algún
contenido en la parte “Parts” suprimalo.

Además, tanto para “Request” como para “Response” se configura así:

Style: document
Use: literal

Guardo el documento WSDL, luego lo abro con WordPad y busco:

Parts = “ ”
Parts = “ “

Suprimo, únicamente, estas dos expresiones y guardo el documento WSDL con la


modificación.

2) CREANDO EL SERVICIO WEB MOVIL CON NETBEANS

Seguimos un procedimiento análogo al descrito para la tarea 1 movil. La diferencia


principal va a consistir en el uso de una programación apropiada para recuperar la base
de datos y mostrarla al cliente movil.

// Programación del método que da el servicio en NetBeans

package www.m_tarea2.edu;

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 136
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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 {

www.m_tarea2.edu.Arraydedatos MiVal = new


www.m_tarea2.edu.Arraydedatos();

Connection canal = null;

ResultSet tabla2= null;

Statement instruccion=null;

String sitiobase = "c:/mybase/BD1.mdb";

String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +


sitiobase;

// detectando y cargando el objeto submit de html

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 137
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

List Milista = new ArrayList();

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 + "'";

// ESTA LINEA FUNCIONA SI Codigo es de valor Texto en la base de


datos, porque 'code' está como valor cadena
// String sql = "SELECT * FROM Tabla WHERE Codigo='" + code +
"'";

// Donde code es de tipo int y no de tipo String


//String sql = "SELECT * FROM Tabla WHERE Codigo=" + code;

//String sql = "SELECT * FROM Tabla";

// int code = 100;

String sql = "SELECT * FROM Tabla";

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

Informacion infor = new Informacion (codigo, nombre,


description, precio);
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 138
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

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

String[] ArrayCodes = new String[Milista.size()];


String[] ArrayNombre = new String[Milista.size()];
String[] ArrayDescriptions = new String[Milista.size()];
String[] ArrayPrecios = new String[Milista.size()];

for (int w=0; w<Milista.size(); w++)


{
//MiVal[w] = new www.sw_tarea2.edu.Result(); // !! REQUIERE
INICIALIZACIÓN CADA UNA DE LAS POSICIONES. !!

Informacion tempInfor;
tempInfor = (Informacion) Milista.get(w);

Integer cod = new Integer (tempInfor.getCode());


String nombre = new String (tempInfor.getNombre());
String description = new String ("13-Nov. List. Din. " +
tempInfor.getDescription());
Double costo = new Double (tempInfor.getPrecio());

ArrayCodes[w] = new String("" + cod.intValue());


ArrayNombre[w] = new String(nombre);
ArrayDescriptions[w] = new String(description);
ArrayPrecios[w] = new String("" + costo.doubleValue());
}
25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz
Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 139
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

MiVal.setCode(ArrayCodes);
MiVal.setNombre(ArrayNombre);
MiVal.setDescripcion(ArrayDescriptions);
MiVal.setPrecio(ArrayPrecios);

return MiVal;

public class Informacion


{
private Integer code;
private String nombre;
private String description;
private Double precio;

public Informacion (int micode, String nom, String descrip, double pre)
{
code = new Integer (micode);
nombre = nom;
description = descrip;
precio = new Double (pre);
}

public void setNombre(String nom)


{ nombre=nom; }

public void setDescription (String descrip)


{ description = descrip; }

public int getCode ()


{ return code.intValue();}

public String getNombre ()


{return nombre; }

public String getDescription ()


{ return description; }

public double getPrecio()


{return precio.doubleValue(); }

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 140
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

} // fin de "public class Informacion"

RESOLVIENDO LA TAREA 3 PARA MÓVILES


Definición: obtener los productos con el precio más bajo. (El precio más bajo, podría
ser por ejemplo, 100.00 pesos. Ahora se requiere saber todos los productos que tienen
ese precio.

1) CREANDO EL DOCTO. WSDL CON SOA EDITOR.

Name: m_tarea3
OK

A continuación reduzco el nombre de los dos elementos de “Message”.

Messages

• NewMessageRequest
• NewMessageResponse

Hacer: a ambos le quito la expresión “New”

Para “MessageRequest” en esta ocasión no se define algún parámetro de envío para


solicitar el servicio (es decir, del lado del cliente). Dado que solo se invoca el método y
este debe devolver toda la información de la base de datos para todos los productos con
el precio más bajo.

Para “MessageResponse” preparo el parámetro de respuesta:

Schema / Create Element From Type

Name: code1
Type: String
OK

Repetir el procedimiento para crear un dato para “nombre”, “descripción” y


“precio” Todos de type String (recordar que si se especifica un double, por ejemplo,
luego se traslada a un Double y el celular no procesa Wrappers)

code Type: String


nombre Type: String
descripción Type: String
precio Type: String

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

Ahora creamos un nuevo complejo dato con la instrucción:

Schema / Insert Complex 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

Importante: “Occurrence” toma el valor de “múltiple”

Ahora, establezco los parámetros para “MessageResponse”.


• Para “MessageResponse”

o Parts
Add
 Name: resultado: Type: arraydedatos2

Ya que para “MessageRequest” en esta tarea no se requiere parámetro, entonces


debemos eliminar el parámetro que aparece en “parts”.

Ahora nos vamos a

Binding / m_tarea3Binding/

Asignamos a “Style” el valor “document”

Style: document

Ahora, allí mismo descendemos un nivel:

Binding / m_tarea3Binding/NewOperation

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 142
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Asegurémonos que en “Parts” tanto para la pestaña “Request” como para


la pestaña “Response” no debe haber contenido alguno. Si aparece algún
contenido en la parte “Parts” suprimalo.

Además, tanto para “Request” como para “Response” se configura así:

Style: document
Use: literal

Guardo el documento WSDL, luego lo abro con WordPad y busco:

Parts = “ ”
Parts = “ “

Suprimo, únicamente, estas dos expresiones y guardo el documento WSDL con la


modificación.

2) CREANDO EL SERVICIO WEB MOVIL CON NETBEANS

Seguimos un procedimiento análogo al descrito para la tarea 1 movil. La diferencia


principal va a consistir en el uso de una programación apropiada para recuperar la base
de datos para los productos con el precio más bajo y mostrarla al cliente movil.

// Programación del método que da el servicio en NetBeans

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 143
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

java.rmi.RemoteException {

www.m_tarea3B.edu.Arraydatos _retVal = new


www.m_tarea3B.edu.Arraydatos();

Connection canal = null;


ResultSet tabla2= null;
Statement instruccion=null;
String sitiobase = "c:/mybase/BD1.mdb";
String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +
sitiobase;

// detectando y cargando el objeto submit de html

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

List Milista = new ArrayList();

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 + "'";

// ESTA LINEA FUNCIONA SI Codigo es de valor Texto en la base de


datos, porque 'code' está como valor cadena
// String sql = "SELECT * FROM Tabla WHERE Codigo='" + code +
"'";

// Donde code es de tipo int y no de tipo String


//String sql = "SELECT * FROM Tabla WHERE Codigo=" + code;

//String sql = "SELECT * FROM Tabla";

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 144
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

String sql = "SELECT * FROM Tabla";


tabla2 = instruccion.executeQuery(sql);

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

Informacion infor = new Informacion (Integer.parseInt(codigo),


nombre, description, Double.parseDouble(precio));

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

double minimo = 0.0;

for (int w=0; w<Milista.size(); w++)


{
Informacion temp3 = (Informacion) Milista.get(w);
Double precio = new Double (temp3.getPrecio());

if (w==0)
{ minimo=precio.doubleValue(); }

if (precio.doubleValue() <= minimo)


{ minimo = precio.doubleValue(); }

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 145
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

int contadorDeMinimos = 0;

for (int w=0; w<Milista.size(); w++)


{
Informacion temp2 = (Informacion) Milista.get(w);
Double precio = new Double (temp2.getPrecio());

if (precio.doubleValue()==minimo)
{
contadorDeMinimos = contadorDeMinimos + 1;
}
}

String ArrayCodigos[] = new String [contadorDeMinimos];


String ArrayNombres[] = new String [contadorDeMinimos];
String ArrayDescriptions[] = new String [contadorDeMinimos];
String ArrayPrecios[] = new String [contadorDeMinimos];

/*
*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;

for (int w=0; w<Milista.size(); w++)


{
Informacion temp3 = (Informacion) Milista.get(w);
Double precio2 = new Double (temp3.getPrecio());

if (precio2.doubleValue()==minimo)
{
int code = temp3.getCode();
String nombre = new String(temp3.getNombre());
String description = new String(temp3.getDescription());

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 146
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

ArrayCodigos[k] = new String (String.valueOf(code));


ArrayNombres[k] = new String (nombre);
ArrayDescriptions[k] = new String (description);
ArrayPrecios[k] = new String (precio2.toString());

k=k+1;
}
}

_retVal.setCodigo(ArrayCodigos);
_retVal.setNombre(ArrayNombres);
_retVal.setDescripcion(ArrayDescriptions);
_retVal.setPrecio(ArrayPrecios);

return _retVal;

public class Informacion


{
private Integer code;
private String nombre;
private String description;
private Double precio;

public Informacion (int micode, String nom, String descrip, double pre)
{
code = new Integer (micode);
nombre = nom;
description = descrip;
precio = new Double (pre);
}

public void setNombre(String nom)


{ nombre=nom; }

public void setDescription (String descrip)


{ description = descrip; }

public int getCode ()


{ return code.intValue();}

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 147
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

public String getNombre ()


{return nombre; }

public String getDescription ()


{ return description; }

public double getPrecio()


{return precio.doubleValue(); }

} // fin de "public class Informacion"


}

RESOLVIENDO LA TAREA 4 PARA MÓVILES


Definición: Dado un array de códigos de solicitud, atraer la información de la base de
datos para ese array de códigos. Requisito, este servicio web debe, internamente, hacer
un uso iterativo del servicio web móvil de la tarea 1 para cada elemento de array de
códigos.

OBSERVACIÓN: Se concluyó que no es posible enviar un array de códigos desde el


celular, al menos la tecnología que se utiliza no lo permite. Por tanto, el array de
códigos se crea, arbitrariamente, dentro de la implementación del servicio Web Mobil
de 4 y este a su vez debe hacer uso, iterativo, del servicio Web Movil del ejercicio 1.

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.

2) CREANDO EL SERVICIO WEB MOVIL CON NETBEANS

V) Crear un proyecto

File / New Proyect / Web / Web Application

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

W) Crear el servicio Web 4 dentro del proyecto “m_tarea4”

m_tarea4 / New / WebService

(use el botón derecho del Mouse)

Name: m_tarea4ws

En package especifico una URL apropiado al tema, por ejemplo

Package = www.m_tarea4ws.edu

Advertencia: no pierda de vista el nombre que se asignó al package

(x) From Local WSDL File

Allí atraigo el documento WSDL, como ya se dijo, el documento wsdl


para la tarea 4 es identico al wsdl para la tarea 2, entonces simplemente tomo el
wsdl antes creado con Soa Editor para la tarea 2

X) Programar el método que se genera en el servicio Web del proyecto. El cual, si


está correcto debe presentar un parámetro de recepción para un número de
código y debe retornar un dato complejo, que es el que contendrá toda la
información del registro a consultarse en la base de datos.

// 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 {

www.m_tarea4ws.edu.Arraydedatos _retVal = new


www.m_tarea4ws.edu.Arraydedatos();

// Recuerda: como el celular no soporta que el envíe de un array de códigos,


entonces se estable un array de

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 149
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

// codigos arbitrario.

String[] ArrayCodes = new String[3];


String[] ArrayNombre = new String[3];
String[] ArrayDescription = new String[3];
String[] ArrayPrecios = new String[3];

ArrayCodes[0] = new String ("103");


ArrayCodes[1] = new String ("102");
ArrayCodes[2] = new String ("106");

ArrayNombre[0] = new String ("");


ArrayNombre[1] = new String ("");
ArrayNombre[2] = new String ("");

ArrayDescription[0] = new String ("");


ArrayDescription[1] = new String ("");
ArrayDescription[2] = new String ("");

ArrayPrecios[0] = new String ("");


ArrayPrecios[1] = new String ("");
ArrayPrecios[2] = new String ("");

try
{
M_tarea1PortType_Impl tarea1 = new M_tarea1PortType_Impl();

for (int i=0; i<ArrayCodes.length; i++)


{
www.m_tarea4ws.edu.Misdatos resul =
tarea1.newOperation(ArrayCodes[i]);

String nombre = resul.getNombre();


String descripcion = resul.getDescripcion();
String precio = resul.getPrecio();

ArrayCodes[i] = new String(ArrayCodes[i]);


ArrayNombre[i] = new String (nombre);
ArrayDescription[i] = new String(descripcion);

ArrayPrecios[i] = new String(precio);


}
}
catch (Exception e)
{}

_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;
}
}

3) Crear el servicio Web 1 dentro del proyecto “m_tarea4”

m_tarea4 / New / WebService

(use el botón derecho del Mouse)

Name: m_tarea1ws

En package DEBO especificar la misma URL que puse en la inclusión


del servicio web movil 4, es decir:

Package = www.m_tarea4ws.edu

(x) From Local WSDL File

Allí atraigo el documento WSDL, como ya se dijo, el documento wsdl


para la tarea 4 en inclusión del servicio Web mobil 1 ya está creado el wsdl, el
mismo de la tarea movil 1 antes creado con Soa Editor

4) Programar el método que se genera en el servicio Web del proyecto. El cual,


si está correcto debe presentar un parámetro de recepción para un número de
código y debe retornar un dato complejo, que es el que contendrá toda la
información del registro a consultarse en la base de datos.

// 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.*;

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 151
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

import java.sql.*;

public class M_tarea1PortType_Impl implements


www.m_tarea4ws.edu.M_tarea1PortType, java.rmi.Remote {
public www.m_tarea4ws.edu.Misdatos newOperation(java.lang.String codigo)
throws
java.rmi.RemoteException {

www.m_tarea4ws.edu.Misdatos _retVal = new


www.m_tarea4ws.edu.Misdatos();

Connection canal = null;

ResultSet tabla2= null;

Statement instruccion=null;

String sitiobase = "c:/mybase/BD1.mdb";

String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" +


sitiobase;

// detectando y cargando el objeto submit de html

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

String code3 = "";


String nombre = "";
String description ="";
String precio = "";

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

// 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 + "'";

// ESTA LINEA FUNCIONA SI Codigo es de valor Texto en la base de


datos, porque 'code' está como valor cadena
// String sql = "SELECT * FROM Tabla WHERE Codigo='" + code + "'";

Integer code = new Integer (codigo);


int code2 = code.intValue();

String sql = "SELECT * FROM Tabla WHERE Codigo=" + code2;

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

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 153
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

return _retVal;
}
}

5) Dar “Run Proyect” al proyecto “m_tarea4.

Debe desplegarse el navegador con una página con el mensaje

“JSP Page”

El navegador presenta la URL:

http://localhost:8080/m_tarea4/

Al URL que presenta el navegador le agrego la expresión:

m_tarea4ws?wsdl

Se debe desplegar el documento WSDL generado por NetBeans (que no es el


mismo al antes generado con Soa Editor).

Cópiese la dirección URL del navegador que presenta dicho docto. WSDL.

http://localhost:8080/m_tarea4/m_tarea4ws?wsdl

Ahora, necesito la URL :

http://localhost:8080/m_tarea4/

para el servicio movil interno tarea1, le agrego la expresión:

m_tarea1ws?wsdl

Se debe desplegar el documento WSDL generado por NetBeans (que no es el


mismo al antes generado con Soa Editor).

Cópiese la dirección URL del navegador que presenta dicho docto. WSDL.

http://localhost:8080/m_tarea4/m_tarea1ws?wsdl

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 154
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

6) Generar el proyecto Mobil

File / New Proyect / Mobile / Mobile Application

Name : m_tarea4_

En “Create Adicional Templates” selecciona

(x) Select All

7) Crear un “J2ME Web Service” sobre el proyecto “Mobil”

m_tarea4_ / New / J2ME Web Service Client

Pegar la dirección URL del documento WSDL desplegado por NetBeans.

http://localhost:8080/m_tarea4/m_tarea4ws?wsdl

Oprime la orden: “Retrieve WSDL”

8) Dar “Run” al proyecto Mobil “m_tarea4_”.

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.

OBSERVACIÓN: Recuerde que servicio funcionará siempre y cuando no haya


cerrado el servidor de NetBeans con su respectivo servicio Web.

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 155
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

EJECUTAR TODOS LOS 4 SERVICIOS WEB PARA


MOBILES EN UN SOLO PROYECTO MOBIL

1) Detener el servidor

RunTime / Servers / Sun Java System Application Server / Stop

Con el botón derecho se obtiene la orden “stop”

Se detiene el servidor para asegurarse que no haya conflicto entre aplicaciones

Recuerde que ya tenemos creados nuestros PROYECTO Web para moviles, estos son:

m_tarea1,
m_tarea2,
m_tarea3 y
m_tarea4

Los cuales internamente implementan sus respectivos servicios Web

Nos ubicamos sobre el primero de ellos, m_tarea1 y doy Run Proyect

Copio su URL para su wsdl

http://localhost:8080/m_tarea1/m_tarea1?wsdl

lo mismo hago con m_tarea2, m_tarea3 y m_tarea4

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.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 156
M.C. Enrique Ruiz Díaz – Guías para crear y manejar Servicios Web

Ahora ya tengo en ejecución en el servidor los 4 proyectos para moviles y ya tengo


identificados sus respectivos URL’S

9) Generar el proyecto Mobil

File / New Proyect / Mobile / Mobile Application

Name : Todosmoviles_

En “Create Adicional Templates” selecciona

(x) Select All

10) Crear un “J2ME Web Service” para cada una de las URL’s antes copiadas

Todosmoviles_ / New / J2ME Web Service Client

Pegar la dirección URL del documento WSDL desplegado por NetBeans.

http://localhost:8080/m_tarea1/m_tarea1?wsdl

Oprime la orden: “Retrieve WSDL”

Repito la creación de un J2ME Web Service para el URL del proyecto 2, 3 y 4

11) Dar “Run” al proyecto Mobil “Todosmoviles_”.

Debe desplegarse un celular con acceso a los 4 servicios Web moviles.

25-Junio-2010. Visite: http://www.scribd.com/enriqueruizdiaz


Asimismo: http://sites.google.com/site/enriqueruizdiaz/ Página 157

Você também pode gostar