P. 1
ATOMOJAVAAVANZADO16

ATOMOJAVAAVANZADO16

|Views: 293|Likes:
Publicado porWilmar Hernandez

More info:

Published by: Wilmar Hernandez on Dec 20, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

12/08/2014

pdf

text

original

Autor: Luis Felipe Wanumen Silva

1

ENCICLOPEDIA CONOCIENDO

Próximame nte en Internet y en su librería más cercana

TOMO XXXV CURSO DE JSP, SERVLET Y SERVICIOS WEB EN JAVA

ELABORADO POR: LUIS FELIPE WANUMEN SILVA INGENIERO DE SISTEMAS, CATÓLICO Y AUTOR DE LA ENCICLOPEDIA CONOCIENDO

CONTIENE CONCEPTOS, EJEMPLOS DE JSP, SERVLETS, BEANS, SOCKETS EJEMPLOS DE REDES Y ALGO MÁS.

PRIMERA VERSIÓN AUN NO REVISADA SANTAFE DE BOGOTA D.C. AGOSTO DE 2009.
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

2

1. CONCEPTOS BASICOS DE SERVLETS
1.1. LOS COMPONENTES NECESARIOS

Se empaquetan en un archivo EAR Se empaquetan en un archivo Se empaquetan en un archivo JAR Pagina WAR Clases Interfaces del Servlet html del Bean Bean

En el cuadro anterior podemos apreciar algunos componentes que se usan para la construcción de aplicaciones. Específicamente en el caso del cuadro anterior vemos que las páginas html y los servlet puden ser empaquetados en un archivo WAR, de otra parte las clases del Bean y las interfaces del Bean pueden ser empaquetadas en un archivo JAR y finalmente el archivo WAR y el archivo JAR se empaquetan en un archivo EAR. Para comprender mejor esta arquitectura diremos que una página html por lo general envía datos a un servlet, el servlet envía datos al Bean, el bean procesa las solicitudes, devuelve los resultados al servlet y el servlet crea una página html para mostrarle al cliente.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

3

2. SERVLETS SENCILLOS CON CONEXIÓN A BASES DE DATOS
En esta sección se pretende mostrar unos ejemplos muy sencillos de servlets que se conectan a bases de datos para realizar algunas tareas sencillas como mostrar, insertar datos, etc.

2.1. SERVLET QUE MUESTRA DATOS DE UNA TABLA
El siguiente es uno de los ejemplos más sencillos de un servlet que muestra los datos de una tabla denominada estudiante que tiene los siguientes datos: 1 2 3 4 5 6 7 8 9 Luis Felipe Juan Carlos Sonia Miler Hector Natalia Oscar Esmeralda Sebastian

El servlet es el siguiente:
import import import import javax.servlet.*; javax.servlet.http.*; java.io.*; java.sql.*;

public class saludos extends HttpServlet { ResultSet rs; Connection conexion_access; Statement sentencia; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out; String todo=""; try { Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

4

Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); String ruta1 = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=lucho.mdb"; conexion_access=DriverManager.getConnection("jdbc:odbc:luchodb" ,"",""); sentencia = conexion_access.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,Resul tSet.CONCUR_READ_ONLY); rs = sentencia.executeQuery("select * from estudiante"); todo = "<html>"; todo = todo + "<body>"; todo = todo + "<table>"; while(rs.next()){ todo = todo + "<tr>"; todo = todo + "<td>"; todo = todo + rs.getInt(1); todo = todo + "</td>"; todo = todo + "<td>"; todo = todo + rs.getString(2); todo = todo + "</td>"; todo = todo + "</tr>"; } // Cierra while todo = todo + "</table>"; todo = todo + "</body>"; todo = todo + "</html>"; } // Cierra try catch( Exception e ) { todo = "Hubo errores conectando a lucho.mdb"; return; } // Cierra catch resp.setContentType("text/html"); out = resp.getWriter(); out.println(todo);

} }

Al ejecutar el servlet anterior, se tiene un resultado similar al siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

5

2.2. SERVLET QUE INSERTA DATOS EN BASE DE DATOS

<html> <head> <title>Mi primera insercion</title> </head> <body> <center> <form name="f1" action="servlet/inser" method="post"> <table> <tr> <td>Codigo </td> <td><input type=text name=c_cod> </td> </tr> <tr> <td>Nombre </td> <td><input type=text name=c_nom> </td> Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva </tr> <tr> <td> <input type=reset name=b_can value="cancelar"> </td> <td> <input type=submit name=b_ace value="insertar"> </td> </tr> </table> </form> </center> </body> </html>

6

En términos de interfaz de usuario, la página anterior tiene un aspecto similar al siguiente:

en la que el usuario puede escribir el código de un estudiante y el nombre. Cuando el usuario haga clic sobre el botón con el label denominado “insertar” se llama al servlet denominado “inser”. Para nuestro ejercicio supongamos que el usuario digita los siguientes datos:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

7

Cuando el usuario haga clic sobre el botón “insertar”, se llama al servlet denominado “inser” y se le pasan los datos digitados por el usuario. Veamos pues el código fuente del servlet:
import import import import javax.servlet.*; javax.servlet.http.*; java.io.*; java.sql.*;

public class inser extends HttpServlet { ResultSet rs; Connection conexion_sql; Statement sentencia; Connection conexion_sql1; PreparedStatement sentencia1; public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conexion_sql1=DriverManager.getConnection( "jdbc:odbc:luchodb", "sa","" ); String in = "insert into estudiante values(?,?)"; sentencia1 = conexion_sql1.prepareStatement(in); sentencia1.clearParameters(); String x1 = req.getParameter("c_cod"); int x2 = Integer.parseInt(x1); String x3 = req.getParameter("c_nom"); sentencia1.setInt(1, x2); Enciclopedia Conociendo Curso de Jsp y Servlets

return.JdbcOdbcDriver" ). rs. } // Cierra try catch( Exception e ) { todo = "Hubo errores conectando a lucho.setContentType("text/html"). todo = todo + "</td>".close(). rs = sentencia. out. } // Cierra catch PrintWriter out.Autor: Luis Felipe Wanumen Silva sentencia1. x3).close(). todo = todo + "<td>". todo = "<html>".executeUpdate().getConnection( "jdbc:odbc:luchodb". conexion_sql.close().mdb". while(rs.close().odbc.forName( "sun. todo = todo + "<body>". todo = todo + "</td>"."" ).close().getString(2). sentencia. conexion_sql1." sa". 8 try { Class. Enciclopedia Conociendo Curso de Jsp y Servlets . todo = todo + "</html>". } // Cierra catch resp.executeQuery("select * from estudiante"). String todo="".TYPE_SCROLL_SENSITIVE. todo = todo + "</body>".ResultSe t.next()){ todo = todo + "<tr>". todo = todo + "</tr>". } // Cierra while todo = todo + "</table>". todo = todo + "<td>".setString(2.println(todo).CONCUR_READ_ONLY). todo = todo + rs.jdbc.getInt(1). todo = todo + rs.getWriter().createStatement(ResultSet. sentencia1. conexion_sql=DriverManager. todo = todo + "<table>". sentencia = conexion_sql. } // Cierra try catch( Exception e ) { return. out = resp. sentencia1.

odbc. y esto se debe a que el formulario enviaba los datos usando el método “post” y se hace necesario recibir los datos con este método que es el apropiado para recibir cuando son enviados de esta forma. conexion_sql1=DriverManager. Esta es la razón por la cual la sentencia se ha definido de la forma: Insert into estudiante values (?. para aquellos lectores / estudiantes que no comprendan lo que es una sentencia preparada. sino que hay un método “doPost”. Esto hará que nuestra variable “conexión_sql1” quede direccionada a dicho orígen de datos y nos permita manipular la base de datos a la que hace referencia dicho orígen de datos. Pero bueno. Primero que todo las sentencias preparadas.Autor: Luis Felipe Wanumen Silva } 9 } Observemos que en este caso no hay un método “doGet”. Dichas instrucciones están diciendo que se va a crear una variable denominada “sentencia1”.getConnection( "jdbc:odbc:luchodb". la cual es una sentencia preparada.0” cuyo nombre de usuario es “sa” y de password no se le ha colocado valor alguno. "sa".?)". sentencia1 = conexion_sql1.prepareStatement(in).?) Enciclopedia Conociendo Curso de Jsp y Servlets .jdbc. la cual contiene a su vez una tabla llamada “estudiante” con los siguientes datos: CODIGO 1 2 3 4 5 NOMBRE Luis Felipe Ana Esmeralda Natalia Paris Sofia Vergara Claudia Bahamon De otra parte supongamos que tenemos un origen de datos en el sistema denominado “luchodb”. a continuación se dirán unas cosas al respecto. son sentencias que reciben parámetros. De otra parte es bueno que el amigo lector / estudiante comprenda que el primer bloque “try-catch” se hace para insertar el dato y el segundo bloque “try-catch” se hace para mostrar los datos de la tabla.forName( "sun."" ). En este caso particular nuestro orígen de datos está con una base de datos en “sql server 7. En el caso del ejercicio suponemos que existe una base de datos denominada “colegio”. Class.JdbcOdbcDriver" ). Observemos ahora las siguientes líneas: String in = "insert into estudiante values(?.

getParameter("c_cod"). sentencia1. podemos ver que estas instrucciones están pasando el código digitado por el usuario en la página como primer parámetro. x3). sentencia1. Observe nuevamente amigo lector como Java se encarga de convertir los tipos de datos Java a tipos de datos de la base de datos. En donde además se cierran las conexiones. obviamente después de convertirlo a entero.setInt(1.close(). int x2 = Integer. String x3 = req.close(). String x1 = req. Obviamente según todo lo dicho. pasemos a ver las siguientes instrucciones: sentencia1.setString(2. Observe amigo lector / estudiante que el primer parámetro se pasa con la instrucción “setInt”. De otra parte el segundo parámetro se pasa con la instrucción “setString”. Con esto bien claro. sentencia1.clearParameters(). dado que es un campo de tipo “nvarchar”.executeUpdate().parseInt(x1). x2).Autor: Luis Felipe Wanumen Silva 10 En la cual el primer parámetro que se pase más adelante será recibido por la sentencia y reemplazado por el primer signo “?” que aparezca. Mas adelante se espera que ésta sentencia reciba otro parámetro y dicho parámetro será reemplazado por el segundo signo “?” que aparezca. Para el caso gráfico vemos pues los resultados de nuestro ejercicio: Enciclopedia Conociendo Curso de Jsp y Servlets .getParameter("c_nom"). dado que en la base de datos es un campo entero. Por último se ejecuta la sentencia con la instrucción: sentencia1. conexion_sql1. Bueno y el otro “try-catch” ya lo habíamos explicado y lo que es mostrar los datos.

Autor: Luis Felipe Wanumen Silva 11 Enciclopedia Conociendo Curso de Jsp y Servlets .

http. por cuanto si los datos a enviar al cliente son demasiados. } else{ actual = Integer.servlet.*. IOException { int actual = 4. Enciclopedia Conociendo Curso de Jsp y Servlets . En el ejemplo que queremos mostrar se parte de una tabla “usuario” que contiene los siguientes datos: Codigo 1 2 3 4 5 6 7 8 9 10 11 12 13 El codigo de la aplicación es el siguiente: import import import import javax.*. java.3. String actualin = req.*. podemos correr el riesgo de ocupar el servidor enviando demasiados datos por tan solo atender a un cliente y el resto podrian tener problemas de acceso.io. Connection conexion_access.*. PAGINACION CON SERVLETS La paginación es una de las cosas mas interesantes que se pueden hacer cuando se accede a una base de datos desde una aplicación.sql. public void doGet(HttpServletRequest req. if(actualin==null){ actual = 1.Autor: Luis Felipe Wanumen Silva 12 2.parseInt(actualin). Básicamente lo que busca la paginación es resolver el problema de no mostrar demasiados datos en el lado del cliente cuando se hace una consulta. Statement sentencia. java. Nombre Hugo Paco Luis Martha Oscar Hugo Paco Luis Martha Oscar Natalia Paris Andrea Serna Patricia Giraldo public class paginame extends HttpServlet { ResultSet rs.getParameter("ac"). HttpServletResponse resp) throws ServletException.servlet. javax.

TYPE_SCROLL_SENSITIVE. out. try { Class.next()) } catch(Exception e){ out.println("<h1>Hello World</h1>"). } else{ Enciclopedia Conociendo Curso de Jsp y Servlets .forName( "sun. while(rs.println("<a href=http://localhost:8080/examples/servlet/paginame? ac="+j+">"+j+"</a>"). 13 int numeroRegistros = 0. int superior. } // Cierra try int numeroRegistrosPorPagina = 4.println("Han ocurrido errores").next()){ numeroRegistros++. conexion_access=DriverManager.Resul tSet. } int inferior.executeQuery("select * from usuario"). if((enlaces*numeroRegistrosPorPagina)!=numeroRegistros){ enlaces++. sentencia = conexion_access.createStatement(ResultSet.getConnection("jdbc:odbc:conectorODBC".CONCUR_READ_ONLY). inferior = (actual*numeroRegistrosPorPagina) numeroRegistrosPorPagina + 1. out = resp.JdbcOdbcDriver" ).j<=enlaces. out. enlaces = (int)(numeroRegistros/numeroRegistrosPorPagina).setContentType("text/html"). int enlaces = 0. rs = sentencia. resp.odbc. } for(int j=1.""). if(actual == enlaces){ superior = numeroRegistros.getWriter().jdbc.j++){ out.Autor: Luis Felipe Wanumen Silva } PrintWriter out. } // Cierra while(rs. "sa".println("La pagina actual es "+actual+"<br>").

todo = "<html>". todo = todo + "</tr>".jdbc. todo = todo + "<center>".createStatement(ResultSet.Resul tSet. return. todo = todo + "<td>".JdbcOdbcDriver" )."sa".println("<br>Inferior = " + inferior). todo = todo + "<td>".getString(2).TYPE_SCROLL_SENSITIVE. 14 } out.executeQuery("select * from usuario where codigo>="+inferior+" and codigo <="+superior).forName( "sun. todo = todo + "<table border=6>". sentencia = conexion_access. todo = todo + "<body>". } // Cierra while todo todo todo todo = = = = todo todo todo todo + + + + "</table>". "</body>".println("Superior = " + superior+"<br>"). rs = sentencia. todo = todo + "</td>". String todo="".getInt(1). "</html>". while(rs. "</center>".odbc.next()){ todo = todo + "<tr>". } // Cierra try catch( Exception e ) { todo = "Hubo errores conectando a lucho.setContentType("text/html").mdb".println(todo).getWriter().Autor: Luis Felipe Wanumen Silva superior = (actual*numeroRegistrosPorPagina). todo = todo + rs. } // Cierra catch resp. todo = todo + rs. out. } // Cierra doGet } // Cierra public class paginame Enciclopedia Conociendo Curso de Jsp y Servlets .getConnection("jdbc:odbc:conect orODBC". try { Class. out. todo = todo + "</td>". out = resp. conexion_access=DriverManager."").CONCUR_READ_ONLY).

Autor: Luis Felipe Wanumen Silva La ejecución del programa produce un resultado similar al siguiente: 15 Cuando se hace clic en el enlace que tiene el numero “1”se obtiene: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 16 Cuando se hace clic en el enlace que tiene el numero “2”se obtiene: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 17 Cuando se hace clic en el enlace que tiene el numero “3”se obtiene: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 18 Cuando se hace clic en el enlace que tiene el numero “4” se obtiene: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 19 Enciclopedia Conociendo Curso de Jsp y Servlets .

edu.co carolinatv@rcn. por las instrucciones podemos notar de paso que para nuestro ejercicio hemos creado la base de datos en el motor SQL Server y específicamente en SQL Server 2000 de Microsoft.Autor: Luis Felipe Wanumen Silva 20 2.co rrodriguez@udistrital.sysobjects where id = object_id(N'[dbo]. [nombre] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL . [apellido] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL .com esmeralda@usme. Después insertamos algunos datos en la tabla.[usuario] ( [codigo] [int] NULL .co m gina@multinal. [direccion] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL . de tal forma que la tabla quede como se muestra a continuación: Codigo 1 3 4 5 6 7 2 nombre Luis Felipe Ginna Esmeralda Miler Rocio Juan Carlos Carolina apellido Wanumen Silva Murcia Vasquez Gomez Rodriguez Guevara Rodriguez direccion Al Sur Tunjuelito Usme Norte Bogota Centro Bogota Occidente Bogota Al Sur3 correo luchofelipe2000@yahoo.co jcguevarab@udistrital.[usuario]') and OBJECTPROPERTY(id. Todo esto dentro de un formulario que tambien contiene los Enciclopedia Conociendo Curso de Jsp y Servlets . N'IsUserTable') = 1) drop table [dbo].[usuario] GO CREATE TABLE [dbo].com miler@udistrital.com direccion_larga Cra 4 No 5-89 Calle 1 No 34 Calle 70 No 7070 Calle50 No 9554 Calle 3 No 4-39 Calle 3 No 5-28 Calle 2 No 4-59 Ahora hacemos una pagina que sea capaz de mostrar una caja de texto llamada “buscar” que permite al usuario ingresar el codigo a buscar. [correo] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL . [direccion_larga] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY] GO Y bueno.edu.4.edu. BUSCAR UN REGISTRO EN SQL SERVER 2000 Y USANDO SERVLETS Primero creamos la tabla que en nuestro caso esta en una base de datos llamada “Hijo”: if exists (select * from dbo.

Después de ingresado el codigo. el usuario presiona el boton con el rotulo “buscame” y obtiene un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets . Es decir creamos una pagina con la apariencia siguiente: El codigo fuente de esta pagina es el siguiente: <HTML> <BODY> <form action=http://localhost:8080/examples/servlet/Consultame> <table border = 3> <tr> <td>Digite Codigo a buscar</td> <td><input type=text name=buscar></td> </tr> <tr> <td><input type=reset value=cancelame></td> <td><input type=submit value=buscame></td> </tr> </table> </form> </BODY> </HTML> En este caso por ejemplo si el usuario digita el numero “1” es porque quiere buscar el usuario cuyo codigo correponde al numero “1”.Autor: Luis Felipe Wanumen Silva 21 botones basicos de cancelar y enviar que tiene un formulario comun y corriente.

*. String cadenac = "Driver={SQL Server}. // objConeccion = DriverManager.io. out. resp. java. ResultSet resultados. out.println("<h1>Resultados de su busqueda</h1>").println("Vemos hijo has podido cargar los drivers"). HttpServletResponse resp) throws ServletException.jdbc."").*. out = resp. WSID=SITEL. UID=sa. estos resultados se logran porque en el servidor hemos creado un servlet que es capaz de recibir los datos y hacer la consulta.servlet.getWriter()."").PWD=. java.JdbcOdbcDriver").getConnection("jdbc:odbc:"+cadenac.servlet.http.sql. public void doGet(HttpServletRequest req.*. objConeccion = DriverManager. javax."sa".SERVER=SITEL. public class Consultame extends HttpServlet { Connection objConeccion. PreparedStatement sentencia. El codigo completo de dicho servlet es el siguiente: import import import import javax.Description=sqldemo.forName("sun.odbc. Enciclopedia Conociendo Curso de Jsp y Servlets .getConnection("jdbc:odbc:dibd". try{ Class.Autor: Luis Felipe Wanumen Silva 22 Bueno."sa".*.DATABASE=hijo". IOException { PrintWriter out.setContentType("text/html").

getString("direccion"). CORREO").trim().getString("apellido"). sentencia = objConeccion.println(" out.println(" out. DIRECCION"). <td>").println(" out.println(" out. out.println(" out.getString("direccion_larga"). out.println("<tr>"). codigin = codigin.println(" out.CONCUR_READ_ONLY). CODIGO").println(" out. String cor = resultados. APELLIDO").parseInt( codigin )). </td>").println(" out. // sentencia = objConeccion. String consultaSQL = "select * from usuario where codigo 23 = ?".executeQuery(). String dil = resultados.next()){ out. Enciclopedia Conociendo Curso de Jsp y Servlets .println(""+cod). </td>"). String ape = resultados. <td>").getInt("codigo").createStatement().println(" out.println(" out. sentencia.println(" <td>"). String dir = resultados. </td>").getString("nombre"). NOMBRE").println("Andale que conoces la base de datos").println(" out.getParameter("buscar"). String codigin = req. int cod = resultados.println(" out. // resultados = sentencia.ResultSet. DIRECCION LARGA"). out. out.Autor: Luis Felipe Wanumen Silva out.setInt(1.println(" <td>").println(" <table border = 3>").prepareStatement(consultaSQL.println(" out.println(" out.executeQuery("select * from usuario"). ResultSet.Integer. <td>").TYPE_SCROLL_SENSITIVE.println(" out. String nom = resultados. </td>"). </td>"). <td>"). resultados = sentencia. while(resultados.getString("correo"). </td>").println(" out. <td>").println(" out.

DATABASE=hijo".Description=sqldemo.println(""+dir).println(" </td>"). out.println(" <td>"). out. Se recibe el contenido de la caja de texto html String codigin = req. } out.println(""+dil).println(" <td>"). out.getParameter("buscar")."").println(" </td>").println(""+nom).println(" </td>").prepareStatement(consultaSQL. } } } En donde podemos apreciar que la variable “cadenac” tiene la cadena de “coneccion” String cadenac = "Driver={SQL Server}. UID=sa. Observe que el recordset se crea de solo lectura: sentencia = objConeccion. WSID=SITEL. out.println(" </td>"). out.println(""+cor).getConnection("jdbc:odbc:dibd".println(" Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva out. out. espera a que te lo presente"). out.println(" </td>"). out. out.println(""+ape).println("Error DESCONOCIDO.println(" </td>").PWD=.TYPE_SCROLL_SENSITIVE.SERVER=SITEL.CONCUR_READ_ONLY).println(" <td>")."sa". out. y no se ha usado coneccion usando DSN alguno.ResultSet. </table>"). 24 out. } catch(Exception e){ out. out.println(" <td>"). motivo por el cual se comentarea la instrucción: // objConeccion = DriverManager. out. out.println(" <td>"). ResultSet. out.

Esto se logra con las instrucciones: codigin = codigin. <td>"). Se imprimen los encabezados de la tabla html: out.getString("apellido").println(" out. String nom = resultados.println(" <td>"). String ape = resultados. <td>"). out.getString("direccion_larga").Autor: Luis Felipe Wanumen Silva 25 Y como esto siempre se recibe como tipo string. Enciclopedia Conociendo Curso de Jsp y Servlets .println(" out.getString("direccion").getInt("codigo").trim(). <td>"). DIRECCION").println(" out. </td>").println(" out. CODIGO").setInt(1. <td>").println("<tr>"). String cor = resultados. String dir = resultados.getString("nombre"). int cod = resultados. out. </td>").println(" out.parseInt( codigin )). <td>"). </td>"). <td>").println(" out.getString("correo").println(""+cod). </td>").println(" out. String dil = resultados.println(" out.executeQuery().println(" </td>").println(" out.println(" out.println(" out. out.next()){ out.println(" out.println(" out.println(" out.Integer. y a continuación se imprimen todos los registros que cumplen la condicion: while(resultados. En donde la variable “codigin” es entera. sentencia. </td>").println(" <table border = 3>"). APELLIDO"). NOMBRE").println(" out.println(" out.println(" out.println(" out. DIRECCION LARGA"). CORREO"). lo que se hace es convertirlo a entero. debido a que en la base de datos este tipo de datos es entero. </td>"). Luego se ejecuta la sentencia: resultados = sentencia.

out.println(""+nom). out. Si se presenta algun problema con la coneccion o en alguna otra parte del programa.sql.http. out. java. java.println("Error DESCONOCIDO. sobre la paginación con servlets.*. out.io. out. PAGINACION CON SIGUIENTE Y ANTERIOR El siguiente ejercicio no es mas que una mejora del ejercicio hecho en secciones anteriores.servlet.servlet. out.println(""+ape). Veamos pues el programa: import import import import javax.println(" <td>"). public class Paginacion extends HttpServlet { Enciclopedia Conociendo Curso de Jsp y Servlets . } out.println(" </td>"). espera a que te lo presente"). se ejecuta lo que se encuentra en el bloque match: catch(Exception e){ out.println(" </td>").println(" </td>").println(" </td>").println(""+dir). } 2.println(" </table>").*. out.println(" <td>"). out. out.Autor: Luis Felipe Wanumen Silva 26 out.println(""+dil).5. out.*. out.*. out. La diferencia radica en que en este ejercicio se pretende mostrar una forma de implementar los enlaces de anterior y de siguiente cuando se muestran un conjunto de resultados paginado.println(" <td>").println(" <td>").println(" <td>"). javax. out. out.println(" </td>").println(""+cor).

rs = sentencia. } // Cierra while(rs. try { Class. } // Cierra try finally{ try{ rs. Connection conexion_access=null.createStatement().JdbcOdbcDriver"). sentencia = conexion_access."". try { Class.jdbc. todo = todo + "<center>"." ". todo = todo + "<body>".forName( "sun. } } // Cierra public int contarRegistros() public String consultar(int infe.getConnection("jdbc:odbc:origenN ueva". } catch(Exception e){ } return "" + numeroRegistros.next()){ contador++.getConnection("jdbc:odbc:origenNueva". while(rs. ResultSet rs=null.close(). Enciclopedia Conociendo Curso de Jsp y Servlets . Statement sentencia=null. rs = sentencia.""). conexion_access=DriverManager.next()){ numeroRegistros++. todo = todo + "<table border=6>".executeQuery("select * from estudiante"). Statement sentencia=null.odbc.close(). 27 conexion_access=DriverManager.""). conexion_access.Autor: Luis Felipe Wanumen Silva public String contarRegistros(){ ResultSet rs=null.createStatement(). int numeroRegistros = 0.odbc. int supe){ int contador = 0.JdbcOdbcDriver" ).executeQuery("select * from estudiante").forName("sun. todo = "<html>".next()) } catch(Exception e){ return "-1". Connection conexion_access=null. sentencia = conexion_access.jdbc. while(rs. String todo = "".

todo = todo + "</html>". } // Cierra if(contador) } // Cierra while todo = todo + "</table>". todo = todo + "</td>". out. if(actualin==null){ actual = 1. } PrintWriter out.parseInt(actualin). 28 Enciclopedia Conociendo Curso de Jsp y Servlets . } // Cierra catch finally{ return todo. out = resp. } // Cierra finally } // Cierra public void consultar() public void doGet(HttpServletRequest req. int numeroRegistros = 0. todo = todo + "</body>". todo = todo + "</td>". todo = todo + "</tr>".getWriter(). todo = todo + rs.println("<h2>Con enlaces anterior y siguiente</h2>").setContentType("text/html").getParameter("ac"). } // Cierra try catch( Exception e ) { todo = "Hubo errores conectando a Nueva.println("La pagina actual es "+actual+"<br>").parseInt(contarRegistros()). resp. } else{ actual = Integer. out. todo = todo + "<td>". numeroRegistros = Integer. todo = todo + "<td>". HttpServletResponse resp) throws ServletException.getInt(1).println("<h1>Paginacion con Servlets</h1>"). String actualin = req.Autor: Luis Felipe Wanumen Silva if(contador>=infe && contador<=supe){ todo = todo + "<tr>".mdb". IOException { int actual = 0. todo = todo + rs. todo = todo + "</center>". int numeroRegistrosPorPagina = 4.getString(2). out.

if((enlaces*numeroRegistrosPorPagina)!=numeroRegistros){ enlaces++. superior). todo = consultar(inferior. String todo="".j<=enlaces. resp. 29 } for(int j=1.println(todo).println("<a href=http://localhost:8080/examples/servlet/Paginacion?ac="+(actual1)+">Anterior</a>").j++){ out.println("<a href=http://localhost:8080/examples/servlet/Paginacion?ac="+(actual1)+">Anterior</a>"). out.println("<br>Inferior = " + inferior). out. } int inferior. out = resp. } out.println("<a href=http://localhost:8080/examples/servlet/Paginacion? ac="+j+">"+j+"</a>").getWriter().println("Superior = " + superior+"<br>"). } Enciclopedia Conociendo Curso de Jsp y Servlets .setContentType("text/html"). } else{ superior = (actual*numeroRegistrosPorPagina). int superior. if(actual == enlaces){ superior = numeroRegistros. } if(actual>1){ out. } // Cierra doGet } // Cierra public class paginame Observe amigo lector que se implementan dos if adicionales. enlaces = (int)(numeroRegistros/numeroRegistrosPorPagina).println("<a href=http://localhost:8080/examples/servlet/Paginacion?ac="+ (actual+1)+">Siguiente</a>"). en los cuales se pregunta si la pagina actual es mayor que uno if(actual>1){ out. } if(actual<enlaces){ out. inferior = (actual*numeroRegistrosPorPagina) numeroRegistrosPorPagina + 1.Autor: Luis Felipe Wanumen Silva int enlaces = 0.

Autor: Luis Felipe Wanumen Silva 30 Esto obviamente con el fin de lograr que este enlace no se muestre si estamos en la primera pagina. es decir. menos cuando estemos ubicados en la ultima pagina. tal como lo muestra el pantallaza siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets . si el caso es el que muestra la siguiente pantalla: De otra parte el enlace con la etiqueta ¨Siguiente¨ se muestra gracias al codigo siguiente: if(actual<enlaces){ out.println("<a href=http://localhost:8080/examples/servlet/Paginacion?ac="+ (actual+1)+">Siguiente</a>"). } Y esto hace que se muestre en todos los casos.

Autor: Luis Felipe Wanumen Silva 31 Observe amigo lector que si estamos ubicados en una pagina que no sea ni la primera ni la ultima. se muestran tanto el enlace de ¨anterior¨ como de ¨siguiente¨ tal como lo muestra la siguiente pantalla: Enciclopedia Conociendo Curso de Jsp y Servlets .

De todas formas esto si lo que hace es disminuir la congestion de red. Enciclopedia Conociendo Curso de Jsp y Servlets . debido a que al cliente tan solo se le envian un segmento de datos y el flujo que pasa por la red. esto obviamente se puede mejorar con el animo de disminuir el trabajo realizado por el servidor con cada consulta. no es tan grande como si se enviasen todos los datos.Autor: Luis Felipe Wanumen Silva 32 Otra cosa importante de notar es que la funcion que muestra los resultados se hizo aparte de la funcion normal llamada GET y esto básicamente para despejar un poco el codigo del metodo GET para que no quedase muy largo. Tambien es importante notar que aunque al cliente se le muestran unicamente un segmento de datos. el servidor realmente tuvo que recorrer todos los datos antes de mostrar solamente al cliente unos cuantos.

sql. System. en tanto que la instalacion personal de oracle 10g presentaba un problema porque requeria que se tuviera instalado un servidor LDAP y a pesar que trate de conectarlo con un servidor windows 2000 server no supe como conectar el Active Directory por este metodo me imagino que era un problema de autenticacion del servidor de dominio para con Oracle 10G. // Carga el driver JDBC-ODBC try { // Se usa este driver cuando se encuentra instalado en el sistema // Class.jdbc.event. import java.*. Autor: Luis Felipe Wanumen Silva import java. Hay que tener en cuenta que Oracle 10G pide muchas cosas para montar la grilla y de pronto es por esta situacion que la unica version que de una se conecta con el Active Directory sin mucha configuracion es la instalacion Estandar. String cadena = "". public class MyApp extends Frame{ Connection conexion_sql. ResultSet rs=null. Enciclopedia Conociendo Curso de Jsp y Servlets . Fecha: 17 de septiembre de 2007. public MyApp(){ add(ta). TextArea ta = new TextArea(1. La instalacion enterprise la habia hecho hace dos meses y me presentaba algunos errores.Autor: Luis Felipe Wanumen Silva 33 2.*. } }).awt. this. Statement sentencia=null.awt. import java.*.odbc.JdbcOdbcDriver" ).3).addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(). Veamos: // // // // // // // // // // // // // // // // // Este programa muestra como conectar con base de datos ORACLE Fue probado con la version 10G de Oracle Despues de realizar una instalacion de tipo STANDAR.forName( "sun.6.exit(0). SELECCIÓN DE DATOS DE ORACLE 10G El siguiente ejemplo muestra como seleccionar datos de una base de datos oracle 10G desde una aplicación autónoma.

"MTS=T.". driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle driverOracle = driverOracle + + + + + + + + + + + + + + + + + + + + + + + + + "DRIVER=Oracle en Home1.".". obtenia un error que // decia que // el estado del cursor no era valido.println("error con la clase java"). "LOB=T.". } String driverOracle = "". "SERVER=ORCL". "FRC=10.".". "RST=T. "DPM=F.local".". "XSM=Default.".".". "NUM=NLS.".jdbc. "DBQ=ORCL.". "FRL=Lo.jar // Agregamos una referencia a este driver en el proyecto y // deberia funcionar la siguiente linea: DriverManager.".".".".". // Linea problema. "QTO=T. obtenia que se conectaba y encontraba la tabla // que estaba consultando. "FBS=60000. "GDE=F.Autor: Luis Felipe Wanumen Silva 34 // Si en el sistema no se encuentra instalado el driver. return. System.OracleDriver()). "FDL=10.registerDriver(new oracle. "FWC=F.".".". pero // tenemos el jar ubicado en // C:\OraHome_1\jdbc\lib\classes12.out.paralela.". // Linea Solucion // driverOracle = driverOracle + "SERVER=athlon. "DBA=W.".out. "TLO=O." ). pero a la hora de escribir la sentencia // getString o getInt para recuperar datos. "EXC=F. } catch( Exception e ) { System.". "FEN=T. "MDI=Me.driver. "CSR=F. "BAM=IfAllSuccessful. "UID=scott.". Estaba convencido que el // problema Enciclopedia Conociendo Curso de Jsp y Servlets .println( "No se pudo cargar el puente JDBC-ODBC. "APA=T. // Cuando intentaba usar la anterior linea en vez de la linea llamada // linea solucion.

out.println("error en el dsn"). // Como conclusion podemos decir con toda confianza que no siempre // que la linea de conectividad funcione. return.mdb".out.next()){ System. o es porque el driver de hecho tiene todos los elementos // bien. Enciclopedia Conociendo Curso de Jsp y Servlets . cadena = cadena + rs.println(e).out. cadena = cadena + rs. /* if(rs==null){ System.out.getInt(1)).getString("NOMBRE"). // si no que se pueden presentar algunos problemas mas adelante si el // driver tiene alguno de los parametros mal especificados.SERVER=athlon". } */ // System.println("rs es null"). es porque la cuestion va a // funcionar // bien. String ruta1 = "jdbc:odbc:DRIVER=Microsoft ODBC for Oracle."12346789"). System.println("Estoy antes 3 del while").println("Estoy dentro del while").executeQuery("select * from usuar").getInt("CODIGO").Autor: Luis Felipe Wanumen Silva 35 que // era de permisos o de la forma como se abria el cursos y miren // el // problema era esta linea que tenia una parte mal del driver. cadena = cadena + "\t". } else{ System. } try{ sentencia = conexion_sql.out."scott". } // Cierra try catch( Exception e ) { System. System. try{ // Establece la conexión con la base de datos conexion_sql = DriverManager.println("rs NO es null").out.UID=orcl.getConnection(ruta1.mdb)}.out. while(rs. String ruta1 = "jdbc:odbc:"+driverOracle.out.println(rs. rs = sentencia. // // // // String ruta1 = "jdbc:odbc:Driver={Microsoft Access Driver (*.createStatement().DBQ=Medicos.println("Estoy antes del while"). System.

println("Starting App"). } // Cierra try catch( Exception e ) { System.setVisible(true). } // Cierra while System.out. } ta.setText(cadena). } // Cierra main } // Cierra class MyApp 36 Enciclopedia Conociendo Curso de Jsp y Servlets . f.setSize(600.println(e). conexion_sql.close(). return. MyApp f = new MyApp().Autor: Luis Felipe Wanumen Silva cadena = cadena + "\n".close(). rs.println("Estoy despues del while"). } // Cierra public MyApp() public static void main(String args[]) { System. f.out.600).out.close(). sentencia.

para ilustrar esta situación veamos primero el código fuente del archivo denominado “ejemplo1. 3. CICLO DE VIDA DE PAGINA JSP 3. pero es necesario que se tenga en cuenta que estos a veces pueden presentar algunos problemas al trabajar. sino un texto cualquiera. ES POSIBLE QUE PAGINAS JSP CONTENGAN CODIGO NO JSP Este en un primer ejemplo que ilustra que es posible que una pagina JSP no contenga código Java.2.jsp”: Esto es un ejemplo loco El cual produce el siguiente resultado: Enciclopedia Conociendo Curso de Jsp y Servlets . Uno de los principales problemas es el hecho que para hacer un programa con servlet que imprima al cliente contenido html.Autor: Luis Felipe Wanumen Silva 37 3.1. CONCEPTOS BASICOS DE JSP En este manual se han trabajado algunas cuestiones importantes sobre los servlets. por cuanto el código se vuelve un poco complicado de comprender por la cantidad de líneas que se tienen. lo cual a veces no resulta ser muy buena idea. es necesario dejar un poco de líneas de código en las que se manda código html al cliente.

Autor: Luis Felipe Wanumen Silva 38 3. %> <%! int variable2 = 165. %> Variable 1 = <%=variable1%><br> Variable 2 = <%=variable2%><br> Variable 3 = <%=variable3%><br> El cual produce el siguiente resultado: Enciclopedia Conociendo Curso de Jsp y Servlets .jsp Esto no es un comentario <%--Esto es un comentario--%> El resultado de la anterior pagina es el similar al siguiente: 3. DECLARANDO VARIABLES EN JSP Y USO DE EXPRESIONES El archivo “ejemplo3.jsp” muestra como declarar variables en JSP: ejemplo3.3. COMENTARIOS EN PAGINAS JSP El siguiente código muestra como hacer comentarios: ejemplo2.4.jsp Autor: Luis Felipe Wanumen Silva<br> Declarando variables<br> <%! int variable1 = 165. %> <%! int variable3 = 165.

3. En realidad las expresiones nos permiten ahorrarnos código al momento de imprimir variables. %> <%! Integer obj_entero1.5. UNA FORMA DE IMPRIMIR ELEMENTOS EN JSP El anterior ejemplo mostraba que era posible imprimir con la instrucción: <%=variable1%> En donde “variable1” es una variable de tipo entera. %> <% var_entero1=654.Autor: Luis Felipe Wanumen Silva 39 Cuando usamos el igual en la instrucción: <%=variable1%> En realidad estamos usando expresiones. %> <% obj_cadena1="Soy cadena 1". %> <% obj_entero1=new Integer(123). %> <%! int var_entero1 = 165. %> <%=obj_cadena1 %><br> <%=obj_entero1 %><br> <%=var_entero1 %><br> La cual produce el siguiente resultado: Enciclopedia Conociendo Curso de Jsp y Servlets . También es posible imprimir otro tipo de datos tal como se muestra en la siguiente paginas jsp: ejemplo4.jsp Autor: Luis Felipe Wanumen Silva<br> Imprimiendo variables<br> <%! String obj_cadena1.

Ahora veamos el siguiente ejemplo: ejemplo5.println()”.Autor: Luis Felipe Wanumen Silva 40 Con lo cual vemos que algunos objetos de Java como por ejemplo los objetos de datos están disponibles en una pagina jsp. %> <%! int variable3 = 165.println(variable3).%><br> Variable 3=<%out. %> Variable 1=<%out.println(variable2).%><br> Que muestra que es posible imprimir usando la instrucción “out.%><br> Variable 2=<%out.println(variable1).jsp Autor: Luis Felipe Wanumen Silva<br> Declarando variables<br> <%! int variable1 = 165. La anterior página al ser vista desde el navegador produce el siguiente resultado: Enciclopedia Conociendo Curso de Jsp y Servlets . %> <%! int variable2 = 165.

LA DIRECTIVA INCLUDE Las directivas se usan para entregar información de las paginas usadas. %> <% obj_cadena1="Soy cadena 1". %> <% obj_entero1=new Integer(123). %><br> <%out. %> <%! Integer obj_entero1. %> <% var_entero1=654. %><br> <%out.println()”: ejemplo6.6.println(var_entero1). %><br> El cual produce el siguiente resultado: 3. En realidad esta definición no es muy clara a menos que se comience a explicar cada una de las directivas mas usadas en JSP. %> <%! int var_entero1 = 165.println(obj_cadena1). con lo cual esta sección explica la directiva “include” y esto se hace por medio de la siguiente pagina jsp: ejemplo7. %> <%out.jsp Enciclopedia Conociendo Curso de Jsp y Servlets .println(obj_entero1).jsp Autor: Luis Felipe Wanumen Silva<br> Imprimiendo variables<br> <%! String obj_cadena1.Autor: Luis Felipe Wanumen Silva 41 A manera de ejemplo y de refuerzo a continuación se imprimen unos objetos de datos usando la instrucción “out.

la cual para nuestro ejemplo contiene las siguientes lineas: Realmente la explicación es bien sencilla.7.txt"%> La cual como podemos observar hace referencia a una pagina llamada "DatosLuisF. CUIDADOS CON LA DIRECTIVA INCLUDE Imaginemos que la pagina JSP que contiene la directiva “include” tiene el siguiente código fuente: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 42 Autor: Luis Felipe Wanumen Silva<br> LA DIRECTIVA INCLUDE<br> <%@ include file="DatosLuisF.txt".txt". Con lo cual el resultado de la ejecución de la pagina JSP es el siguiente: 3. Lo que hace la pagina JSP es incluir el contenido de archivo "DatosLuisF.

jsp Autor: Luis Felipe Wanumen Silva<br> LA DIRECTIVA INCLUDE<br> <html> <body>Este es un cuerpo</body> </html> <%@ include file="pagina1.html" <html> <table border = 3> <tr> <td>Celda1</td> <td>Celda2</td> </tr> <tr> <td>Celda3</td> <td>Celda4</td> </tr> <tr> <td>Celda5</td> <td>Celda6</td> </tr> </table> </html> Obtenemos un resultado similar al siguiente si lo ejecutamos en un navegador como Internet Explorer 6.html"%> Y que la pagina que es incluida.html" para nuestro caso.Autor: Luis Felipe Wanumen Silva 43 ejemplo8.0: Enciclopedia Conociendo Curso de Jsp y Servlets . o sea la pagina "pagina1. contiene el siguiente código: "pagina1.

Autor: Luis Felipe Wanumen Silva 44 El problema está si observamos el código fuente de dicha página generada. Veámoslo: Enciclopedia Conociendo Curso de Jsp y Servlets .

util”. "%> Enciclopedia Conociendo Curso de Jsp y Servlets . con el animo que estén disponibles sus clases para dicho archivo JSP.8.Autor: Luis Felipe Wanumen Silva 45 Es claro que este código funcionaría solo en algunos navegadores.util.jsp <%@ page import="java. LA DIRECTIVA PAGE IMPORT Uno de los usos mas interesantes de la directiva “import” es incluir paquetes de Java en una pagina JSP. pero en otros navegadores se pueden producir resultados inesperados 3. La página en mención contiene el siguiente código fuente: ejemplo9. A continuación se muestra un archivo llamado “ejemplo9.jsp” en el cual se incluye el paquete “java.*. con lo cual se puede hacer uso de la clase “Vector”.

println(obj_Vector1. out. Enciclopedia Conociendo Curso de Jsp y Servlets . out.println(obj_Vector1.elementAt(0)).elementAt(1)). tal cual se muestra en la siguiente pagina: ejemplo10. obj_Vector1.jsp <% Vector obj_Vector1 = new Vector().println(obj_Vector1. out. obj_Vector1.addElement("Wanumen "). out.addElement("Luis ").addElement("Silva"). %> El resultado de la ejecución de la anterior pagina JSP es el siguiente: Observe amigo lector / estudiante que si no se hubiera colocado la sentencia: <%@ page import="java. out. obj_Vector1.elementAt(0)).println(obj_Vector1. out.println(obj_Vector1. obj_Vector1. "%> No estaría disponible la clase “Vector” de java.addElement("Felipe ").addElement("Felipe ").%> <% obj_Vector1. obj_Vector1.%> <% obj_Vector1.Autor: Luis Felipe Wanumen Silva 46 <% Vector obj_Vector1 = new Vector().elementAt(3)).*.println(obj_Vector1.elementAt(1)).addElement("Wanumen "). obj_Vector1.addElement("Luis ").util.elementAt(2)).addElement("Silva").

println(cadena). UN TIP SOBRE LAS IMPORTACIONES El punto y coma al final de la importación del paquete se puede o no colocar.Autor: Luis Felipe Wanumen Silva 47 out. %> Enciclopedia Conociendo Curso de Jsp y Servlets .elementAt(2)).util.println(obj_Vector1.elementAt(3)).println(obj_Vector1.%> <% out.util.println(cadena).%> <% out. %> La cual funciona y al ejecutar la siguiente pagina: <%@page import="java. %> La cual produce el siguiente error: 3.*.9. Esto se ve claro cuando ejecutamos la siguiente pagina: <%@page import="java."%> <%! String cadena = "Hola Mundo".*"%> <%! String cadena = "Hola Mundo". out.

3.10. pero dicho string no termina con el punto y coma lo cual provoca un error en tiempo de ejecución de la pagina jsp.println(cadena). la cual se le intenta asignar el string “Hola Mundo”. con lo cual podemos concluir que el uso del punto y coma al final de la importación no es obligatorio. UN TIP SOBRE LAS DECLARACIONES En el siguiente ejercicio se muestra una pagina jsp en la que se declara una variable llamada “cadena”."%> <%! String cadena = "Hola Mundo"%> <% out. --%> <%@page import="java.*. <%-Este ejemplo NO funciona Observe que el punto y coma al final de la declaracion del String cadena es obligatorio y no colocarlo provoca errores. %> En el navegador se produce un error similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .util.Autor: Luis Felipe Wanumen Silva 48 También funciona.

Autor: Luis Felipe Wanumen Silva 49 Enciclopedia Conociendo Curso de Jsp y Servlets .

out.jsp?p=4>4</a> El ejercicio corriendo es: Enciclopedia Conociendo Curso de Jsp y Servlets .1.println("<br>"). tales como colocar hiperenlaces anterior y siguiente para imprimir más dinamismo a la página. se debe mostrar al usuario los hiperenlaces necesarios para mostrar todo el conjunto de resultados. En primera medida es necesario comprender como una página jsp puede llamarse así misma y para saber que datos debe mostrar debe aprenderse a pasar parámetros a una página jsp.getParameter("p"). out. PAGINACIÓN DE RESULTADOS CON JSP En esta sección del libro vamos a mostrar en forma didáctica los elementos más relevantes que se deben tener en cuenta para paginar resultados usando Jsp. Otras cosas se deben tener en cuenta. Se pueden hacer algunas mejoras a la aplicación a nivel de interfaz de usuario.println("Soy la pagina "+valor).jsp?p=2>2</a> <a href=ejemplo1. %> <a href=ejemplo1.jsp?p=1>1</a> <a href=ejemplo1.Autor: Luis Felipe Wanumen Silva 50 4. RECONOCER QUE PARAMETRO SE ENVIA EN PAGINAS RECURSIVAS <% String valor = request. 4.jsp?p=3>3</a> <a href=ejemplo1. pero tranquilo amigo lector / estudiante que en la presente sección se le irán indicando las cosas gradualmente de manera que al finalizar la sección pueda hacer un ejercicio profesional de paginación de resultados. pero antes de ello se debe se debe hallar el número de paginas necesarias haciendo una consulta sobre la base de datos y contando el número de registros que conforman el conjunto de resultados.

Autor: Luis Felipe Wanumen Silva 51 Enciclopedia Conociendo Curso de Jsp y Servlets .

Es decir que vamos a mostrar cuatro resultados por pagina. RECONOCER CUANTAS PAGINAS SON NECESARIAS Vamos a suponer que tenemos una tabla como la siguiente: ESTUDIANTE CODIGO NOMBRE 1 JUAN 2 PEDRO 3 OSCAR 4 MARIO 5 JACINTO 6 JUANA 7 MARIA 8 ANA 9 ANA MARIA 10 JUAN CARLOS 11 OSCAR JAVIER 12 LUIS ALBERTO 13 LUIS FELIPE 14 LUIS ANDRES 15 JUAN EDUARDO 16 LUIS EDUARDO 17 ANA MARIA 18 JOSE 19 VICENTE 20 SOFIA 21 NATALIA 22 MILENA 23 ERICA 24 YADIRA 25 LUZ MIREYA 26 NATALIA 27 OSCAR 28 ANDREA 29 YULY Y que el tamaño de la paginación es de 4.25 Enciclopedia Conociendo Curso de Jsp y Servlets . En este caso 29/4 El resultado es 7.2. El calculo del numero de paginas a mostrar al usuario sera igual a la division entre el numero total de registros y el tamaño de la paginación.Autor: Luis Felipe Wanumen Silva 52 4.

entonces dicho resultado es igual al numero de paginas a mostrar.println("<br>"). IMPRIMIR LOS HIPERENLACES NECESARIOS DE ACUERDO CON EL NUMERO DE PAGINAS DE USUARIO Usando el numero de paginas de usuario se imprimen las referencias a la misma pagina. en caso que no sea exacto. Para comprender mejor este concepto veamos pues a nivel de código la implementación de lo que se dice: <% int tamano_paginacion = 4. } out. } Enciclopedia Conociendo Curso de Jsp y Servlets .println("Soy la pagina "+valor). entonces al resultado se le suma uno y se obtiene el número de paginas a mostrar. String valor = request.jsp?p="+i+">"+i+"</a>"). pero con valores de parámetros diferentes. int paginas_usuario = 0.i<=paginas_usuario. for(int i=1. } out.println("Soy la pagina "+valor). out. int numero_registros = 29. if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar.println("El numero de paginas a mostrar es "+paginas_usuario). int auxiliar = (int)(numero_registros/tamano_paginacion).println("<br>"). int numero_registros = 29. if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar. out. int paginas_usuario = 0. out.3.getParameter("p"). out. } else{ paginas_usuario = auxiliar+1. } else{ paginas_usuario = auxiliar+1.println("<a href=ejemplo1. String valor = request. %> 4.getParameter("p").Autor: Luis Felipe Wanumen Silva 53 Si la división es exacta. Veamos: <% int tamano_paginacion = 4.println("El numero de paginas a mostrar es "+paginas_usuario+"<br>"). int auxiliar = (int)(numero_registros/tamano_paginacion).i++){ out.

A nivel de código.println("<a href=ejemplo1. out.4. Si estamos en la ultima pagina. int numero_registros = 29.i++){ out.jsp?p="+i+">"+i+"</a>"). no hay hiperenlace siguiente. out. la situación es la siguiente: <% int tamano_paginacion = 4. String valor = request. int paginas_usuario = 0. } %> Y en términos de interfaz de usuario.println("El numero de paginas a mostrar es "+paginas_usuario+"<br>"). int anterior = -1.parseInt(valor). tenemos los siguientes resultados: Enciclopedia Conociendo Curso de Jsp y Servlets . out. int actual = Integer.println("<br>").println("Soy la pagina "+valor).Autor: Luis Felipe Wanumen Silva %> 54 4. if(actual >1){ anterior = actual-1. Si estamos en la segunda pagina o en una pagina posterior a esta. int auxiliar = (int)(numero_registros/tamano_paginacion). } for(int i=1.println("<a href=ejemplo1. COLOCAR HIPERENLACE ANTERIOR Es necesario validar que si estamos en la primera pagina. el enlace anterior debe ser igual al valor de la pagina actual menos uno. } out.jsp?p="+anterior+">anterior</a>").getParameter("p"). if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar.i<=paginas_usuario. } else{ paginas_usuario = auxiliar+1. no debe hacer enlace anterior.

También observamos que Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 55 En la anterior grafica se aprecia que la pagina actual es la numero tres y el enlace anterior esta e la pagina dos.

out. int numero_registros = 29.getParameter("p").jsp?p="+anterior+">anterior</a>"). out. int actual = Integer.5. if(actual >1){ anterior = actual-1. int paginas_usuario = 0. } out. int anterior = -1. int auxiliar = (int)(numero_registros/tamano_paginacion).println("<a href=ejemplo1. } if(actual<paginas_usuario){ siguiente = actual+1. } %> Y a nivel de interfaz de usuario tenemos los resultados siguientes: Enciclopedia Conociendo Curso de Jsp y Servlets .println("<a href=ejemplo1. String valor = request.jsp?p="+i+">"+i+"</a>").println("Soy la pagina "+valor). se debe tener en cuenta que este debe aparecer. } for(int i=1.i<=paginas_usuario. 56 4.jsp?p="+siguiente+">siguiente</a>").println("<br>"). el enlace anterior no existe. siempre y cuando actual sea menor que el numero de paginas de usuario.Autor: Luis Felipe Wanumen Silva Si el enlace esta en la pagina uno. siempre y cuando estemos ubicados en una pagina cuyo valor actual sea inferior al numero de paginas de usuario. Veamos pues: <% int tamano_paginacion = 4. out. COLOCAR HIPERENLACE SIGUIENTE Para colocar el hiperenlace siguiente. out. En el caso del ejercicio que estamos realizando.println("El numero de paginas a mostrar es "+paginas_usuario+"<br>").i++){ out. creamos una variable nueva llamada “siguiente” la cual se inicializa en “-1” y se imprime. } else{ paginas_usuario = auxiliar+1. En el caso que sea igual. if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar. int siguiente = -1.println("<a href=ejemplo1. no debe aparecer el hiperenlace.parseInt(valor).

aparece el enlace siguiente con valor de tres. Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 57 Podemos apreciar que si estamos en la última página. no vemos el enlace siguiente. pero si estamos en la pagina Dos.

int actual = Integer. SE DEBE CALCULAR EL RANGO DE REGISTROS A MOSTRAR La siguiente tabla nos ilustra sobre el ejemplo que estamos trabajando para el caso de mostrar la tabla estudiante: Pagina actual 1 2 3 4 5 6 7 8 Registro Inicial 1 5 9 13 17 21 25 29 Registro Final 4 8 12 16 20 24 28 32 La pregunta es ¿Cuál es la fómula? La fórmula para el calculo del registro inicial es: (Pagina actual * tamaño paginación) – (tamaño paginación -1) Rompiendo paréntesis. int numero_registros = 29. out.6.tamano_paginacion+1. int limite_inferior = 0. int auxiliar = (int)(numero_registros/tamano_paginacion). Y para el registro final tenemos en forma análioga: limite_superior = actual*tamano_paginacion. Enciclopedia Conociendo Curso de Jsp y Servlets .println("<br>").Autor: Luis Felipe Wanumen Silva 58 4. int paginas_usuario = 0. int limite_superior = 0.println("Soy la pagina "+valor). int siguiente = -1.parseInt(valor).getParameter("p"). String valor = request. tenemos limite_inferior = actual*tamano_paginacion . int anterior = -1. A nivel de código tenemos pues las siguientes mejoras: <% int tamano_paginacion = 4. DEPENDIENDO LA PAGINA ACTUAL. out.

} out. if(actual >1){ anterior = actual-1. } if(actual<paginas_usuario){ siguiente = actual+1.println("<a href=ejemplo1.jsp?p="+anterior+">anterior</a>"). limite_inferior = actual*tamano_paginacion .println("El numero de paginas a mostrar es "+paginas_usuario+"<br>").i++){ out.println("<a href=ejemplo1. out. } out.println("El registro final es"+limite_superior).Autor: Luis Felipe Wanumen Silva if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar.jsp?p="+siguiente+">siguiente</a>"). } else{ paginas_usuario = auxiliar+1. out. out. %> Cuyos resultados para la primera página son: 59 Enciclopedia Conociendo Curso de Jsp y Servlets . out. } for(int i=1.println("<a href=ejemplo1.i<=paginas_usuario.tamano_paginacion+1.println("<br>").jsp?p="+i+">"+i+"</a>").println("El registro inicial es"+limite_inferior). limite_superior = actual*tamano_paginacion.

Autor: Luis Felipe Wanumen Silva Para la segunda página los resultados son: 60 Para la tercera página son: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva Para la cuarta página son: 61 Para la quinta página: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva Para la sexta página: 62 Para la séptima página: Enciclopedia Conociendo Curso de Jsp y Servlets .

int siguiente = -1. tal como se muestra en el siguiente código fuente: <% int tamano_paginacion = 4. int limite_inferior = 0. int limite_superior = 0.println("Soy la pagina "+valor).getParameter("p"). debido a que la división no siempre es exacta y se hace necesario validar en realidad cuantos registros de la última página se van a mostrar. Con todo lo anterior se hace necesario hacer algunos ajustes. int exacta = 0.println("<br>"). String valor = request. CORREGIR EL NUMERO DE REGISTROS QUE APARECEN EN LA ULTIMA PAGINA Es necesario hacer esta corrección. int auxiliar = (int)(numero_registros/tamano_paginacion). out. int paginas_usuario = 0. int actual = Integer.parseInt(valor). Enciclopedia Conociendo Curso de Jsp y Servlets . int numero_registros = 29.Autor: Luis Felipe Wanumen Silva Para la octava página: 63 4. int anterior = -1. out.7.

println("<a href=ejemplo1.println("El registro final es"+limite_superior). } for(int i=1. } out.println("El registro final es"+limite_superior). out.i++){ out.println("El registro inicial es"+limite_inferior). if(actual==paginas_usuario){ if(exacta==0){ out. } out. if(actual >1){ anterior = actual-1. out. la cual para el caso de nuestro ejercicio se muestra a continuación: 64 Enciclopedia Conociendo Curso de Jsp y Servlets .println("<a href=ejemplo1.jsp?p="+i+">"+i+"</a>"). } %> Con lo cual se mejora el pantallaza para la última página. exacta = 0.println("<a href=ejemplo1.println("<br>").println("El numero de paginas a mostrar es "+paginas_usuario+"<br>"). exacta = 1.jsp?p="+anterior+">anterior</a>").i<=paginas_usuario.Autor: Luis Felipe Wanumen Silva if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar. } } else{ out. limite_inferior = actual*tamano_paginacion . } else{ limite_superior = numero_registros.println("El limite superior es "+limite_superior). out. limite_superior = actual*tamano_paginacion.tamano_paginacion+1. } else{ paginas_usuario = auxiliar+1.jsp?p="+siguiente+">siguiente</a>"). out. } if(actual<paginas_usuario){ siguiente = actual+1.

Autor: Luis Felipe Wanumen Silva 65 Con lo cual se comprueba que realmente la paginación funciona. Enciclopedia Conociendo Curso de Jsp y Servlets .

out. int actual = Integer. out. tal como se muestra continuación: <%@ page session="true"%> <%@ page import="java. exacta = 0. ahora para finalizar quitamos todas las impresiones de cosas. } if(actual<paginas_usuario){ siguiente = actual+1.println("Estas en la pagina "+valor). String valor = request. Enciclopedia Conociendo Curso de Jsp y Servlets . out. PreparedStatement sentencia_preparada = null. exacta = 1. ResultSet resultado = null. int limite_inferior = 0. int exacta = 0. ARMAR LA CADENA DE CONSULTA Y ENSAMBLAR LA APLICACION Bueno.jsp?p="+anterior+">anterior</a>"). } else{ paginas_usuario = auxiliar+1. int anterior = -1. } for(int i=1.i<=paginas_usuario. int siguiente = -1. String consulta = "". y armamos la consulta preparada. int limite_superior = 0. int numero_registros = 29.Autor: Luis Felipe Wanumen Silva 66 4. Connection con = null.getParameter("p"). cuyos resultados obtiene la variable “resultado” y por medio de un while mostramos una tabla html.8.println("<a href=ejemplo1.jsp?p="+siguiente+">siguiente</a>"). } if(actual >1){ anterior = actual-1. out.parseInt(valor).println("<a href=ejemplo1.println("<br>").println("<a href=ejemplo1.*"%> <% int tamano_paginacion = 4. if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar.jsp?p="+i+">"+i+"</a>").sql. int auxiliar = (int)(numero_registros/tamano_paginacion).i++){ out. int paginas_usuario = 0.

sql. out. } catch(Exception e){ out.executeQuery(). } out.setInt(1. out. if(actual==paginas_usuario){ if(exacta!=0) limite_superior = numero_registros.odbc. } try{ Class. out. resultado = sentencia_preparada.println(" </td>"). limite_inferior = actual*tamano_paginacion . out.println("</table>"). out."").forName("sun. limite_superior). sentencia_preparada = con.getString("nombre")).9. while(resultado.println(""+resultado.jdbc.println(""+resultado. con = DriverManager.next()){ out. sentencia_preparada.JdbcOdbcDriver"). } %> 67 4."". limite_superior = actual*tamano_paginacion. out.println("<br>").getConnection("jdbc:odbc:conector_access".println("<br>"+"<table border= 5>").getParameter("p"). out. Enciclopedia Conociendo Curso de Jsp y Servlets .setInt(2.println(" </td>").getInt("codigo")). HACER QUE EL NUMERO DE REGISTROS SEA DINAMICO El código fuente final es el siguiente: <%@ page session="true"%> <%@ page import="java.tamano_paginacion+1. limite_inferior).*"%> <% String valor = request. out.println(" <td>").Autor: Luis Felipe Wanumen Silva } out.println("Se presentaron errores de BD").println("</tr>").prepareStatement("select * from estudiante where codigo>=? and codigo<=?").println("<tr>"). sentencia_preparada.println(" <td>").

} numero_registros = contador. } for(int i=1. ResultSet resultado = null. int contador = 0.jsp?p="+anterior+">anterior</a>").println("<a href=ejemplo1.JdbcOdbcDriver"). Connection con = null. int tamano_paginacion = 4. String consulta = "".getConnection("jdbc:odbc:conector_access". int paginas_usuario = 0. out.println("Estas en la pagina "+valor).odbc. resultado1 = sentencia.i++){ out. exacta = 1.Autor: Luis Felipe Wanumen Silva int actual = Integer.next()){ contador++. ResultSet resultado1 = null.println("Error contando registros de BD"). int limite_superior = 0. try{ Class. int anterior = -1. exacta = 0. int numero_registros = 29.jsp?p="+i+">"+i+"</a>"). int siguiente = -1.forName("sun. sentencia = con."". int exacta = 0.jdbc. out. } if(actual >1){ anterior = actual-1. PreparedStatement sentencia_preparada = null. if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar. int limite_inferior = 0. } int auxiliar = (int)(numero_registros/tamano_paginacion). out. con = DriverManager. } else{ paginas_usuario = auxiliar+1. } if(actual<paginas_usuario){ Enciclopedia Conociendo 68 Curso de Jsp y Servlets .createStatement(). while(resultado1."").println("<br>").parseInt(valor).i<=paginas_usuario. Statement sentencia = null. } catch(Exception e){ out.executeQuery("select * from estudiante").println("<a href=ejemplo1.

forName("sun. out.println(""+resultado.println("</table>").println("<br>"+"<table border= 5>"). out. sentencia_preparada. out.JdbcOdbcDriver").getConnection("jdbc:odbc:conector_access".getInt("codigo"))."".println(" </td>").println(" <td>").createStatement(). out.executeQuery().prepareStatement("select * from estudiante where codigo>=? and codigo<=?"). } numero_registros = contador. limite_inferior = actual*tamano_paginacion . resultado1 = sentencia. limite_superior = actual*tamano_paginacion. } %> 69 Y su ejecución se puede ver a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets .println(" </td>"). while(resultado1.println(""+resultado. out.jdbc. out. sentencia_preparada.setInt(1.tamano_paginacion+1. if(actual==paginas_usuario){ if(exacta!=0) limite_superior = numero_registros.println(" <td>"). sentencia_preparada = con.executeQuery("select * from estudiante"). out. while(resultado.jsp?p="+siguiente+">siguiente</a>"). } out. resultado = sentencia_preparada.Autor: Luis Felipe Wanumen Silva siguiente = actual+1. } catch(Exception e){ out."").println("<br>").println("</tr>"). limite_inferior).getString("nombre")). out. con = DriverManager. } try{ // Class. sentencia = con.next()){ contador++.odbc.println("Se presentaron errores de BD").println("<tr>").println("<a href=ejemplo1. } out.next()){ out.setInt(2. limite_superior). out.

Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 70 En donde se puede apreciar que funciona toda la aplicación correctamente.

//DTD JSP Tag Library 1.0</tlibversion> <jspversion>1.nombre presonalizado --> <attribute> <name>nombre</name> </attribute> </tag> </taglib> El archivo anterior muestra que el nombre de la etiqueta sera conocido en el servidor como “TagMio1” y que lógicamente tendrá un parámetro llamado “nombre”.sun.TagMio1</tagclass> <bodycontent>empty</bodycontent> <info>Etiqueta simple de saludo</info> <!-. PRIMER EJERCICIO DE ETIQUETAS JSP Supongamos que vamos a crear una etiqueta JSP llamada “TagMio1”.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems. ETIQUETAS JSP Las etiquetas jsp permiten que una aplicación java con paginas “.tld <?xml version="1. Inc.1.com/dtd/web-jsptaglibrary_1_2. lo primero que tenemos que hacer es crear una definición de la etiqueta en un archivo llamado “etiquetillas. El código de nuestra definición de la etiqueta se muestra a continuación: etiquetillas. El archivo anterior también esta indicando Enciclopedia Conociendo Curso de Jsp y Servlets .jsp” invoquen etiquetas al estilo html.tld” que se ubica al interior de la carpeta “tlds” que esta a su vez dentro de la carpeta “WEB-INF” de nuestro servidor web.1//EN" "http://java.dtd"> <taglib> <tlibversion>1.2</jspversion> <shortname>capitulo6</shortname> <info> Librería de Etiquetas </info> <tag> <name>TagMio1</name> <tagclass>carpeta. pero que dichas etiquetas por algún mecanismo interno del servidor web se procesen al estilo java por medio de la ejecución de unos programas que extienden de la clase “TagSupport” 5.Autor: Luis Felipe Wanumen Silva 71 5.

class” de nuestra etiqueta java. } public String getNombre() { return( nombre ).java package carpeta.tagext. import javax.*. if( nombre != null ) { out.println( "<tr><td>Hola Mundo de etiquetas JSP</td></tr>" ). } } En donde podemos observar que el metodo “doStartTag()” se ejecuta cuando la etiqueta se abre y el metodo “doEndTag()” se ejecuta cuando finaliza la etiqueta. // public void TagMio1() {} public void setNombre( String _nombre ) { nombre = _nombre. } catch( Exception e ) { throw new JspTagException( e.jsp.getOut().getMessage() ).*. } return( SKIP_BODY ).jsp.servlet.println( "<table border=1>" ). } return( SKIP_BODY ). } public int doEndTag() throws JspTagException { try { pageContext.servlet. } else { out. } } catch( Exception e ) { throw new JspTagException( e.Autor: Luis Felipe Wanumen Silva 72 que al interior de la carpeta “classes” debe existir otra carpeta llamada “carpeta” que a su vez contiene el archivo “. } public void release() { super.println( "<tr><td> Hola Tag Mio1" +nombre+ " </td></tr>" ). dicho archivo contiene el siguiente código: TagMio1. import javax. Ahora Enciclopedia Conociendo Curso de Jsp y Servlets .getOut().getMessage() ). public class TagMio1 extends TagSupport { private String nombre = null. out.release().print( "</table>" ). } public int doStartTag() throws JspTagException { try { JspWriter out = pageContext.

jsp”que invoca la etiqueta creada anteriormente: TagMio1.nombre presonalizado --> <attribute> <name>nombre</name> Enciclopedia Conociendo Curso de Jsp y Servlets .dtd"> <taglib> <tlibversion>1.2</jspversion> <shortname>capitulo6</shortname> <info> Librería de Etiquetas correspondiente al capítulo 6 </info> <tag> <name>TagMio1</name> <tagclass>carpeta.jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas.0</tlibversion> <jspversion>1.tld" prefix="etiquete" %> <html> <body> <p> <hr><center> <etiquete:TagMio1 nombre=" Luis Felipe"/> </center><hr> <etiquete:TagMio1 /> </body> </html> Observe que la etiqueta se llama “TagMio1” pero esta referenciada con un prefijo llamado “etiquete” que pudo haber sido otra palabra.Autor: Luis Felipe Wanumen Silva 73 Ahora bien para lograr que esta etiqueta sea útil se necesita invocarla desde una pagina “. tambien observe que el parámetro “nombre” es invocado pasandole el valor de “Luis Felipe” y la otra vez no es invocado.sun.TagMio1</tagclass> <bodycontent>empty</bodycontent> <info>Etiqueta simple de saludo</info> <!-. con lo cual el programa se invoca y ejecuta dos veces.//DTD JSP Tag Library 1.2. a continuación se muestra el código fuente del archivo “TagMio1. ERROR COMÚN CON EL USO DE TAGS Supongamos que tenemos un archivo de librería de etiquetas como el siguiente: Etiquetillas. 5.jsp”.1//EN" "http://java. Inc.tld <?xml version="1.com/dtd/web-jsptaglibrary_1_2.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems.

jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas.tld" prefix="etiquete" %> <html> <body> <etiquete:TagMio2 nombre="estudiante"/> </body> </html> Se produce un error similar al siguiente: Y esto se debe a que el Tag “TagMio2.tld”. Enciclopedia Conociendo Curso de Jsp y Servlets . El problema viene si se hace una pagina “.java” no existe y así se creara seguiría produciéndose el error básicamente debido a que el sistema no lo tiene referenciado en el archivo tipo “.Autor: Luis Felipe Wanumen Silva </attribute> </tag> 74 </taglib> En donde se aprecia que solo existe un tag referenciado el cual se llama “TagMio1” que se espera se encuentre en la carpeta llamada “carpeta”.jsp” que intente ejecutar el siguiente código: TagMio2.

jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas. UN TAG QUE CONSULTA DATOS El deseo en esta parte es realizar un tag que pueda ser invocado tal como muestra la pagina “TagMio2.tld" prefix="etiquete" %> <html> <body> <etiquete:TagMio2 nombre="estudiante"/> </body> </html> De tal forma que se produzcan los siguientes resultados: Teniendo en cuenta que se ha creado una base de datos en SQL Server 2005 con una tabla llamada “estudiante” tal como muestra la siguiente figura: Enciclopedia Conociendo Curso de Jsp y Servlets .jsp” a continuación: TagMio2.3.Autor: Luis Felipe Wanumen Silva 75 5.

TagMio2</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>nombre</name> </attribute> </tag> </taglib> De tal suerte que podremos crear el archivo “TagMio2.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems.0</tlibversion> <jspversion>1.com/dtd/web-jsptaglibrary_1_2. Inc.sun.dtd"> <taglib> <tlibversion>1.java” con el siguiente código: TagMio2.sql.1//EN" "http://java. en este caso vamos a crear un archivo llamado etiquetillas que contendrá el siguiente código: Etiquetillas.Autor: Luis Felipe Wanumen Silva 76 Para lograr este efecto se requiere crear nuevamente el archivo descriptor de etiquetas. Enciclopedia Conociendo Curso de Jsp y Servlets .java package carpeta.2</jspversion> <shortname>capitulo6</shortname> <info> Librería de Etiquetas correspondiente al capítulo 6 </info> <tag> <name>TagMio2</name> <tagclass>carpeta.*. import java.//DTD JSP Tag Library 1.tld <?xml version="1.

createStatement(). Connection con. if(nombre!=null){ Class.getMessage() )."sa". sen = con. rs = sen. public class TagMio2 extends TagSupport { private String nombre = null.servlet.servlet. while(rs."").*.forName("sun.jsp. } public int doEndTag() throws JspTagException { try { pageContext.println(dato2).jsp. out. import javax.*.executeQuery("select * from "+nombre). } catch( Exception e ) { throw new JspTagException( e. } } // Cierra if } catch( Exception e ) { throw new JspTagException( e.JdbcOdbcDriver").print( "</table>" ).getString("nombre").getOut(). // public void TagMio1() {} public void setNombre( String _nombre ) { nombre = _nombre. Statement sen.jdbc. } public String getNombre() { return( nombre ).tagext.Autor: Luis Felipe Wanumen Silva 77 import javax.next()){ String dato2 = rs.getOut(). } return( SKIP_BODY ). ResultSet rs.getMessage() ). } public int doStartTag() throws JspTagException { try { JspWriter out = pageContext. } Enciclopedia Conociendo Curso de Jsp y Servlets . con = DriverManager.odbc.getConnection("jdbc:odbc:lucho".

release(). Para el caso de nuestro ejercicio hemos creado el origen de datos y hemos colocado el archivo tipo “.Autor: Luis Felipe Wanumen Silva 78 return( SKIP_BODY ). } public void release() { super. se requiere que se halla creado un origen de datos apuntando a la base de datos “nueva” que acabamos de crear en SQL Server 2005.java” ubicado como muestra la siguiente figura: Enciclopedia Conociendo Curso de Jsp y Servlets . } } En donde se supone que para logar la correcta ejecución del Tag.tld” en el lugar correcto tal como muestra la siguiente figura: De tal suerte que la invocación del archivo “TagMio2.

jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas.tld" prefix="etiquete" %> <html> <body> <etiquete:TagMio2 nombre="estudiante"/> </body> </html> Y produciendo unos resultados similares a los siguientes: Enciclopedia Conociendo Curso de Jsp y Servlets .jsp” usando el codigo fuente mostrado a continuación: TagMio2.Autor: Luis Felipe Wanumen Silva 79 Podrá ser invocado desde una pagina “TagMio2.

Autor: Luis Felipe Wanumen Silva 80 Enciclopedia Conociendo Curso de Jsp y Servlets .

0" xmlns="http://java.com/xml/ns/j2ee" xmlns:xsi="http://www.xsd"> <tlib-version>1.0" encoding="UTF-8"?> <taglib version="2.0</tlib-version> <short-name>tag</short-name> <uri>/WEB-INF/tlds/TAG</uri> <tag-file> <name>TARARCHIVO</name> <path>/WEB-INF/tags/TARARCHIVO.com/xml/ns/j2ee web-jsptaglibrary_2_0.tld <?xml version="1.tag</path> </tag-file> </taglib> Enciclopedia Conociendo Curso de Jsp y Servlets .w3.sun. FORMA DE HACER TAGS CON NETBEANS 6.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.Autor: Luis Felipe Wanumen Silva 81 6.1.1 6.sun. CREAR LA LIBRERÍA DE ETIQUETAS TAG.5.

%> 6.NewBean"/> <jsp:useBean id="Dos" class="tag.println(Dos.Autor: Luis Felipe Wanumen Silva 82 6. out. CREAMOS LA ETIQUETA PROPIAMENTE DICHA TAGARCHIVO.3.tag <%@tag description="put the tag description here" pageEncoding="UTF-8"%> <jsp:useBean id="Uno" class="tag.getNombre()).The list of normal or fragment attributes can be specified here: --%> <%@attribute name="message"%> <%-. CREAMOS EL BEAN package tag.Bean1"/> <%-.setCodigo(message).2.any content can be specified here e.: --%> <h2>${message}</h2> <% Dos.g. /** * Enciclopedia Conociendo Curso de Jsp y Servlets .

dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html. Connection objCon.prepareStatement("select nombre from usuario1 where codigo = ?").this. String res="". ResultSet objRes.executeQuery(). public class Bean1 { private String nombre.getConnection("jdbc:odbc:luchodb". public void setNombre(String valor){ this.4. objSen. while(objRes."sa".getString("nombre").codigo).toString().JdbcOdbcDriver").next()){ res = res + objRes.Autor: Luis Felipe Wanumen Silva * @author microsoft */ import java.setInt(1. charset=UTF-8"> <title>JSP Page</title> Enciclopedia Conociendo Curso de Jsp y Servlets .forName("sun. } } catch(Exception e){ res = e. } public String getNombre(){ try { Class. int codigo.tld" prefix="etiquete" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. } } 83 6.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib uri="/WEB-INF/tlds/TAG.org/TR/html4/loose.parseInt(valor).*.jdbc. PreparedStatement objSen. } return this.01 Transitional//EN" "http://www. } public void setCodigo(String valor){ codigo = Integer.odbc.""). DESDE UNA JSP USAMOS EL TAG jsp2.sql. objRes = objSen.res.nombre = valor.w3. objSen = objCon. objCon = DriverManager.

Nombre varchar(50) ) 6.5.6.Autor: Luis Felipe Wanumen Silva </head> <body> <h1>Hello World!</h1> <etiquete:TARARCHIVO message="2" /> </body> </html> 84 6. CREAMOS LA BASE DE DATOS Create table usuario( Codigo int. INGRESAMOS ALGUNOS DATOS Enciclopedia Conociendo Curso de Jsp y Servlets .

3. 2.8.’Hugo’) Insert into usuario values(2.’Luis’) 6. Enciclopedia Conociendo Curso de Jsp y Servlets . Crear otra etiqueta que permita seleccionar los nombres de las tablas de las anteriores bases de datos. Crear otra etiqueta que una vez ejecutada la anterior permita seleccionar el nombre de la base de datos.7. Usted decide que motor quiere trabajar.Autor: Luis Felipe Wanumen Silva 85 Insert into usuario values(1.’Paco’) Insert into usuario values(3. TALLER PROPUESTO SOBRE TAGS JSP 1. EJECUTAMOS LA APLICACION 6.

1. es decir no usa Beans Empresariales o los llamados EJB (que son lo mas decentes para estos casos). Para el caso de nuestro ejercicio Web. 7. CREANDO SENCILLA APLICACIÓN WEB NETBEANS 3 CAPAS Lo ideal es hacer aplicaciones de mas de 3 capas hoy en día.mdb” tal como muestra la siguiente figura: Enciclopedia Conociendo Curso de Jsp y Servlets .JSP”.java” con lo cual se cumplirá a grandes rangos con el modelo arquitectónico MVC (Modelo Vista Controlador). PASO 1: CREAR LA BASE DE DATOS Crear la base de datos.java” y una capa que estará muy ligada al modelo implementada con el archivo “ConexionBd. El siguiente taller usa Beans normales (chiches).Autor: Luis Felipe Wanumen Silva 86 7. se trabajara una capa de presentación mediante una pagina “registro. podemos usar cualquier motor de base de datos. una capa de controlador que controlara los eventos y se llamara “Registro. Veamos con Access: Creamos una base de datos llamada “base. esto con el fin de lograr que el estudiante se familiarice con el manejo de Beans para el acceso a datos y paginas JSP en la parte de la presentación grafica. pero dado que se trata de mostrar la funcionalidad y de despegar en estas cosas de las aplicaciones web con NetBeans. En nuestro caso podemos usar Access o el que tengamos a mano.

Autor: Luis Felipe Wanumen Silva 87 Creamos una tabla llamada “estudiante” con dos campos uno llamado “codigo” y otro llamado “nombre” La tabla inicialmente no tendra datos tal como se muestra a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 88 Enciclopedia Conociendo Curso de Jsp y Servlets .

PASO 2: CREAR EL ORIGEN DE DATOS Ejecutamos el comando “odbcad32” tal como muestra la siguiente figura: Abrimos la pestaña DSN de sistema Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 89 7.2.

Autor: Luis Felipe Wanumen Silva 90 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 91 Usando el driver “Microsoft Access Driver” Creamos en este caso un origen de datos llamado “origen”: Enciclopedia Conociendo Curso de Jsp y Servlets .

mdb” que hemos creado anteriormente 7.Autor: Luis Felipe Wanumen Silva 92 Obviamente direccionado a la base de datos “base. PASO 3: CREACION DE UN PROYECTO WEB CON NETBEANS En nuestro caso estamos usando el NetBeans IDE 6.0 tal como muestra la figura: Enciclopedia Conociendo Curso de Jsp y Servlets .3.

Autor: Luis Felipe Wanumen Silva 93 Creamos un nuevo proyecto web: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 94 Y específicamente “Web Application” Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 95 En nuestro ejercicio el proyecto lo llamamos: “Udistrital” y lo creamos con la especificación J2EE 1.3 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 96 En nuestro caso no vamos a usar ningun Framework es decir que no seleccionamos Framework alguno: Enciclopedia Conociendo Curso de Jsp y Servlets .

4.Autor: Luis Felipe Wanumen Silva 97 7. PASO 4: CREACION DEL PAQUETE QUE TENDRA LA LOGICA Y EL ACCESO A DATOS Al interior de un proyecto web NetBeans se tienen varias carpetas. y específicamente vamos a crear un paquete al interior de la carpeta “Source Packages” Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 98 Una de las cosas mas útiles es empaquetar las clases y por eso vamos a crear un paquete nuevo llamado “MiPaqueteChileno” Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 99 De tal manera que el paquete por defecto que se tiene en la carpeta “Source Packages” queda reemplazado por el paquete llamado “MiPaqueteChileno” Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 100 Creamos ahora una clase Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 101 Llamada “Registro” Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 102 Al interior del paquete llamado “MiPaqueteChileno” que controlara los eventos de ingresar. Enciclopedia Conociendo Curso de Jsp y Servlets . es decir que dentro del modelo vista controlador tendrá la función de controlador. Y también creamos una clase en el mismo paquete llamada “ConexionBd” que manejara el modelo pues estará muy cerca de la persistencia y se encargara de los pequeños detalles relacionados con la conexión a la base de datos.

PASO 5: CREACION DE LA VISTA Por ultimo.Autor: Luis Felipe Wanumen Silva 103 7.5. al interior de la carpeta “Web Pages” Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 104 crearemos una pagina llamada “registro.jsp” Enciclopedia Conociendo Curso de Jsp y Servlets .

6.sql. private ResultSet rSet. public Connection con=null. resp=true.forName("sun. try{ Class.Autor: Luis Felipe Wanumen Silva 105 Observe amigo lector / estudiante que NetBeans le coloca la extensión “.JdbcOdbcDriver"). public class ConexionBd { public String error=""."".jsp” al archivo.con=DriverManager.print("se conecto a la bd"). this. import java.""). public boolean conectaBd(){ boolean resp=false. Enciclopedia Conociendo Curso de Jsp y Servlets .java” presenta un código similar al siguiente: package MiPaqueteChileno.jdbc.getConnection("jdbc:odbc:origen". PASO 6: INGRESANDO CODIGO EN EL MODELO Nuestra clase del modelo llamada “ConexionBd. private Statement stt.newInstance().odbc. 7.*.out. System.

} catch(Exception e){ this.println(e).out.createStatement(). } // Cierra Inserta public static void main(String[] args) { // TODO Auto-generated method stub ConexionBd c = new ConexionBd(). } } 106 En donde se presenta un metodo llamado “conectaBd()” que se conecta con la base de datos mediante un origen de sistema llamado “origen”.executeUpdate(sentencia). (Algunos autores ni siquiera consideran que el anterior programa sea un Bean) Lo interesante del asunto es que la inserción de datos es manejada por la clase “ConeccionBd()” pero el lanzamiento de dicha inserción es manejada solamente desde una clase controladora llamada “Registro. dat=this.stt.println("No se puede realizar la conexión").conectaBd(). } return resp.Autor: Luis Felipe Wanumen Silva } catch(Exception e){ System.stt.java” Antes de explicar detenidamente la clase “Registro. } } // Cierra if return dat. this.error="no se puedo realizar el insert a la bd". System. this.java” mencionaremos que el metodo “Inserta()” es invocado desde afuera de la clase ConectaBd y se valida que su ejecución se realice siempre y cuando se halla podido ejecutar el constructor de la clase y esto se logra con la pregunta: if(conectaBd()) De otra parte es importante mencionar que una vez se ingresan los datos se cierran las conecciones. Es importante notar que este Bean tiene el metodo main() y esto es valido debido a que este Bean no es un Bean Empresarial.con.stt=this. Enciclopedia Conociendo Curso de Jsp y Servlets .con. } public ConexionBd() { super(). if(conectaBd()){ try{ this.close().out.close(). c. } public int Inserta (String sentencia){ int dat=0.

String sql = "INSERT into estudiante"+ "(nombre)"+ "values ('"+this.getNombre()+"')". } catch(Exception e){ cadena = "No pudo insertar". try{ cadena = "Vamos a insertar". } public void setNombre(String Nombre){ nombre=Nombre.java”.Autor: Luis Felipe Wanumen Silva 107 7. public class Registro { private String nombre. } return cadena. private String codigo. } public String getCodigo(){ return codigo.Inserta(sql).7. PASO 7: INGRESANDO CODIGO EN EL CONTROLADOR El controlador tiene un código fuente similar al siguiente: package MiPaqueteChileno. int datos=this. public Registro() { super(). } } En donde es el encargado principalmente de armar la cadena de conexión e invocar el método de inserción de la clase “ConexionBd. ConexionBd conecta=new ConexionBd(). } public String AgregaRegistro(){ String cadena = "". En nuestro caso este controlador tiene los metodos getXxx() y setXxx() que corresponden con cada uno de los atributos de la tabla “estudiante”. Es importante que el Enciclopedia Conociendo Curso de Jsp y Servlets . } public void setCodigo(String Codigo){ codigo=Codigo. } public String getNombre(){ return nombre.conecta. cadena = "Ya insertamos"+sql.

Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 108 amigo lector / estudiante comprenda que la parte de los metodos que comienza con “get” y con “set” son obligatorias si quiero que se presente un buen comportamiento al usar este Bean.

Registro" scope="page"> <jsp:setProperty name="registro" property="*"></jsp:setProperty> </jsp:useBean> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. java.01 Transitional//EN" "http://www.AgregaRegistro().getParameter("codigo")==null && request. MiPaqueteChileno.org/TR/html4/loose.util. try{ resultado = registro. 12:31:28 PM Author : Luis Felipe Wanumen --%> <%@ page language="java" import="java.* .8.sql.Registro" pageEncoding="ISO-8859-1"%> <jsp:useBean id="registro" class=" MiPaqueteChileno.dtd"> <html> <body> <% if (request.jsp"> <p>Nombre</p><input type="text" name="nombre" /><br /> <p>Codigo</p><input type="text" name="codigo" /><br /> <p>Contraseña</p><input type="password" name="contrasenia"/><br /> <p><button type="submit">Enviar</button></p> </form> <% }else{ String resultado = "NADA".getParameter("nombre")==null && request.w3.println("No se pudo agregar").println(resultado).jsp” <%-Document : Regio Created on : 18/03/2009.Autor: Luis Felipe Wanumen Silva 109 7. } catch(Exception e){ out. } }%> </body> </html> Enciclopedia Conociendo Curso de Jsp y Servlets . out. PASO 8: INGRESANDO CODIGO EN LA VISTA A continuación ingresamos el siguiente código en la pagina “registro.getParameter("password")== null) { %> <form name="registro" method="POST" action="registro.*.

7. Otros tipos son: “sesion”. “page”.jsp"> <p>Nombre</p><input type="text" name="nombre" /><br /> <p>Codigo</p><input type="text" name="codigo" /><br /> <p>Contraseña</p><input type="password" name="contrasenia"/><br /> <p><button type="submit">Enviar</button></p> </form> Pero cuando dichos valores no son nulos son recibidos por la variable “registro” la cual hace referencia al Bean “Registro” que se encuentra en el paquete “MiPaqueteChileno” y que se puede invocar desde la pagina jsp debido a que ya esta incluido con las siguientes instrucciones: <jsp:useBean id="registro" class="MiPaqueteChileno. “request” y “application”. Cuando la pagina JSP recibe valores para las variables “codigo”.9.Registro" scope="page"> <jsp:setProperty name="registro" property="*"></jsp:setProperty> </jsp:useBean> Observe amigo lector que la incorporación de Bean en una JSP se puede hacer mediante etiquetas “useBean” En las etiquetas “useBean” se presentan algunos parámetros que es bueno que todos conozcamos: Id: Nombre con el cual el Bean es reconocido desde la pagina JSP Class: Nombre de la clase Bean que vamos a incorporar en nuestra JSP.Autor: Luis Felipe Wanumen Silva Con la directiva <%@ page language="java" import="java. “nombre” y “password” nulos mediante las instrucciones getParameter("codigo") getParameter("nombre") getParameter("password") carga el formulario HTML siguiente: <form name="registro" method="POST" action="registro.* %> 110 Se incorporan librerías y no es posible usar este tipo de inclusiones para incluir otros archivos que cambian o sean dinámicos. en nuestro caso estamos diciendo que la referencia a este Bean se pierde cuando se pasa a otra pagina jsp. La pregunta que se estara haciendo en este momento el amigo lector / estudiante es: ¿en qué momento se están pasando las variables al Bean?. La respuesta es bien sencilla: Al poner property="*" estamos diciendo que las variables en la clase se llaman igual que la interfaz y son pasadas en forma transparente a través de los métodos “get” y “set” al Bean. Scope: Duración de la referencia a este Bean. PASO 9: ENSAMBLE Y DESPLIEGUE DE LA APLICACION Enciclopedia Conociendo Curso de Jsp y Servlets .util.

debido a que el hace todo este trabajo para el programador y por ello lo unico que se hara en NetBeans 6.Autor: Luis Felipe Wanumen Silva 111 En NetBeans no hay que saber mucho de ensamble y despliegue de aplicaciones.0 es ejecutar: El se demora un tiempo mientras sube un servidor Enciclopedia Conociendo Curso de Jsp y Servlets .

PASO 10: EJECUCION DE LA APLICACIÓN Ejecutamos un navegador web y colocamos la siguiente direccion en la barra de direcciones: http://localhost:8080/Udistrital/registro.jsp En donde aparecerá una pagina similar a la siguiente: Al hacer click sobre “enviar” se obtiene un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .10.Autor: Luis Felipe Wanumen Silva 112 7.

Autor: Luis Felipe Wanumen Silva 113 Y al observar los datos de la base de datos: Observamos que nuestro ejercicio ha funcionado correctamente. Enciclopedia Conociendo Curso de Jsp y Servlets .

out = resp.servlet.addCookie(c4)."Silva"). i++) { Cookie c = cookies[i]. Cookie c3 = new Cookie("Apellido1".setContentType("text/html"). CREACION DE UNA COOKIE DESDE UN SERVLET El siguiente ejemplo muestra como crear cookies desde un servlet.http.length. MANIPULACION DE COOKIES Y SESIONES 8. resp.*. Mas adelante se usa el metodo “getCookies()” para obtener un vector de cookies y cada una de sus posiciones es una cookie que tiene dos propiedades que son “Nombre” y “Valor” que pueden se accedidas mediante los metodos “getName()” y “getValue()” de la clase Cookie.1. El ejemplo completo es el siguiente: import javax. out.*.io. IOException { PrintWriter out. resp.servlet.println("<h1>Mostrando Cookies</h1>").addCookie(c2).*. Enciclopedia Conociendo Curso de Jsp y Servlets .getCookies(). HttpServletResponse resp) throws ServletException.getWriter().addCookie(c1). for (int i = 0. Cookie c2 = new Cookie("Nombre2". resp. Cookie c4 = new Cookie("Apellido2". realmente crea cuatro cookies tal como muestra la siguiente tabla: Nombre de la cookie Nombre1 Nombre2 Apellido1 Apellido2 Valor de la Cookie Luis Felipe Wanumen Silva Con el metodo “addCookie” se adicionan las cookies. public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest req. Cookie c1 = new Cookie("Nombre1"."Luis").Autor: Luis Felipe Wanumen Silva 114 8. i < cookies."Felipe"). Cookie[] cookies = req. import java."Wanumen"). import javax. resp.addCookie(c3). resp.

setAttribute("Nombre". CREACION DE UNA SESSION DESDE UNA JSP Las sesiones funcionan en forma similar a las cookies y se crean mediante el metodo “setAttribute()” del objeto “session”."Luis Wanumen").2.getName().Autor: Luis Felipe Wanumen Silva String name = c. String value = c. out.jsp” el cual crea una session con el nombre “Nombre” y con el valor “Luis Wanumen”: <%-Colocar valores en las sesiones --%> <%@page session="true"%> <% session. 115 } } } 8. %> Al ejecutar la pagina anterior obtenemos un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .getValue().println(name + " = " + value). pero es importante notar que para lograr que esta creación funcione se requiere la habilitacion de las sesiones en la pagina jsp y esto se logra mediante la instrucción: <%@page session="true"%> A continuación se muestra el contenido de archivo “sesion1.

getAttribute("Nombre"). out. obviamente habiendo ejecutado primero la pagina “sesion1. %> Al ejecutar la pagina anterior. para mostrar el contenido de la session basta con hacer una pagina jsp que invoque el metodo “getAttribute()” del objeto “session”.println(cadena).jsp” obtenemos el siguiente resultado: Enciclopedia Conociendo Curso de Jsp y Servlets . ya que se crea la session pero no se esta mostrando. no hay resultados visibles. String cadena = (String)objetoRecibido. dicha pagina se muestra a continuación: <%-Colocar valores en las sesiones --%> <%@page session="true"%> <% Object objetoRecibido = session.Autor: Luis Felipe Wanumen Silva 116 Como quien dice.

Autor: Luis Felipe Wanumen Silva 117 Enciclopedia Conociendo Curso de Jsp y Servlets .

y estados de conexiones. Sentencia. Sentencia.Autor: Luis Felipe Wanumen Silva 118 9... PRIMEROS PASOS Usamos en primera medida el paquete java.... ubicaciones.. Recordemos que la sentencia: try{ Sentencia... y en fin..... } catch(Exception e ){ } Lo que hace es intentar ejecutar las sentencias que se encuentran dentro del try. Sentencia. NOTA: Aclaremos que los Requerimientos Puerto Puerto y Host Tipo de Socket ServerSocket Socket Recordad que estos sockets inicialmente operan sobre TCP/IP EL OBJETIVO ES HACER UN CHAT En este momento estamos haciendo la parte del Servidor.. de tal forma que si alguna de las sentencias no se puede ejecutar..net que nos permite manejar conexiones con equipos.. Sentencia.. ELABORACION DE UN CHAT POR PASOS 9.. Enciclopedia Conociendo Curso de Jsp y Servlets . nos permite el manejo de URL.... inmediatamente se ejecutan las sentencias que estan en el el bloque match(Exception e).....1..

Autor: Luis Felipe Wanumen Silva 119 9.getInputStream(). El funcionamiento es el siguiente: El Servidor tiene una interfaz similar a la siguiente: De tal forma que cuando el usuario haga clic en la opción “Arrancar el Servidor”.read().2. if(c==-1) break. Con lo cual crea un Socket que atenderá la petición y en seguida lee los datos que el cliente le envíe y los muestra por consola. En el momento que un cliente se conecte. usando las siguientes instrucciones: InputStream recibir = ap_cliente1. UN EJEMPLO DE UN CLIENTE Y UN SERVIDOR El siguiente es un ejemplo de una aplicación cliente y una aplicación servidora.out.accept(). } El cliente por su parte todo lo que hace es enviar un texto “Hola” por medio de las siguientes instrucciones: Enciclopedia Conociendo Curso de Jsp y Servlets . while(true){ int c = recibir. el servidor podrá ejecutar la siguiente línea: Socket ap_cliente1 = ssock. System. el sistema creará un “ServerSocket” que estará escuchando por el puerto 210 ssock = new ServerSocket(210).println((char)c).

*. Clase3Frame frame = new Clase3Frame().write(bytes_enviados).Autor: Luis Felipe Wanumen Silva 120 String salida = "Hola". byte[] bytes_enviados = salida. frame.out. } } Clase3Frame.getOutputStream().println(new String(bytes_enviados)). envia. Ahora bien. el sistema envie “Hola” al servidor.getBytes(). cliente = new Socket("xp". Enciclopedia Conociendo Curso de Jsp y Servlets . Por ultimo las instrucciones del cliente se pueden colocar en una interfaz gráfica similar a la siguiente: De tal forma que cuando el usuario haga clic en la opción “Enviar”. con el ánimo de lograr la mayor comprensión del tema por parte del amigo lector / estudiante. System.210).java public class Clase3 { public static void main(String[] args) { // Create application frame. a continuación se muestra el código de la aplicación que reside en el lado del servidor: Clase3. OutputStream envia = cliente.show().java import java.net. // Show frame.

JMenuItem menuRedesArrancar = new JMenuItem().setText("Arranque el servidor").*. JMenu menuRedes = new JMenu(). if(c==-1) break. System.io.println("Ha llegado un cliente").out.*. System.read(). java.accept().awt. while(true){ int c = recibir.Autor: Luis Felipe Wanumen Silva 121 import import import import public java. } public void aceptar() throws Exception{ Socket ap_cliente1 = ssock.awt.swing.setText("Redes").println("El servidor esta escuchando"). javax. menuRedesArrancar.out.out. JMenuItem menuRedesExit = new JMenuItem(). public void arrancar() throws Exception { ssock = new ServerSocket(210). System. } } public Clase3Frame() { JMenuBar menuBar = new JMenuBar().*. */ ServerSocket ssock. class Clase3Frame extends JFrame { /** * The constructor. menuRedes.event. Enciclopedia Conociendo Curso de Jsp y Servlets . java.*.getInputStream(). InputStream recibir = ap_cliente1.println((char)c).

println("Probando evento").out.this. // A continuacion se asocia la opcion de menuItem // menuRedesArrancar con una accion menuRedesArrancar. setJMenuBar(menuBar).add(menuRedesExit).windowClosed() . } catch(Exception p){ } } } ).Autor: Luis Felipe Wanumen Silva 122 menuRedesExit. Enciclopedia Conociendo Curso de Jsp y Servlets . menuRedes. aceptar(). } } ). setTitle("Clase3Frame").addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { Clase3Frame.add(menuRedes). menuRedes.add(menuRedesArrancar). // Add action listener.setText("Exit"). menuBar. try{ arrancar().for the menu button menuRedesExit.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { // System.

frame. } } y el código de la aplicación que reside en el lado del cliente es: Clase4. 400)).windowClosed() .addWindowListener ( new WindowAdapter() { public void windowClosing(WindowEvent e) { Clase3Frame. } } ).java public class Clase4 { public static void main(String[] args) { Clase4Frame frame = new Clase4Frame().exit(0). } /** * Shutdown procedure when run as an application. System. this. // Add window listener. } } Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 123 setSize(new Dimension(400.this. */ protected void windowClosed() { // TODO: Check if it is safe to close the application // Exit application.show().

JMenuItem menuRedesExit = new JMenuItem().net.out.*. OutputStream envia = cliente.Autor: Luis Felipe Wanumen Silva Clase4Frame.210). byte[] bytes_enviados = salida. public class Clase4Frame extends JFrame { Socket cliente. menuRedes.io. public void crear_cliente_y_envia() throws Exception{ String salida = "Hola".*.setText("Redes").awt.java 124 import import import import import java. envia. menuRedesEnviar.getBytes().awt. javax.*. menuRedesExit.*.swing.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { try{ Enciclopedia Conociendo Curso de Jsp y Servlets . java. System. java.getOutputStream(). cliente = new Socket("xp".*.setText("Enviar"). java. JMenuItem menuRedesEnviar = new JMenuItem().event. menuRedesEnviar.write(bytes_enviados).setText("Salir"). } public Clase4Frame() { JMenuBar menuBar = new JMenuBar().println(new String(bytes_enviados)). JMenu menuRedes = new JMenu().

} catch(Exception p){ } } } ). menuRedesExit. menuRedes. setJMenuBar(menuBar). } } ). menuRedes.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { Clase4Frame. setTitle("Clase4Frame").windowClosed() . } protected void windowClosed() { Enciclopedia Conociendo Curso de Jsp y Servlets . setSize(new Dimension(400.this. menuBar.add(menuRedesExit).addWindowListener ( new WindowAdapter() { public void windowClosing(WindowEvent e) { Clase4Frame.add(menuRedes).Autor: Luis Felipe Wanumen Silva 125 crear_cliente_y_envia().this. 400)).add(menuRedesEnviar). } } ). this.windowClosed() .

Autor: Luis Felipe Wanumen Silva 126 System. Enciclopedia Conociendo Curso de Jsp y Servlets . lo que hace es atenderlo y recibe lo que éste le esté enviando. Como el amigo lector / estudiante pudo observar. Lo que si debe ser claro para el lector es que el código anterior se hizo en varios archivos para lograr que se tengan buenos hábitos de programación y se trate de trabajar en forma modular y no como hacen muchas personas: “todo el código en un solo archivo”. lo que sucede es que el hecho de haberlo colocado en una interfaz agradable al usuario hace que sean necesarias la incorporación de varias líneas. el anterior código en esencia no es largo. pero esto en últimas es puro maquillaje de interfaz gráfica. Para el caso específico de nuestro ejemplo. Espero que el ejercicio halla sido de agrado para el lector. } } Cuando el Servidor detecta que ha llegado un cliente.exit(0). se tiene un resultado en términos de ejecución similar al siguiente: que se presenta cuando se ejecuta la aplicación cliente y se le da clic en el botón “Enviar”.

System.out. } } Enciclopedia Conociendo Curso de Jsp y Servlets . System. } Espera a que un cliente se conecte con el servidor y cuando se conecta imprime el numero del cliente.Autor: Luis Felipe Wanumen Silva 127 9. EL METODO ACCEPT DE SERVERSOCKET El método “accept” de la clase cliente espera a que un cliente se conecte y disculpando la redundancia redundante. while(true){ Socket refCliente = objetoServidor.println("Pude crear el objeto servidor"). El programa completo en el lado del servidor es: import java.println("Ha llegado el cliente "+num_cliente). El siguiente ciclo while(true){ Socket refCliente = objetoServidor. } } // Cierra public Servidor() public static void main(String[] args) { System.accept().net. num_cliente ++. } } catch(Exception e){ System.out. acepta dicha conexión.println("Ha llegado el cliente "+num_cliente). num_cliente ++. System. aumenta el contador de clientes y espera a que otro cliente se conecte y asi sucesivamente hasta que se termine abruptamente del programa.3. int num_cliente = 1. Servidor principal = new Servidor().out.out.println("No pude crear el objeto servidor").accept().out. public class Servidor { public Servidor(){ try{ ServerSocket objetoServidor = new ServerSocket(80).println("Hola Soy el SERVIDOR").*.

} } // Cierra public Servidor() public static void main(String[] args) { System. SEGUNDA MEJORA AL PROGRAMA ANTERIOR El programa anterior solamente permitia que un servidor aceptara conexiones de varios cliente. Cliente principal = new Cliente().4.net. pero no permitia que el cliente enviara información o que el servidor le enviara al cliente.*.out. Para permitir el envio de información desde un equipo hasta otro se usa el paquete java.*. System.java METODO AÑADIDO readUTF() writeUTF() CLASE QUE SE USA ObjectInputStream ObjectOutputStream Enciclopedia Conociendo Curso de Jsp y Servlets . } } 9. no permitia enviar información de un lado hacia el otro.net para la conexion) La siguiente tabla resume los metodos que se añadieron al programa cliente y al programa servidor: PROGRAMA Servidor.out.out. (Obviamente se sigue usando java.io. en fin. public class Cliente { public Cliente(){ try{ Socket objetoServidor = new Socket("localhost". } catch(Exception e){ System.println("Pude crear el objeto cliente").println("No pude crear el objeto cliente").java Cliente.80).println("Hola Soy el CLIENTE").Autor: Luis Felipe Wanumen Silva 128 El programa en el lado del cliente es: import java.

getInputStream().net.accept(). OutputStream salida = objetoCliente.println("Ha llegado el cliente ").io. System.println("Pude crear el objeto servidor"). public class Servidor { public Servidor(){ try{ ServerSocket objetoServidor = new ServerSocket(85).*. // Esto crea un flujo de salida basado en la conexion // que tiene el objeto objetoCliente.out. Enciclopedia Conociendo Curso de Jsp y Servlets . import java.readUTF().out.*.out.out. String lectura = "". Socket refCliente = objetoServidor.io.net. public class Cliente { public Cliente(){ try{ Socket objetoCliente = new Socket("localhost".println("Pude crear el objeto cliente"). lectura = carritoEntrada. DataOutputStream carritoSalida = new DataOutputStream(salida). } catch(Exception e){ System. } } El programa mejorado en el lado del cliente es: import java. System.out.out. System. } } // Cierra public Servidor() public static void main(String[] args) { System.85).println("Errores en el servidor").Autor: Luis Felipe Wanumen Silva 129 El programa mejorado en el lado del servidor es: import java.getOutputStream(). import java.*. Servidor principal = new Servidor().println("Hola Soy el SERVIDOR"). DataInputStream carritoEntrada = new DataInputStream(entrada).println("Lo que me llego es "+lectura). System.*. InputStream entrada = refCliente.

awt.io. TextField cajilla = new TextField(" Enciclopedia Conociendo ").out.5. // Para las conexiones import java.out. } } 9. System.writeUTF("Yo me llamo cumbia yo soy la reina.*... MEJORANDO EL PROGRAMA ANTERIOR COLOCANDOLE UNAS BELLAS INTERFACES GRAFICAS El programa del cliente anterior lo queremos mejorar usando una interfaz de usuario mas agradable. etc.println("Hola Soy el CLIENTE"). // Para botones.*. cajas. Cliente principal = new Cliente().net. // Para flujos y archivos import java.Autor: Luis Felipe Wanumen Silva 130 carritoSalida.out.println("Errores en el cliente")."). el objetivo es mostrar una interfaz similar a la siguiente: Para ello mejoramos el programa con las instrucciones siguientes: import java. public class Cliente extends Frame{ Panel panelcillo = new Panel(). } } // Cierra public Servidor() public static void main(String[] args) { System. Curso de Jsp y Servlets .*.println("Le envie al servidor la cancion YO ME LLAMO CUMBIA"). } catch(Exception e){ System.

*.add(botoncillo).awt. panelcillo. import java... System. el boton no ejecuta acción alguna. cajas. Para crear eventos en java se requiere usar un paquete que maneje eventos.*. // Para botones.add(cajilla).*. 131 // Esto crea un flujo de salida basado en la conexion // que tiene el objeto objetoCliente. // Este paquete me permite manejar eventos.awt.net.event.println("Le envie al servidor la cancion YO ME LLAMO CUMBIA"). System.setSize(800. OutputStream salida = objetoCliente. Button botoncillo = new Button("Enviar"). DataOutputStream carritoSalida = new DataOutputStream(salida). public class Cliente extends Frame{ Panel panelcillo = new Panel(). } catch(Exception e){ System. try{ Socket objetoCliente = new Socket("localhost". carritoSalida.Autor: Luis Felipe Wanumen Silva Button botoncillo = new Button("Enviar").println("Pude crear el objeto cliente").println("Hola Soy el CLIENTE").out.writeUTF("Yo me llamo cumbia yo soy la reina. El programa cliente mejora es el siguiente: import java. } } Si. public Cliente(){ add(panelcillo). ya sabemos.out. principal.85).println("Errores en el cliente"). // Para flujos y archivos import java. // Para las conexiones import java. Enciclopedia Conociendo Curso de Jsp y Servlets .awt.*.event. principal.out.*.600).out.getOutputStream().io.setVisible(true)."). etc. } } // Cierra public Servidor() public static void main(String[] args) { System. TextField cajilla = new TextField(" "). Este paquete es el paquete Java. Cliente principal = new Cliente(). panelcillo.

// Esta instruccion asigna el evento al botoncillo // Osea cuando se pica sobre el boton se ejecuta el // metodo actionPerformed del objeto objetoEvento // que es de tipo EventoEnviar. System.add(botoncillo).setVisible(true). } } // Cierra public void actionPerformed } // Cierra ActionListener public Cliente(){ add(panelcillo). principal. Cuando se activa el evento // se ejecuta el metodo actionPerformed. DataOutputStream carritoSalida = new DataOutputStream(salida).getText()). } // Cierra public Servidor() public static void main(String[] args) { System.getOutputStream(). OutputStream salida = objetoCliente.println("Hola Soy el CLIENTE"). panelcillo. public class EventoEnviar implements ActionListener{ public void actionPerformed(ActionEvent ev){ try{ Socket objetoCliente = new Socket("localhost". // Las clases en java que implementan ActionListener son // clases de tipo evento.out. } catch(Exception e){ System. 132 // Esto crea un flujo de salida basado en la conexion // que tiene el objeto objetoCliente. botoncillo. panelcillo. } } Enciclopedia Conociendo Curso de Jsp y Servlets .add(cajilla). carritoSalida.println("Errores en el cliente").println("Pude crear el objeto cliente"). principal.setSize(800.85).out.Autor: Luis Felipe Wanumen Silva EventoEnviar objetoEvento = new EventoEnviar(). System.out. Cliente principal = new Cliente().println("Le envie al servidor la cancion YO ME LLAMO CUMBIA").600).addActionListener(objetoEvento).writeUTF(cajilla.out.

lo primero que debe hacer el servidor es tener una lista simplemente enlazada en la que coloque las referencias de los clientes que se han conectado al servidor.6. con lo cual la situación mas facil de implementar es de la siguiente manera: apCabeza NULL apFINAL Enciclopedia Conociendo Curso de Jsp y Servlets . la cual contendra la información necesaria de un solo cliente. EL SERVIDOR CREA AÑADE A LA LISTA CADA VEZ QUE LLEGA UN CLIENTE Para lograr que el servidor acepte varios clientes. la cual contiene una subclase llamada “NODOCLIENTE”. Esto se logra por medio de una clase nueva llamada “LISTACLIENTES”. En terminos graficos la situación es la siguiente: apCabeza Cuando no ha llegado cliente alguno.Autor: Luis Felipe Wanumen Silva 133 9. NULL En el momento en el que llega un cliente la situación debe ser la siguiente: apCabeza NODOCLIENTE NULL En el momento en el que se conecte un tercer cliente la situación es la siguiente: apCabeza NODOCLIENTE NODOCLIENTE NULL La anterior diagramación es bastante compleja de implementar sin otro apuntador.

Autor: Luis Felipe Wanumen Silva 134 Para el primer cliente la situación es la siguiente. apCabeza apFinal NODOCLIENTE sig NULL Para el caso del segundo cliente: apCabeza apFinal NODOCLIENTE NODOCLIENTE NULL Para el caso del tercer cliente: apCabeza apFinal NODOCLIENTE NODOCLIENTE NODOCLIENTE NULL Enciclopedia Conociendo Curso de Jsp y Servlets .

println("Esperando a un cliente").out.java import java. while(true){ System.out.println("Algo raro ocurrre en el servidor").ServerSocket. NODOCLIENTE sig. } } Archivo LISTACLIENTES.Socket. apFinal = null. import java.println("Ya llego este cliente"). public LISTACLIENTES(){ apCabeza = null.out. } } public static void main(String[] args) { // TODO. } // Cierra while } catch(Exception e){ System. objListaClientes.devolverListaClientes().net. NODOCLIENTE apFinal. System. public NODOCLIENTE(){ sig = null.adicionarCliente(refClientecillo).net. public SERVIDOR(){ objListaClientes = new LISTACLIENTES(). SERVIDOR principal = new SERVIDOR(). Socket refClientecillo = objServidor.Autor: Luis Felipe Wanumen Silva import java.net. public class SERVIDOR { LISTACLIENTES objListaClientes.accept(). add your application code System.println("Hello World!"). }// Cierra constructor NODOCLIENTE } // Cierra public class NodoCliente NODOCLIENTE apCabeza. String val = "". public class LISTACLIENTES{ public class NODOCLIENTE{ Socket RefCliente = null.Socket.out. try{ ServerSocket objServidor = new ServerSocket(85). objListaClientes. } // Cierra public LISTACLIENTES() 135 Enciclopedia Conociendo Curso de Jsp y Servlets .

out. // Rojo } } // Cierra public adicionarCliente public void devolverListaClientes(){ System.sig = nuevoCliente.85).out. apCabeza. if(apCabeza==null){ apCabeza = new NODOCLIENTE(). // Entramos a este if solo cuando // llega el primer cliente.println("Errores con el cliente").println("Estamos en la funcion adicionarCliente").out.RefCliente = ref.out.println(apRecorrer. apFinal = apCabeza.Socket. // Si no se ejecuta esto. // Recordemos que este es unico caso en el que ambos apuntadores // estan en el mismo NODOCLIENTE. } // Cierra if(apCabeza==NULL) else{ NODOCLIENTE nuevoCliente = new NODOCLIENTE().println("Hello World!"). Enciclopedia Conociendo 136 Curso de Jsp y Servlets . // Recorre la lista de clientes.toString()). nuevoCliente. NODOCLIENTE apRecorrer.net.RefCliente = ref. se queda // en un ciclo infinito.println("Estamos en la funcion devolverListaClientes").RefCliente. while(apRecorrer!=null){ System. apFinal.sig. public class CLIENTE { public CLIENTE(){ try{ Socket cliente = new Socket("localhost". apRecorrer = apCabeza. // Verde apFinal = nuevoCliente. } catch(Exception e){ System. } } // Cierra public CLIENTE() public static void main(String[] args) { // TODO. apRecorrer = apRecorrer.Autor: Luis Felipe Wanumen Silva public void adicionarCliente(Socket ref){ System. } // Cierra while } // Cierra public void devolverListaClientes() } // Cierra public class LISTACLIENTES El codigo del cliente es similar al siguiente: import java.out. add your application code System.

debe enviarlo a todos los clientes. try{ ServerSocket objServidor = new ServerSocket(85).Autor: Luis Felipe Wanumen Silva CLIENTE principal = new CLIENTE().ServerSocket. add your application code System. public SERVIDOR(){ objListaClientes = new LISTACLIENTES().out.7. el cual se encarga de atender a dicho cliente. } } 137 Hasta ahora cada vez que un cliente se conecta. System.println("Esperando a un cliente").println("Hello World!"). QUE ES UN HILO Es un subproceso que tiene caracteristicas como se puede suspender. Viene la parte mas dura que es lo que el servidor recibio del cliente.net.net.out.accept().Socket. while(true){ System. Enciclopedia Conociendo Curso de Jsp y Servlets . } // Cierra while } catch(Exception e){ System.devolverListaClientes(). dormir y eliminar definitivamente el subproceso.out. Socket refClientecillo = objServidor.println("Algo raro ocurrre en el servidor"). en el lado del servidor se añade un nodo a la lista.println("Ya llego este cliente"). reactivar. objListaClientes. lo mejor que se puede sin usar hilos es lo siguiente: import java. SERVIDOR principal = new SERVIDOR().out. import java.adicionarCliente(refClientecillo). public class SERVIDOR { LISTACLIENTES objListaClientes. } } 9. } } public static void main(String[] args) { // TODO. objListaClientes.

net.Socket.println("Hello World!").out.println("Algo raro ocurrre en el servidor"). System.*. public SERVIDOR(){ objListaClientes = new LISTACLIENTES(). DataInputStream entra.out.net. import java. } } import java. Socket refClientecillo = objServidor.io.println("Esperando a un cliente").net.awt.adicionarCliente(refClientecillo).out. SERVIDOR principal = new SERVIDOR(). } // Cierra while } catch(Exception e){ System. try{ ServerSocket objServidor = new ServerSocket(85). import java. add your application code System. } } public static void main(String[] args) { // TODO. public class SERVIDOR { LISTACLIENTES objListaClientes.*. while(true){ System. import java.println("Ya llego este cliente").accept().ServerSocket. objListaClientes.devolverListaClientes(). public class LISTACLIENTES{ public class SubProceso extends Thread{ String lectura.out.8 CHAT PUBLICO USANDO HILOS El ejercicio completo es el siguiente: import java. public SubProceso(Socket r){ Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 138 9. InputStream entrada. objListaClientes.Socket.

public NODOCLIENTE(){ sig = null.out. NODOCLIENTE apFinal.RefCliente = ref.readUTF().println("Errores corriendo hilo"). // Entramos a este if solo cuando // llega el primer cliente.println("Error creadno el subproceso"). } // Cierra public LISTACLIENTES() public void adicionarCliente(Socket ref){ System.println("Estamos en la funcion adicionarCliente").out.out. apFinal = apCabeza. } // Cierra while } catch(Exception e){ System. try{ SubProceso nuevosubproceso = new SubProceso(ref). }// Cierra constructor NODOCLIENTE } // Cierra public class NodoCliente NODOCLIENTE apCabeza. public LISTACLIENTES(){ apCabeza = null. enviarAClientes(lectura). System. apFinal = null. } // Cierra catch } // Cierra run() } // Cierra class SubProceso public class NODOCLIENTE{ Socket RefCliente = null. entra = new DataInputStream(entrada). } catch(Exception e){ System.getInputStream().println("El cliente envio "+lectura).Autor: Luis Felipe Wanumen Silva try{ entrada = r. apCabeza. // Recordemos que este es unico caso en el que ambos apuntadores // estan en el mismo NODOCLIENTE.out. Enciclopedia Conociendo 139 Curso de Jsp y Servlets . if(apCabeza==null){ apCabeza = new NODOCLIENTE(). NODOCLIENTE sig. } } // Esto cierra el constructor SubProceso(Socket r) public void run(){ try{ while(true){ lectura = entra. String val = "".

// Rojo } } // Cierra public adicionarCliente public void devolverListaClientes(){ System.RefCliente.println("Estamos en la funcion devolverListaClientes"). } // Cierra while } // Cierra public void devolverListaClientes() 140 public void enviarAClientes(String mensaje){ System.RefCliente = ref. while(apRecorrer!=null){ try{ OutputStream salida = apRecorrer. // Si no se ejecuta esto.start(). } // Cierra try catch(Exception e){ System.toString()).getOutputStream(). DataOutputStream sale = new DataOutputStream(salida). se queda // en un ciclo infinito.out. nuevosubproceso.println("Error leyendo datos del cliente").writeUTF(mensaje).println("Error leyendo datos del cliente"). // Recorre la lista de clientes. se queda // en un ciclo infinito. while(apRecorrer!=null){ System. NODOCLIENTE apRecorrer.start().out. // Recorre la lista de clientes.println(apRecorrer.sig. } apFinal. Enciclopedia Conociendo Curso de Jsp y Servlets . // RefCliente es el que realmente atiende al cliente.Autor: Luis Felipe Wanumen Silva nuevosubproceso.out. // Verde apFinal = nuevoCliente. } // Cierra try catch(Exception e){ System. apRecorrer = apRecorrer. nuevoCliente.sig = nuevoCliente.out.out.println("Estamos en la funcion devolverListaClientes"). } } // Cierra if(apCabeza==NULL) else{ NODOCLIENTE nuevoCliente = new NODOCLIENTE(). } catch(Exception e){ System. sale.RefCliente. apRecorrer = apCabeza. apRecorrer = apCabeza.out.println("Error enviando a todos los clientes"). } // Si no se ejecuta esto. try{ SubProceso nuevosubproceso = new SubProceso(ref). NODOCLIENTE apRecorrer.

*/ Socket cliente. Labels.*. DataOutputStream carritoSalida.*.println("Error escribiendo en la caja de texto").awt. TextArea ta = new TextArea(). Check. Group.getText()). } catch(Exception e){ System.sig.println("Me ponchaste").io. import java.out. TextField texto = new TextField(30). paneles import java. BorderLayout border = new BorderLayout(0. } // Cierra while } // Cierra public void enviarAClientes() } // Cierra public class LISTACLIENTES El lado del cliente seria: import java. try{ carritoSalida.Socket. public class CLIENTE extends Frame{ OutputStream salida.writeUTF(texto.0). Panel panel1 = new Panel(). /* InputStream entrada.Autor: Luis Felipe Wanumen Silva apRecorrer = apRecorrer. Evento objetoEvento = new Evento().net. Panel panel2 = new Panel(). import java.event. // Botones. DataInputStream carritoEntrada. Button b1 = new Button("Enviar").awt.out. SubProceso objSubproceso. TextAreas. } } } // Cierra public class Evento Enciclopedia Conociendo 141 Curso de Jsp y Servlets . public class Evento implements ActionListener{ public void actionPerformed(ActionEvent ev){ System.*.

panel1). this. try{ Enciclopedia Conociendo Curso de Jsp y Servlets .getText(). panel2. panel2. textillos = ta.addActionListener(objetoEvento).println("Error en Constructor").readUTF(). System. entradilla1 = new DataInputStream(entradilla).add(b1). public SubProceso(Socket r){ try{ entradilla = r. b1. add("North". System. panel2.setBackground(Color.exit(0).yellow). } catch(Exception e){ System. } catch(Exception e){ System. DataInputStream entradilla1.setBackground(Color.add(texto).Autor: Luis Felipe Wanumen Silva 142 public class SubProceso extends Thread{ InputStream entradilla.out.setText(textillos). textillos = textillos + lectura + "\n".out. panel2).blue). } } public void run(){ while(true){ try{ String lectura = entradilla1.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(). panel1.out.println("El mensaje del servidor es "+lectura). ta.add(ta). add("Center".println("Error leyendo datos del servidor").getInputStream(). } }). String textillos = "". panel1. } } } // Cierra run } // Cierra public class SubProceso public CLIENTE(){ setLayout(border).

CLIENTE principal = new CLIENTE(). carritoSalida = new DataOutputStream(salida).getOutputStream(). principal. objSubproceso = new SubProceso(cliente). } } 143 Enciclopedia Conociendo Curso de Jsp y Servlets . InputStream entrada = cliente.setVisible(true). // Estas tres lineas son para que el cliente envie // el texto "Yo soy un cliente" salida = cliente. DataInputStream carritoEntrada = new DataInputStream(entrada).out. principal.300).Autor: Luis Felipe Wanumen Silva cliente = new Socket("localhost".println("Hello World!").start(). } // Cierra try catch(Exception e){ System. objSubproceso.setSize(400. } } // Cierra public CLIENTE() public static void main(String[] args) { // TODO. add your application code System.out.println("Errores con el cliente").85).getInputStream().

DESCRIPCION El ejemplo que se muestra a continuación realmente solamente implementa en un solo sentido el flujo de información. Es importante recordar que en algunas metodologías se es mas riguroso en el modelamiento que en otras. 10.1. pero de todas formas en ambas se requiere modelamiento. Para hacer metodologicos y mas claros. PROGRAMA SIN MODELAR NO ES PROGRAMAR A manera de ejemplo en este capitulo se hacen algunos ejemplos de cuando es bueno usar los diagramas UML para tener claridad sobre algunos aspectos de la programación.1. se presenta a continuación un modelamiento de un envio de información de un cliente a un servidor y en ella se usa un diagrama de estados para modelar el estado de las conecciones. debido a que una coneccion con un servidor tiene varios estados. por ejemplo en RUP hay mas rigurosidad en el modelamiento. es decir los clientes se conectan e intentan enviar flujos de información a los servidores. a saber una coneccion puede estar suspendida. debido básicamente que se presume mas experiencia de los desarrolladores. Obviamente el ejemplo no es lo mas completo. y los servidores solamente reciben la información y la manipulan. porque si asi fuera se extenderia tanto como un documento de soporte a una aplicación y esto se escapa del presente material. La otra parte en donde el servidor envía información al cliente no se ha tenido en cuenta.Autor: Luis Felipe Wanumen Silva 144 10.1.1. desactiva o en cualquier otro estado.2. EL LADO DEL SERVIDOR ES: Enciclopedia Conociendo Curso de Jsp y Servlets . activa. en tanto que en RUP hay menos rigurosidad. IMPORTANCIA DEL DIAGRAMA DE ESTADOS EN UN ENVIO DE INFORMACION MINICHAT El diagrama de estados es muy importante en el modelamiento de aplicaciones de redes. 10. cosa que es bien interesante documentar y tener modelada mediante un diagrama de estados a fin de garantizar que al desarrollar el codigo no se pierda el analisis del estado de las conecciones. pero si da una introducción de la importante del diagrama de estados en el modelamiento de aplicaciones con redes y concretamente con sockets TCP 10.

Mi nuevo estado es denegado Enciclopedia Conociendo Curso de Jsp y Servlets . Tambien muestra que no es posible que un socket pasa el estado de estar esperando a un cliente si previamente no ha estado en Iniciado. caso en el cual no hay que volver al estado de iniciado ni ninguno de los anterior. sino que se puede seguir en dicho estado a menos que se caiga la coneccion y se pasaria al estado de desactivado. El estado “recursivo” es presenta cuando se estan enviando datos.Autor: Luis Felipe Wanumen Silva 145 inicio ServerSocket_iniciado ServerSocke t_start(4000) ServerSocke t_esperando ServerSock et_accept ServerSocket_ leyendoDatos() ServerSocket_esperandoFl ujodeDatos ServerSocket_acepta ndoConeccionCliente ServerSocket_Desactivado ServerSocket_soc ketFueraContexto El servidor debe iniciar primero la aplicación de lo contrario los clientes no y en este caso particular aparecerá en el lado del cliente un mensaje similar al siguiente: El diagrama de estados anterior muestra que no es posible que un socketservidor pase a ser un socket que esta en estado de estar aceptando conecciones si primero no ha estado esperando la coneccion de un cliente.

} } Archivo Servidor.accept().Autor: Luis Felipe Wanumen Silva 146 Pero bueno.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(). public class MyApp extends Frame { public MyApp() { this.out.iniciado().ServerSocket.net.*.println("Starting App"). public class Servidor{ ServerSocket objServidor. } }).exit(0). tenemos que el primer cliente que se conecte sera atendido por medio del metodo “accept()” del servidor.io. MyApp f = new MyApp().println("Ha llegado un cliente y yo como servidor lo he aceptado").*.java import java. Socket refCliente1 = objServidor. f. Enciclopedia Conociendo Curso de Jsp y Servlets .awt.show().100).net. InputStream entrada. System. Servidor servidor = new Servidor().setSize(100. } public void iniciado(){ try{ objServidor = new ServerSocket(4000).println("Se pudo crear el objeto Servidor").event.*.awt.out. public Servidor(){ iniciado(). } public static void main(String args[]) { System. aceptandoConeccionCliente(). esperando(). teniendo en cuenta el caso perfecto en el cual se inicia primero el servidor. f. import java. Esta funcion permite que el estado del cliente pase a ser conectado.Socket. La aplicación servidora es: Archivo MyApp. import java. import java.out.java import java. System. System. servidor.

} // Cierar catch } // Cierra public void iniciado() public void socketFueraContexto(){ System.getInputStream().out.out. leyendoDatos().println("Estoy aceptandoConeccionCliente"). } } catch(Exception e){ System.out. while(true){ lectura = entra. } // Cierra public void esperando() } // Cierra public class Servidor 147 Enciclopedia Conociendo Curso de Jsp y Servlets .out.println("Estoy fuera de contexto").out.println("Estoy esperando a un cliente"). String lectura.println("esperandoFlujodeDatos").readUTF().out. } // Cierra analizandoDatosQueLLegaron() public void leyendoDatos(){ System. socketFueraContexto(). } // Cierra public void esperando() public void esperandoFlujodeDatos(){ System.println("Estoy leyendo Datos").println("Estoy analizando Datos Que LLegaron"). analizandoDatosQueLLegaron(). esperandoFlujodeDatos().println(lectura). System. DataInputStream entra = new DataInputStream(entrada). } // Cierra void socketFueraContexto public void esperando(){ System. } public void aceptandoConeccionCliente(){ System.println("No se pudo crear el objeto Servidor").Autor: Luis Felipe Wanumen Silva entrada = refCliente1.out. } public void analizandoDatosQueLLegaron(){ System.out.

awt. public class MyApp extends Frame { TextField texto = new TextField(" ").*.1. Cliente cliente = new Cliente().java Archivo MyApp. // Evento objEvento = new Evento().java import java. Button boton1 = new Button("Enviar").event.*.java y Cliente.3. Enciclopedia Conociendo Curso de Jsp y Servlets . import java.Autor: Luis Felipe Wanumen Silva 148 10.awt. EL LADO DEL CLIENTE ES: SocketCliente_conectado SocketClien te_aceptado SocketCliente_ enviandoDatos SocketCliente_esperandoC onfirmacionRecibidoServidor SocketCliente_env iandoFlujodeDatos SocketCliente_fueraDeContexto SocketClient e_denegado La aplicación del lado del cliente esta compuesta por dos archivos MyApp. Panel panel1 = new Panel().

Autor: Luis Felipe Wanumen Silva public MyApp() { this. } public static void main(String args[]) { System.100).event. } // Cierra public void setVentana() public class EventoEnviar implements ActionListener{ public void actionPerformed(ActionEvent ev){ try{ escritura = refVenta. MyApp refVenta = null.io. f.texto.net. MyApp f = new MyApp().getText().addActionListener(objEnvio). public class Cliente{ Socket objCliente.println("Starting App"). sale. } } Archivo Cliente. DataOutputStream sale.*. Enciclopedia Conociendo 149 Curso de Jsp y Servlets . // add(texto).addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose().*. OutputStream salida. cliente.conectar().add(texto). EventoEnviar objEnvio = new EventoEnviar().out.setSize(100. f.setVisible(true). public void setVentana(MyApp ob){ refVenta = ob.java import java.exit(0).awt. import java. } }).. panel1.writeUTF(escritura). System. import java. refVenta. cliente.add(boton1).Socket.boton1.setVentana(this). panel1. String escritura = "". add(panel1).

println("Envando datos"). escritura = "Yo soy el mejor cliente". System. sale = new DataOutputStream(salida). } // Cierra public void enviandoDatos() public void enviandoFlujodeDatos(){ System.out.println("Estoy empaquetando Flujo de Datos a enviar"). } } // Cierra public void conectar() public void esperandoConfirmacionRecibidoServidor(){ System.getOutputStream().println("Mi nuevo estado es aceptado").println("Ya se envio "+escritura).out. salida = objCliente. esperandoConfirmacionRecibidoServidor().println("Estoy esperando Confirmacion de Recibido del Servidor"). } catch(Exception e){ denegado(). } // Cierra esperandoConfirmacionRecibidoServidor public void enviandoDatos(){ System.writeUTF(escritura). } // Cierra public Cliente() public void conectar(){ try{ objCliente = new Socket("orion". enviandoDatos(). enviandoFlujodeDatos().println("Ya envie una parte"). } public void aceptado(){ System.out.out.out.Autor: Luis Felipe Wanumen Silva System.out.println("Mi nuevo estado es denegado"). } // Cierra public void denegado() } // CIerra public class Cliente 150 Enciclopedia Conociendo Curso de Jsp y Servlets . sale.out. } // Cierra public void aceptado() public void denegado(){ System. aceptado(). } catch(Exception e){ } } } // Cierra class EventoEnviar public Cliente(){ objCliente = null.4000).

Observamos al pirata cuando está en el extremo de la barca La rampa se apoya sobre el muelle Si el pirata da mas de dos pasos hacia la izquierda se cae Si el pirata da mas de dos pasos hacia la derecha se cae. 10. caerá en el agua y se ahogará. este estado no permite devolverse hacia estados predecesores y el unico estado que puede ocurrir después de este es el mismo o en su defecto y por error en las comunicaciones el estado de desactivo. Cuando está a salvo no se ahoga El pirata en el barco estará a salvo. Enciclopedia Conociendo Curso de Jsp y Servlets . pero si da más de 15 pasos hacia delante estará a salvo a bordo de su barco. IMPORTANCIA DEL DIAGRAMA DE CLASES EN EL MODELAMIENTO DE UN PROGRAMA DE UN PIRATA 10. 10. Si da más de dos pasos hacia la izquierda o la derecha.1.2. • • • • • • • • • • • Un pirata ebrio se tambalea Un pirata sube por una rampa La rampa tiene cinco pasos de ancho y 15 de largo. Una vez se ha estado en este estado y se ha logrado satisfactoriamente la creación de dicho flujo se procede a estar en el estado de enviandoDatos y entonces solamente se puede pasar al estado de enviandoDatos o al estado de desactivo si algo anomalo ocurre. PLANTEAMIENTO DEL ENUNCIADO Un pirata ebrio se tambalea al subir por una rampa del muelle a su barco. Comenzamos a observar al pirata cuando está en el extremo de la rampa que se apoya sobre el muelle. Pero tan pronto se crea el socket. el programa observa si se ha recibido aceptación por parte del servidor y en este caso pasa al estado de aceptado. se ahoga Si el pirata da mas de 15 pasos hacia delante estará a salvo. ESTABLECIMIENTO DE FRASES IMPORTANTES.2.Autor: Luis Felipe Wanumen Silva 151 El primer estado es un estado desactivo el del sobket que envia.2. debido a que no se ha creado. Cuando el pirata se cae. La rampa tiene cinco pasos de ancho y 15 de largo. Después de estar en el estado de aceptado el cliente intenta construir un flujo de datos que envuelve en un objeto envoltorio para ser enviado al servidor y pasa inmediatamente al estado de enviandoFlujoDeDatos. Observese la continuidad del estado enviandoDatos.

int) : void informar_caer_al_mar: void() Enciclopedia Conociendo Curso de Jsp y Servlets . int) : boolean muelle peso_actual : int = 70 peso_cadena : String = "" informar_peso: void() rampa pos_x : int = 0 pos_y : int = 0 mensaje : String = "El Muelle Habla" validar_salida(int.2. ESTABLECIMIENDO DE CLASES pirata pos_x : int = null pos_y : int = null peso : int = 75 estado_vida : boolean = true moverse(int.Autor: Luis Felipe Wanumen Silva 152 10.2. int) : void dejarse_ahogar: void() mar ahogados : int = 0 ahogar(pirata) : void barco mensaje : String = "" salvar_pirata: void() MyApp grilla : GridLayout = new borde : BorderLayout = new paneles : panel[][] = new gp : Graphics = new actual_x : int = null actual_y : int = null superior : Panel = new arriba : Panel = new inferior : Panel = new ta : TextArea = new t1 : TextField = new IngSistemas : pirata = new Rampa : rampa = new Mar : mar = new salvado : boolean = false Barco : barco = new Muelle : muelle = new paint(Graphics) : void init() : void keyDown(Event.

Panel superior = new Panel(). boolean salvado = false.white). x++){ for(int y = 0. x<5. pirata IngSistemas = new pirata().3. PROGRAMA EN JAVA import java.1.awt. public class MyApp extends Applet { GridLayout grilla = new GridLayout(15. TextArea ta = new TextArea(5.getGraphics(). TextField t1 = new TextField("EL PIRATA PESA"). Panel inferior = new Panel(). y<15.red). if(x == actual_x && y == actual_y){ paneles[x][y].setBackground(Color.30).applet. Panel arriba = new Panel().setBackground(Color. import java. Panel paneles[][] = new Panel[5][15].*. public void paint(Graphics g) { for(int x = 0. y++){ gp[x][y] = paneles[x][y]. } else{ paneles[x][y]. int actual_x. rampa Rampa = new rampa().event. BorderLayout borde = new BorderLayout(4.awt. Graphics gp[][] = new Graphics[5][15].1).Autor: Luis Felipe Wanumen Silva 153 10. barco Barco = new barco(). actual_y. mar Mar = new mar(). } // Cierra else } // cierra for interno } // cierra for externo } // cierra paint() public class mar{ Enciclopedia Conociendo Curso de Jsp y Servlets . muelle Muelle = new muelle().4).5. import java.*.*.2.

informar_peso(). } // Cierra funcion init() public class barco{ String mensaje = "".setText(cadena). ta. superior). cadena = cadena + "\n EL MAR HABLA: \n".dejarse_ahogar().setText(mensaje). superior. setLayout(borde). arriba. x++){ for(int y = 0. IngSistemas.add(ta). } } // Cierra class barco Enciclopedia Conociendo Curso de Jsp y Servlets . mensaje = mensaje + "\n EL BARCO HABLA \n". ta.add(paneles[x][y]). inferior. } } Muelle.add(t1).5)).trim(). add("South".black). add("Center". superior. inferior).getText(). Muelle. x<5. } } // Cierra class mar public void init(){ actual_x = 2. y<15. } } for(int y = 0. y++){ paneles[x][y] = new Panel(). for(int x = 0. y<15. setBackground(Color.trim().Autor: Luis Felipe Wanumen Silva 154 public void ahogar(pirata hombre){ String cadena = ta. x<5. arriba).add("Center". cadena = cadena + "ESTOY AHOGANDO AL MUERTO".soportar_peso(IngSistemas. mensaje = mensaje + "SALVADO EL PIRATA". inferior.getText().peso). y++){ for(int x = 0. public void salvar_pirata(){ salvado = true.setLayout(grilla).setLayout(new BorderLayout(4. actual_y = 0. mensaje = ta. x++){ arriba.

tirar_al_mar(). } if(pos_x<0){ mensaje = mensaje + "Fuera ta. peso_cadena = peso_cadena + "KILOS ".getText(). String peso_cadena = "". pos_y = y. \n". peso_cadena = peso_cadena + peso_actual. DEJE CAER". del rango x". peso_cadena = peso_cadena + " ".setText(mensaje). del rango x".salvar_pirata(). Enciclopedia Conociendo Curso de Jsp y Servlets . } if(pos_y>=15){ mensaje = mensaje + "NO LO ta.setText(mensaje).setText(mensaje).setText(mensaje). } // Cierra void soportar_peso public void informar_peso(){ peso_cadena = t1. tirar_al_mar(). public void validar_salida(int x. t1.trim(). int y){ pos_x = x. } if(pos_x>=5){ mensaje = mensaje + "Fuera ta. } del rango y".setText(peso_cadena). public void soportar_peso(int valor){ peso_actual = valor. if(pos_y<0){ mensaje = mensaje + "Fuera ta. Barco. }// int informar_peso } // Cierra class muelle public class rampa{ int pos_x=0.Autor: Luis Felipe Wanumen Silva 155 public class muelle{ int peso_actual = 70. int pos_y=0. tirar_al_mar(). String mensaje = "EL MUELLE HABLA.

actual_y). break. Rampa. IngSistemas. repaint(). pos_y). IngSistemas. } // Cierra void tirar_al_mar() } // Cierra class rampa public class pirata{ int pos_x. break. public void moverse(int i. IngSistemas.estado_vida && salvado==false){ switch(key){ case Event. pos_y = j.ahogar(IngSistemas). // Kilos boolean estado_vida = true. } //Cierra void dejarse_ahogar } // Cierra clase pirata public boolean keyDown(Event evt.RIGHT: actual_x++.UP: actual_y--. repaint(). repaint(). int j){ if(estado_vida){ pos_x = i. Enciclopedia Conociendo Curso de Jsp y Servlets .validar_salida(pos_x.moverse(actual_x.LEFT: actual_x--. } // Cierra if } // Cierra moverse public void dejarse_ahogar(){ estado_vida = false. case Event. int key){ if(IngSistemas.moverse(actual_x.moverse(actual_x. int peso = 75.Autor: Luis Felipe Wanumen Silva 156 } // Cierra void validar_salida() public void tirar_al_mar(){ Mar. actual_y). actual_y). case Event. break. int pos_y.

repaint().Autor: Luis Felipe Wanumen Silva 157 } } return true. break. Enciclopedia Conociendo Curso de Jsp y Servlets . } // Cierra if externo return false. } // Cierra boolean // Cierra clase MyApp case Event. actual_y).moverse(actual_x. IngSistemas.DOWN: actual_y++.

el usuario.4. puede desplazarse mediante las teclas de dirección del teclado y de esta manera podrá mover el pirata. Esto para el caso del programa que estamos explicando indica que el pirata se encuentra en dicha posición. (que en este caso es la posición roja). Ahora bien. EJECUCIÓN DEL PROGRAMA: El programa anterior muestra una grilla en donde se encuentra una celda que tiene un color rojo a diferencia de las demás celdas.Autor: Luis Felipe Wanumen Silva 158 10. Si el usuario no lo deja desbordarse por alguna posición de la derecha o de la izquierda y llega a la posición de debajo de la figura.2. se obtiene un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .

aparecerá una pantalla similar a la siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 159 Pero si el usuario lo deja desbordarse por la derecha o por la izquierda.

Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 160 Con lo cual se indica que efectivamente se ha caido el pirata al mar y por supuesto se ha ahogado.

Autor: Luis Felipe Wanumen Silva 161 10. DIAGRAMA DE CLASE avion h : Graphics = null x : int = 150 y : int = 400 cuerpo : rectangulo = new cola : rectangulo = new ala_superior : triangulo = new ala_inferior : triangulo = new punta : triangulo = new matriz : int[][] = new int[17][4] colita : int[][] = null cuerpito : int[][] = null puntica : int[][] = null alita_arriba : int[][] = null alita_abajo : int[][] = new trompita : int[][] = new alejarse() : void ascender() devolver_grafica() : int[][] moverse() avion() rectangulo h : Graphics = null posx : int = null posy : int = null ancho : int = null alto : int = null rectangulillo : int[][] = new rectangulo() devolver_grafica: int[][]() posicion_derecha: int() posicion_superior: int() posicion_inferior: int() posicionar(rectangulo) : void actualizar_rectangulo(int int int int) : void alargar: void() adelgazar: void() triangulo posx : int = null posy : int = null posx1 : int = null posy1 : int = null posx2 : int = null posy2 : int = null pos : int[][] = new alto : int = null devolver_grafica: int[][]() ajustarse(String) : void ajustarse(String..1 MyApp tablero : canvitas = new avioncito Curso de Jsp y Servlets : avion = new MyApp() main() .3.. IMPORTANCIA DEL DIAGRAMA DE CLASES EN EL MODELAMIENTO DE UN PROGRAMA DE UN AVION 10.1 Enciclopedia Conociendo 1.3.1. rectangulo) : void triangulo() canvitas gra : Graphics = null pintar : int = 0 puntos : int = null apariciones : int = 100 referencia_avion : avion = null pintar(avion) : void paint(Graphics) : void 1.

2.java import java. Enciclopedia Conociendo Curso de Jsp y Servlets .3. int matriz[][] = new int[17][4].awt. por lo menos si asegura ser la mejor opción cuando se requieran hacer modificaciones al respecto. public class avion{ Graphics h. rectangulo cola = new rectangulo(). import java. triangulo ala_superior = new triangulo().awt. int y = 400. triangulo punta = new triangulo().*. int cuerpito[][]. triangulo ala_inferior = new triangulo(). int colita[][]. rectangulo cuerpo = new rectangulo(). A continuación se muestran pues los contenidos de cada uno de los archivos que llevan a solucionar el problema del avión. EXPLICACIÓN DE LA IMPLEMENTACIÓN La implementación del ejercicio anterior se hizo basándose en el concepto que la mejor forma para trabajar orientado a objetos es crear una clase en un archivo a medida que el programa que se va ha realizar crezca de complejidad.*.applet. Veamos pues: avion. int puntica[][].*. import java.Autor: Luis Felipe Wanumen Silva 162 10.event. En últimas ésta técnica ayuda a un buen mantenimiento de los aplicativos y aunque a nivel de máquina no siempre resulta ser la mejor opción. int x = 150.

int alita_abajo[][] = new int[3][4]. cuerpito = cuerpo.1.alto = punta.posx = x. }// Cierra ir } // Cierra void alejarse public int[][] devolver_grafica(){ // punta.alto>10){ punta.alto = 40.devolver_grafica(). i++){ for(int j = 0. ala_inferior. punta.posy = y. int trompíta[][] = new int[3][4]. cuerpo. cola.alto/2.ancho = cuerpo. }// Cierra ir } // Cierra void alejarse public void ascender(){ if(y>20){ y = y .Autor: Luis Felipe Wanumen Silva 163 int alita_arriba[][]. for(int i = 0.5.alto*6.devolver_grafica(). ala_superior.devolver_grafica().posx = punta.ajustarse("ala_inferior". i<4. j++){ Enciclopedia Conociendo Curso de Jsp y Servlets .alto. }// Cierra public avion public void alejarse(){ if(punta.posicionar(cuerpo). punta.(int)punta.alto . cuerpo. cuerpo. cuerpo).ajustarse("ala_superior".ancho. alita_arriba = ala_superior. alita_abajo = ala_inferior.posy = punta. cuerpo. colita = cola.devolver_grafica().ajustarse("punta"). j<4.posx1-cuerpo.alto = punta.devolver_grafica(). cuerpo).posy . punta. public avion(){ // Por medio de punta se establece // el tamaño del avion punta.alto = 20. puntica = punta.

} // Cierra for interno for(int k = 0. p++){ matriz[p+14][i] = alita_abajo[p][i]. k<4. }// Cierra void moverse } // Cierra class avion Enciclopedia Conociendo Curso de Jsp y Servlets . p<3. n++){ matriz[n+11][i] = alita_arriba[n][i]. } // Cierra for interno for(int p = 0. } // Cierra for interno } // Cierra for externo return matriz. m++){ matriz[m+8][i] = puntica[m][i].Autor: Luis Felipe Wanumen Silva 164 matriz[i][j] = colita[i][j]. n<3. } // Cierra devolver_grafica public void moverse(){ x = x+8. m<3. } // Cierra for interno for(int m = 0. k++){ matriz[i+4][k] = cuerpito[i][k]. } // Cierra for interno for(int n = 0.

for(int i = 0.devolver_grafica().sleep(40).yellow).gra = g. referencia_avion.drawString("ESTO ES EL CANVAS".*.awt. for(int i = 0.setColor(Color. apariciones--. 200. puntos[i][2].drawLine(puntos[i][0].setColor(Color. i++){ g. i<17. int puntos[][]. puntos[i][3]). int apariciones = 100.java import java. puntos[i][3]).alejarse().setColor(Color. puntos[i][1]. g. } // Cierra pintar public void paint(Graphics g){ this. puntos[i][2]. i++){ g. g.blue).applet.moverse().yellow).awt.blue). } // Cierra while } // Cierra public void paint } // Cierra class canvitas Enciclopedia Conociendo Curso de Jsp y Servlets .*. int pintar = 0. import java. i<17. import java.devolver_grafica(). public void pintar(avion obj_volador){ puntos = obj_volador.Autor: Luis Felipe Wanumen Silva 165 canvitas.300).*. } try{ Thread. while(apariciones>0){ referencia_avion. puntos = referencia_avion. puntos[i][1]. } setBackground(Color. avion referencia_avion.drawLine(puntos[i][0]. public class canvitas extends Canvas{ Graphics gra. repaint(). g. referencia_avion = obj_volador.ascender(). } catch(InterruptedException e){ } // Cierra catch g. referencia_avion.event.

addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(). System.exit(0). import java. public MyApp() { this.pintar(avioncito). int posx.java import java.awt. } } rectangulo.event.java import java. public class rectangulo{ Graphics h. int apariciones = 500.*.*. tablero. import java.show(). posy. public rectangulo(){ Enciclopedia Conociendo Curso de Jsp y Servlets . ancho. add(tablero). } public static void main(String args[]) { System. } }).applet. int rectangulillo[][] = new int[4][4].awt. avion avioncito = new avion().setSize(960.600).println("Starting App"). f. alto.Autor: Luis Felipe Wanumen Silva 166 MyApp. f.*.out.*. public class MyApp extends Frame { canvitas tablero = new canvitas().awt. MyApp f = new MyApp().

(rect. alto = rect.Autor: Luis Felipe Wanumen Silva 167 } // Cierra public rectangulo public int[][] devolver_grafica(){ rectangulillo[0][0] = posx.posx -ancho. rectangulillo[3][1] = posy+alto. posy+alto. posy. posx+ancho. rectangulillo[0][3] = posy. rectangulillo[3][2] = posx+ancho. posy = rect. posy. rectangulillo[0][2] = posx+ancho. posy+alto. posx = rect. rectangulillo[3][0] = posx. } // Cierra mover_derecha Enciclopedia Conociendo Curso de Jsp y Servlets . posx+ancho. rectangulillo[0][1] = posy.posy . rectangulillo[3][3] = posy+alto. } // Cierra int posicion_inferior public void posicionar(rectangulo rect){ ancho = (int)rect. rectangulillo[1][0] rectangulillo[1][1] rectangulillo[1][2] rectangulillo[1][3] rectangulillo[2][0] rectangulillo[2][1] rectangulillo[2][2] rectangulillo[2][3] = = = = = = = = posx. } // Cierra int posicion_superior public int posicion_inferior(){ return posy+alto. posx. return rectangulillo.alto). } // Cierra int[][] devolver_grafica public int posicion_derecha(){ return posx+ ancho.alto*3. } // Cierra int posicion_derecha public int posicion_superior(){ return posy.ancho/5.

int posy. int alto){ posx = x. int posx1. int posy2. int y. } // Cierra public rectangulo public void alargar(int valor){ ancho = ancho + valor. this. } // Cierra adelgargar } // Cierra class rectangulo triangulo. int alto. int posx2.java import java.ancho = ancho.alto = alto. posy = y. } // Cierra alargar public void adelgazar(int valor){ alto = alto . this.applet.Autor: Luis Felipe Wanumen Silva 168 public void actualizar_rectangulo(int x. int posy1.valor. public int[][] devolver_grafica(){ Enciclopedia Conociendo Curso de Jsp y Servlets . int ancho.*. int pos[][] = new int[3][4]. public class triangulo{ int posx.

posx2.out. posy2 = posy + (int)alto/2. posx1.equals("ala_inferior")){ Enciclopedia Conociendo Curso de Jsp y Servlets .println("posx = "+ posx ).println("posx2 = "+ posx2 ). posx = body. posx2 = body. posy2 = body.(int)alto.println("posy = "+ posy ). } }// Cierra if tipo == "punta" public void ajustarse(String tipo.(int)alto/2.out.posx + (int)body.equals("ala_superior")){ posy = body. posy1.out. posx.ancho/3.posx + (int )body. System.ancho/3 + (int)body.posx + (int)body. posy.println("posy1 = "+ posy1 ). System.posy. System. }// Cierra if tipo == "ala_superior" if(tipo.(int)alto. System. return pos. posy. posx2.body. posy1 = posy . posx1.ancho/3. posy2.out. posy1 = body.posy . } // Cierra int[][] devolver_grafica public void ajustarse(String tipo){ if(tipo. posy2.posy. rectangulo body){ if(tipo. posy1.ancho/3 + (int)body.Autor: Luis Felipe Wanumen Silva 169 pos[0][0] pos[0][1] pos[0][2] pos[0][3] pos[1][0] pos[1][1] pos[1][2] pos[1][3] pos[2][0] pos[2][1] pos[2][2] pos[2][3] = = = = = = = = = = = = posx.equals("punta")){ posx1 = posx . System.println("posx1 = "+ posx1 ). posx1 = body.out. System.alto*2.println("posy2 = "+ posy2 ).out.ancho/6. posx2 = posx .

posx = body.3.posy + body.alto.3. posy2 = body.out.alto + body.ancho/3.out. System.println("posy1 = "+ posy1). posx1 = body.posx + (int )body. System. }// Cierra if tipo == "ala_superior" } // Cierra void ajustarse public triangulo(){ } // Cierra triangulo } // Cierra class triangulo 10. System. System.posx + (int)body.ancho/3 + (int)body.out.println("ESTOY EN EL FI").posy + body.ancho/6. System.posx + (int)body.out.ancho/3. System.println("posx = "+ posx).println("posy2 = "+ posy2).out.posy + body. EJECUCIÓN DEL PROGRAMA Inicialmente el programa aparece el avión de la siguiente manera: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 170 posy = body.out. posx2 = body.alto. System.out. posy1 = body.ancho/3 + (int)body.println("posx2 = "+ posx2).println("posy = "+ posy).alto*2.println("posx1 = "+ posx1).

Autor: Luis Felipe Wanumen Silva

171

Y a medida que pasa el tiempo se va elevando el avión, tal como se muestra en la siguiente gráfica:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

172

Finalmente el avión llega a un punto en el que alcanza la altura máxima y continúa volando.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

173

11. ENVIO Y RECEPCION DE CORREO ELECTRONICO
11.1. ENVIO DE CORREO DESDE UNA INTRANET
El siguiente programa envía correo de una dirección de correo interna y valida en la intranet hacia otra dirección interna en la intranet y obviamente valida para el servidor de correo. import import import import import import import import java.awt.*; java.awt.event.*; java.io.*; java.util.*; java.net.*; javax.mail.Transport; javax.mail.*; javax.mail.internet.*;

public class MyApp extends Frame { public MyApp(){ this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); } public static String host String from String to = void main (String args[]) throws Exception { = "fenix.udistrital.edu.co"; = "lwanumen@udistrital.edu.co"; "lwanumen@udistrital.edu.co";

// Obtiene propiedades del sistema Properties props = System.getProperties(); // Configura servidor de correo props.put("mail.smtp.host", host); // Consigue la sesion Session session = Session.getDefaultInstance(props, null); // Define el mensaje MimeMessage message = new MimeMessage(session); // Relaciona mensaje con direccion email remitente Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva message.setFrom(new InternetAddress(from)); // Relaciona mensaje con direccion email destinataria message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Establece el destinatario message.setSubject("Este es el texto del asunto"); // Establece contenido del mensaje message.setText("HOLA PROFESOR WANUMEN"); // Envia el mensaje Transport.send(message); }

174

}

El anterior ejemplo no funciona desde cualquier servidor de internet ubicado en cualquier dirección de internet. Fijémonos que no requiere la contraseña o clave del correo electrónico para enviar correo.

11.2. ENVIO DE CORREO CON ARCHIVO ADJUNTO
import import import import import java.util.*; java.io.*; javax.mail.*; javax.mail.internet.*; javax.activation.*;

public class MyApp { public static void main(String[] args) { String to = "lwanumen@udistrital.edu.co"; String from = "lwanumen@udistrital.edu.co"; String host = "fenix.udistrital.edu.co"; String filename = "hola.txt"; boolean debug = true; String msgText1 = "Envio de archivos.\n"; String subject = "enviando un file"; // Crea algunas propiedades y consigue los valores // por defecto de la Sesión Properties props = System.getProperties(); props.put("mail.smtp.host", host); Session session = Session.getInstance(props, null); session.setDebug(debug); try { Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva // crea un mensaje MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); InternetAddress[] address = {new InternetAddress(to)}; msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject(subject); // crea y asigna la primera parte del mensaje MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setText(msgText1); // crea la segunda parte del mensaje MimeBodyPart mbp2 = new MimeBodyPart(); // adjunta el archive al mensaje mbp2.attachFile(filename); // crea un Multipart y adiciona las partes aqui. Multipart mp = new MimeMultipart(); mp.addBodyPart(mbp1); mp.addBodyPart(mbp2); // adiciona el Multipart al mensaje msg.setContent(mp); // asigna la fecha al encabezado msg.setSentDate(new Date()); /* * Si usted desea controlar el Content-Transfer-Encoding * del archive adjunto, ejecute las 2 líneas. Normalmente * usted nunca necesitaría hacer esto. * msg.saveChanges(); mbp2.setHeader("Content-Transfer-Encoding", "base64"); */ // envia el mensaje Transport.send(msg); } catch (MessagingException mex) { mex.printStackTrace(); Exception ex = null; if ((ex = mex.getNextException()) != null) { ex.printStackTrace(); } } catch (IOException ioex) { ioex.printStackTrace(); } } }

175

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

176

11.3. CONECTAR A SERVIDOR DE CORREO USANDO SOCKETS
Las apis que hasta el momento hemos visto lo que hacen es facilitarnos el envío de correo electrónico, pero este envío también se podría hacer usando sockets con el costo de tener que conocer a profundidad el protocolo SMTP. Un servidor de correo electrónico por lo general devuelve el código 220 que significa que el servicio de correo está arriba. El código 220 se puede consultar en el RFC siguiente: http://www.rfc-editor.org/rfc/rfc821.txt A continuación hacemos un programa que únicamente hace una conexión con un servidor de correo:
import java.io.*; import java.net.*; import java.util.*; public class Main { public Main() { try{ Socket cliente = new Socket("mail.udistrital.edu.co",25); InputStream entrada = cliente.getInputStream(); OutputStream salida = cliente.getOutputStream();
BufferedReader entra = new BufferedReader(new InputStreamReader(entrada )); PrintWriter sale = new PrintWriter(new OutputStreamWriter(salida),true );

String lee = entra.readLine(); System.out.println(lee); } catch(Exception e){ System.out.println(e.toString()); } } public static void main(String[] args) { Main programa = new Main(); } }

El programa anterior obtiene un resultado similar al siguiente: 220 mail.udistrital.edu.co ESMTP
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

177

BUILD SUCCESSFUL (total time: 0 seconds) Si el servicio no estuviera disponible el servidor habría respondido con el código de error numero 421. Observemos que en el ejemplo anterior se crean dos canales: Uno para la entrada de datos y otro para la salida de datos llamados “entrada” y “salida” respectivamente. Con el canal de entrada se crea un buffer y con el canal de salida se crea un escritor, el bufer lee con la función “readLine()” y almacena en la variable “leido”, en tanto que el escritor referenciado con la variable “sale” no se ha implementado.

11.4. ENVIANDO MENSAJES DE CORREO USANDO SOCKETS
El ejemplo anterior lo podemos seguir complementando haciendo que nuestra variable “sale” que referencia a un objeto escritor le envíe al servidor de correo quien envia el correo, a quien se le envia y el mensaje, después de lo cual se termina el envio con un punto tal como se muestra a continuación:
package javaapplication3; import java.io.*; import java.net.*; import java.util.*; public class Main { public Main() { String servidor = "mail.udistrital.edu.co"; String usuario = "lwanumen@udistrital.edu.co"; int puerto = 25; try { Socket socket = new Socket( servidor,puerto ); BufferedReader entrada = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); PrintWriter salida = new PrintWriter( new OutputStreamWriter( socket.getOutputStream() ),true ); System.out.println( entrada.readLine() ); salida.println( "mail from: "+usuario ); System.out.println( entrada.readLine() ); salida.println( "rcpt to: "+usuario ); System.out.println( entrada.readLine() ); salida.println( "data" ); System.out.println( entrada.readLine() ); String timeStamp = (new Date()).toString(); Enciclopedia Conociendo Curso de Jsp y Servlets

} } Es importante tener en cuenta que este ejercicio se puede modificar para que envíe archivos adjuntos." ).println( "Mensaje de prueba "+timeStamp ). System. Enciclopedia Conociendo Curso de Jsp y Servlets .readLine()).Autor: Luis Felipe Wanumen Silva 178 salida. y muchas otras cosas mas. } catch(Exception e){ } } public static void main(String[] args) { Main programa = new Main().println( ".out.println(entrada. salida.

FtpClient client =new FtpClient().net. Enciclopedia Conociendo Curso de Jsp y Servlets .io.toString(). sun.out.println(in. } catch (IOException e) { e. String passwd ="1234". sale. int t.co". ENVIO DE ARCHIVOS POR FTP 12. client. byte []h=new byte[100].read(h). try { client.*. lo malo del ejercicio es que muy probablemente en las siguientes versiones de java el API usada este totalmente depreciada por lo cual es bueno buscar nuevas alternativas al ejercicio. client.login(user.txt").DataInputStream.edu.*. //DataInputStream t=3Dnew h.Autor: Luis Felipe Wanumen Silva 179 12.openServer(server). FileOutputStream sale =new FileOutputStream("d:\\a. } try { TelnetInputStream in = client.read()) //System.io.io. client.TelnetInputStream.DataInput. passwd).*.net. import import import import import import java.binary().get("ftp1. java. //while(t=in.printStackTrace(). int i. CONECTARSE A SERVIDOR FTP El siguiente ejemplo muestra como conectarse a un servidor FTP.txt").1.). String user = "lwanumen". sun.ftp. public class MyApp { public static void main(String[] args) { String server ="gemini.IOException. i=in. java.udistrital.*.cd("LUCHIN").write(h).io. java.

2. 21. } }).io.simpleftp.println("valor=3D"+h).awt. Enciclopedia Conociendo Curso de Jsp y Servlets . java. // Nos conectamos a servidor FTP por puerto 21 ftp.co".connect("ftp.event.exit(0).bin().printStackTrace().out.jibble. java. ENVIAR ARCHIVOS A SERVIDOR FTP import import import import java.jibble. org.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(). } } // main } // Cierra FTP 180 Para ejecutar los ejemplos siguientes se puede descargar un jar llamado “simpleftp.cwd("javaweb"). // Establecemos el modo binario ftp. try { SimpleFTP ftp = new SimpleFTP().jar” que se puede descargar de la siguiente dirección electrónica: “http://www. "lwanumen".*. ftp. public class MyApp extends Frame { public MyApp() { this. } catch (IOException e) { e.jar” 12. System. "1234").Autor: Luis Felipe Wanumen Silva System.*.*.edu.*. // nos pasamos al directorio llamado "javaweb" // que se encuentra en el servidor FTP.awt.udistrital.org/files/simpleftp.

Autor: Luis Felipe Wanumen Silva // Subimos el archivo ftp.edu.png")).show().io. public class MyApp{ private BufferedReader lector = null.co". } catch (IOException e) { } } // Cierra public MyApp public static void main(String args[]) { System.util.out.io. java.BufferedWriter. MyApp f = new MyApp().io.BufferedInputStream. java. ftp.BufferedReader. java.io.100).io. f. // Nos desconectamos del servidor FTP.net. java.io. public MyApp(){ try{ // CREAR EL CLIENTE socket = new Socket("gemini. java. } } 181 12.udistrital. f. java. java.StringTokenizer. ftp. Socket socket = null.IOException. // CREAR EL FLUJO DE ENTRADA Y DE SALIDA lector = new BufferedReader(new Enciclopedia Conociendo Curso de Jsp y Servlets .setSize(100.FileInputStream.println("Starting App").stor(new File("hojadevida.io.disconnect().io.io.OutputStreamWriter.BufferedOutputStream.stor(new File("fotojojavida.InputStream.File.txt")). java. java. java.InputStreamReader.Socket. 21).3.io. java. por esta razon se muestra el siguiente ejemplo en el que se hace uso de sockets para conectarse con un servidor Ftp: import import import import import import import import import import import import java. private BufferedWriter escritor = null. CONECCION SERVIDOR FTP USANDO SOCKETS Es importante que el estudiante conozca los elementos de una coneccion a bajo nivel.

System.out.Autor: Luis Felipe Wanumen Silva InputStreamReader(socket. continúe").write("USER lwanumen\n"). // CAPTURAR LA RESPUESTA DEL SERVIDOR FRENTE A LA PETICION // DE ENVIO DEL PASSWORD line = lector.write("PASS LUISLUIS\n"). } // SOLICITAMOS AL SERVIDOR EL NOMBRE DEL DIRECTORIO Enciclopedia Conociendo Curso de Jsp y Servlets .startsWith("331 ")){ throw new IOException("El usuario no existe"). } // ENVIARLE EL PASSWORD DEL USUARIO escritor. // LEER DEL SERVIDOR String line = lector. necesita contraseña").readLine().getOutputStream())). escritor = new BufferedWriter(new OutputStreamWriter(socket.println(line).out.startsWith("230 ")){ throw new IOException("El password es incorrecto").getInputStream())).println("331 Usuario OK.out. escritor. } // ENVIARLE EL NOMBRE DE USUARIO escritor. } else{ System. } else{ System.println("220 Servicio preparado nuevo usuario").println("Usuario conectado. // // // if VERIFICAR LA RESPUESTA DEL SERVIDOR VERIFICAR QUE EL SERVIDOR ESTE ARRIBA Y PREPARADO PARA ACEPTAR USUARIOS (!line. escritor.out.flush(). 182 } else{ System.readLine(). // VERIFICAR QUE LA RESPUESTA DEL SERVIDOR SEA CORRECTA // Y QUE HALLA DICHO QUE EL PASSWORD ES CORRECTO if (!line. // VERIFICAR QUE LA RESPUESTA DEL SERVIDOR SEA CORRECTA // Y QUE HALLA DICHO QUE EL USUARIO EXISTE if (!line.startsWith("220 ")){ throw new IOException("recibido respuesta No conocida"). // CAPTURAR LA RESPUESTA DEL SERVIDOR FRENTE A LA PETICION // DE NOMBRE DE USUARIO line = lector.readLine().flush().

println("Ruta NO creada"). int secondQuote = line. } // SOLICITAMOS AL SERVIDOR QUE CAMBIE AL DIRECTORIO // DE TRABAJO LUCHIN escritor. // VERIFICAR QUE LA RESPUESTA DEL SERVIDOR SEA CORRECTA // Y QUE HALLA DICHO QUE SE PUDO CAMBIAR AL DIRECTORIO // LUCHIN if (!line.out.println("La acción sobre fichero SI BIEN").flush(). } Enciclopedia Conociendo { Curso de Jsp y Servlets . secondQuote). } else{ System.indexOf('\"'.readLine(). } } catch(Exception e){ System.substring(firstQuote + 1.out.flush(). // CAPTURAR LA RESPUESTA DEL SERVIDOR FRENTE A LA PETICION // DE CONOCER EL NOMBRE DEL DIRECTORIO line = lector. escritor.startsWith("250 ")){ throw new IOException("La acción sobre fichero NO BIEN").println("Ruta creada"). firstQuote + 1). } VERIFICAR QUE LA RESPUESTA DEL SERVIDOR SEA CORRECTA Y QUE HALLA DICHO QUE SE PUDO ESTABLECER UN NOMBRE DE DIRECTORIO ACTUAL (line.out. // // // if 183 } else{ System.startsWith("257 ")) { System. // CAPTURAR LA RESPUESTA DEL SERVIDOR FRENTE A LA PETICION // DE CAMBIAR AL DIRECTORIO LUCHIN line = lector.out.println(e. } } // Cierra MyApp public static void main(String args[]) MyApp f = new MyApp().toString()).out. if (secondQuote > 0) { String dir = line. escritor.readLine().Autor: Luis Felipe Wanumen Silva // DE TRABAJO escritor.write("CWD LUCHIN\n"). System.println("El directorio de trabajo es "+dir).write("PWD \n"). int firstQuote = line.indexOf('\"').

Autor: Luis Felipe Wanumen Silva } 184 Enciclopedia Conociendo Curso de Jsp y Servlets .

public interface archivoI extends Remote{ String Dev_datos(String cliente) throws dRemoteException.2.1. TRABAJANDO CON RMI 13. } Al compilarla debe salir una pantalla similar a la siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets . DESCRIPCION DE EJERCICIO 13.Autor: Luis Felipe Wanumen Silva 185 13. PRIMERO CREAMOS Y COMPILAMOS LA CLASE INTERFACE Esta clase es la que indica que métodos van a estar disponibles para el cliente. import java.rmi. es decir que métodos puede invocar el cliente.*.

import java. debe primero solicitar que el servidor le cree una instancia “archivoO” para que esta instancia lo atienda por medio de su metodo “Dev_datos()”.*.3.rmi. CREAMOS Y COMPILAMOS EL OBJETO REMOTO QUE SE VA A COMPARTIR El objeto remoto es el objeto que se va a compartir entre el cliente y el servidor.rmi. import java. En pocas palabras cuando el cliente solicite algo al servidor. } public String Dev_datos(String cliente) throws RemoteException{ return "Hola como estas".Autor: Luis Felipe Wanumen Silva 186 13. public class archivoO extends UnicastRemoteObject implements archivoI{ public archivoO() throws RemoteException{ super(). } } Al compilarlo nos debe aparecer una pantalla similar a la siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .server.*.

getSecurityManager()==null){ System.4.setSecurityManager(new RMISecurityManager()). System. } archivoO objetoRemoto = new archivoO().server.rmi. Naming. import java.objetoRemoto).*. CREAMOS LA APLICACIÓN DEL LADO DEL SERVIDOR import java. } catch(Exception e){ } } // Cierra public static void main } // Cierra public class archivoO Compilamos la aplicación del lado del servidor Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 187 13.println("Objeto remoto preparado para usarse por parte del cliente"). public class archivoS{ public static void main(String args[]){ try{ if(System.*.rebind("remotinalias".rmi.out.

SUBIR EL SERVIDOR RMI Con la instrucción start rmiregistry Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 188 13.6.5. REGISTRAR EL OBJETO REMOTO rmic archivoO 13.

hostname=127.7.policy Cliente Enciclopedia Conociendo Curso de Jsp y Servlets .hostname=athlon.Autor: Luis Felipe Wanumen Silva 189 13.6. SCRIPT PARA EJECUTAR EL CLIENTE cls path = c:\Archivos de Programa\Java\jdk1.security.security.java java -Djava.security. INVOCACION DEL CLIENTE try{ archivoI ob = (archivoI)Naming.policy=java.0.policy archivoS Tambien se puede con los commandos: java -Djava.lookup( direccion+" remotinalias " ).policy=java. obj.9.policy archivoS Start java –Djava.policy archivoS start java archivoS 13.8.policy=java. COLOCAMOS LA APLICACIÓN QUE HICIMOS EN EL SERVIDOR RMI Start –Djava.server.server.rmi.Dev_datos() } Catch(Exception e){ } 13.security.0\bin javac Cliente.policy=java.local –Djava.0.rmi.1 -Djava.paralela.

Autor: Luis Felipe Wanumen Silva 190 Enciclopedia Conociendo Curso de Jsp y Servlets .

X Instancia 2 Instancia 3 CLIENTE2 CLIENTE3 Enciclopedia Conociendo Curso de Jsp y Servlets .1. ARQUITECTURA DE LOS JAVA BEAN En EJB 2. BEAN Y JAVA BEAN 14.X EJB 2 VIVO En EJB 2. Cada instancia es visible tan solo para un cliente. EJB 1 VIVO CONTENEDOR DE BEANS EJB2.X si un EJB se saca de un contenedor de Beans.X EJB 1 MUERT O EJB 2 MUERT O Un Session Bean es un objeto que se instancia durante una sesión. no se pueden ejecutar. CONTENEDOR DE BEANS EJB2.Autor: Luis Felipe Wanumen Silva 191 14. Para otro cliente es visible otra instancia de dicho Session Bean.X los EJB tenían que estar en un contenedor de Beans. EJB SESSION Instancia 1 CLIENTE1 CONTENEDOR DE BEANS EJB2.

Autor: Luis Felipe Wanumen Silva 192 Un Session Bean esta en un contexto EJB SESSION Instancia 1 Instancia 2 Instancia 3 CLIENTE1 CONTEXTO CLIENTE2 CLIENTE3 Hay instancias locales y remotas de un Session Bean Instancia Local 1 EJB SESSION Instancia Remota 1 Instancia Local 2 CONTEXTO Instancia Remota 2 Instancia Local 3 Instancia Remota 3 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 193 Cuando el cliente accede desde el mismo contexto accede a la instancia local. tal como se muestra en el siguiente grafico: Instancia Local 1 EJB SESSION Cliente1 Local Instancia Remota 1 Instancia Local 2 Cliente2 Local CONTEXTO Instancia Remota 2 Instancia Local 3 Cliente3 Local Instancia Remota 3 Y cuando el cliente accede desde un contexto diferente accede a la instancia remota del EJB de Session. Instancia Local 1 EJB SESSION Instancia Remota 1 Instancia Local 2 Cliente1 Remoto CONTEXTO Instancia Remota 2 Instancia Local 3 Instancia Remota 3 Cliente2 Remoto Cliente3 Remoto Enciclopedia Conociendo Curso de Jsp y Servlets .

getVar() EJB SESSION stateless CONTEXTO Estado 1 Instancia Local 1 Int var = 20 Instancia Local 1 Estado 2 Instancia Local 1 Int var = 0 Cliente 1 Local x = EJBSession. No hay que manejar multiples excepciones que ha veces son innecesarias.Autor: Luis Felipe Wanumen Silva 194 Los Session Bean se pueden clasificar en Session Bean Stateless y Session Bean Statefull. Los Stateless no garantizan el almacenamiento del estado. Este comportamiento se debe a que el EJB de Session es concretamente un EJB de Session stateless y no almacena el estado.var = 20 x = EJBSession. Se pude tener un EJB desde afuera del contenedor EJB Enciclopedia Conociendo Curso de Jsp y Servlets . caso en el cual dichas modificaciones serán visibles en proximas consultas del EJB de Session statefull. tal como se muestra en la siguiente figura: 1 Cliente accede varias veces a la misma instancia Cliente 1 Local EJBSession.0 no hay que crear descriptores de despliegue No hay que crear varios metodos callbacks que muchas veces no se usan.var = 20 x = EJBSession.getVar() Estado 3 Instancia Local 1 Int var = 20 Cliente 1 Local x = EJBSession. En EJB3.getVar() Cuando el EJB de Session es de tipo statefull decimos que todas las veces que acceda el cliente 1 a la instancia local 1 el valor será el mismo siempre y cuando el valor no se modifique por un cliente.getVar() La primera vez que usa el EJB de Session el cliente 1 le coloca a la variable el valor de 20 y la segunda vez que acceda al bean es posible que se halla perdido dicho valor. Cuando se trata de Bean tipo statefull. el estado se almacena tal como muestra el diagrama siguiente: 1 Cliente accede varias veces a la misma instancia Cliente 1 Local EJBSession.getVar() EJB SESSION statefull CONTEXTO Estado 1 Instancia Local 1 Int var = 20 Instancia Local 1 Estado 2 Instancia Local 1 Int var = 20 Cliente 1 Local x = EJBSession.getVar() Estado 3 Instancia Local 1 Int var = 0 Cliente 1 Local x = EJBSession.

195 14.Autor: Luis Felipe Wanumen Silva Con EJB3.0 se trabaja programación orientada a atributos.2. BEAN TIPO MESSAGE CON JAVA En este capitulo pretendemos crear un Bean tipo Message con Netbeans Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 196 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 197 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 198 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 199 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 200 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 201 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 202 Enciclopedia Conociendo Curso de Jsp y Servlets .

} // Add business logic below. /** * * @author Luis Felipe Wanumen */ @Stateless public class NewSessionBean implements NewSessionRemote { public String getMessage() { return null. choose Tools | Templates * and open the template in the editor.Autor: Luis Felipe Wanumen Silva 203 Se genera un codigo similar al siguiente: /* * To change this template. */ package paquete1.Stateless.ejb. import javax. (Right-click in editor and choose // "Insert Code > Add Business Method" or "Web Service > Add Operation") Enciclopedia Conociendo Curso de Jsp y Servlets .

(Right-click in editor and choose // "Insert Code > Add Business Method" or "Web Service > Add Operation") } NeBeans automáticamente crea la interfaz del Bean remoto similar a la siguiente: /* * To change this template. import javax. /** * * @author Luis Felipe Wanumen */ @Remote public interface NewSessionRemote { String getMessage(). choose Tools | Templates * and open the template in the editor.ejb. } Después podemos crear un Servlet Enciclopedia Conociendo Curso de Jsp y Servlets . */ package paquete1. } // Add business logic below. */ package paquete1.Stateless. choose Tools | Templates * and open the template in the editor.ejb. import javax.Remote.Autor: Luis Felipe Wanumen Silva } Le modificamos la parte del return y nos queda algo similar al siguiente: 204 /* * To change this template. /** * * @author Luis Felipe Wanumen */ @Stateless public class NewSessionBean implements NewSessionRemote { public String getMessage() { return "Hola Bean de Mensajeria".

Autor: Luis Felipe Wanumen Silva 205 Enciclopedia Conociendo Curso de Jsp y Servlets .

ServletException.http. import javax. import javax.HttpServlet.http. import javax. /** * * @author Luis Felipe Wanumen Enciclopedia Conociendo Curso de Jsp y Servlets .EJB. */ package paquete1.TestEJBRemote.HttpServletResponse. choose Tools | Templates * and open the template in the editor.ejb. import javax.servlet. import javax.io.io.Autor: Luis Felipe Wanumen Silva 206 Obviamente para que esto funcione se tuvo que haber creado el paquete 1 previamente en la parte del proyecto war.servlet.HttpServletRequest.PrintWriter.http.servlet. // import stateless. Creamos un servlet llamado “TestServlet” con el siguiente codigo: /* * To change this template. import java.servlet.IOException. import java.

out. PrintWriter out = response.println("<title>Servlet TestServlet</title>").Autor: Luis Felipe Wanumen Silva */ public class TestServlet extends HttpServlet { //This annotation INJECTS the TestEJBRemove object from EJB //into this attribute @EJB private NewSessionRemote testEJB.charset=UTF-8"). } } 207 Al ejecutar el Bean desde el entorno de desarrollo y por medio del navegador obtenemos un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets . out. IOException { response.getWriter(). @Override protected void doGet(HttpServletRequest request.println("<body>").println("</body>").setContentType("text/html. out.println("<head>"). out.println("</html>").println("<html>").getMessage()). out.println("</head>"). out. out. out.println(testEJB. HttpServletResponse response) throws ServletException.

CREACION DE UN BEAN DE ENTIDAD CON NETBEANS Y ORACLE 10G EXPRESS CREACION DE LA BASE DE DATOS Vamos a la opción SQL: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 208 14.3.

Autor: Luis Felipe Wanumen Silva 209 Allí escogemos “Comandos SQL”: Escribimos la sentencia SQL para crear una tabla llamada “usuario”: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 210 Las columnas de la tabla creada se muestran a continuación: Columnas de Tabla Propi etario d e T abl a No mb re de la Tabla Nombre d e Colu mn a Tipo de Dato SYSTEM USUARIO CODIGO NOMBRE NUMBER VARCHAR2 Oracle crea unas columnas indices como se muestra a continuación: Columnas de Índice Usado en Plan Propi etario Nombre d e l a T abl a No mb re del Índi ce Colu mn as Uni ci dad E st ad o Tipo de Índice Unir Índ ice SYSTEM USUARIO SYS_C003994 CODIGO UNIQUE VALID NORMAL NO Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 211 CREACION DE LOS BEANS DE ENTIDAD Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 212 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 213 Crea un proyecto similar al siguiente: Creamos un paquete en la parte de los Beans: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 214 En nuestro caso se llama el paquete “paquete1”: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 215 En la carpeta “Enterprise Beans” hacemos click derecho: Y usamos el asistente para crear una clase entidad de una base de datos: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 216 Se solicita un data Source: Se dice que se va a crear un nuevo data source: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 217 A continuación se dice que se va a crear una nueva conexión: Se agrega un nuevo driver: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 218 Se seleccionan los archivos que tienen el driver: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 219 De las opciones que aparecen en Driver Class se elige la primera: Se hace click en aceptar: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 220 El host es: “localhost”: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 221 El puerto es 1521 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 222 La identificación del servicio es: “XE” Enciclopedia Conociendo Curso de Jsp y Servlets .

Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 223 El nombre de usuario es: “SYSTEM” y el password es “123456” (en nuestro caso. obviamente esto depende de la instalación).

Autor: Luis Felipe Wanumen Silva 224 Se hace click en OK: De la lista de esquemas se escoge “SYSTEM”: Enciclopedia Conociendo Curso de Jsp y Servlets .

en este caso “JNDI3” NetBeans comienza a traer las tablas.Autor: Luis Felipe Wanumen Silva 225 Se le coloca un nombre al JNDI. según el esquema de base de datos que se tiene en Oracle Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 226 Al finalizar la incorporación de datos del esquema se tiene una lista de tablas disponibles: En nuestro caso seleccionamos todas las tablas: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 227 Y hacemos click en “next”: Enciclopedia Conociendo Curso de Jsp y Servlets .

Aparece una lista de proveedores de persistencia que pueden permitir la conexión con la base de datos Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 228 Aparece un warning que indica que el proyecto no tiene una unidad de persistencia.

Autor: Luis Felipe Wanumen Silva 229 Finalmente se crea la clase tipo “Entity” en el paquete “paquete1”: Existen varios tipos de mapeo a la base de datos: Escogemos “default” Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva Existen varios tipos de colecciones y seleccionamos “Collection” 230 Seleccionamos las dos opciones de abajo: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 231 NetBeans comienza el procesamiento: Y hay que tener paciencia: Una vez terminado el proceso El crea un Bean que maneja la persistencia con la tabla “usuario”: Usuario. choose Tools | Templates Enciclopedia Conociendo Curso de Jsp y Servlets .java /* * To change this template.

import javax. import javax. query = "SELECT u FROM Usuario u WHERE u.codigo = codigo.codigo = codigo.Basic. } public BigDecimal getCodigo() { return codigo. import javax.math. length = 50) private String nombre.Entity.NamedQueries. query = "SELECT u FROM Usuario u"). } public void setCodigo(BigDecimal codigo) { this.nombre = :nombre")}) public class Usuario implements Serializable { private static final long serialVersionUID = 1L.Autor: Luis Felipe Wanumen Silva * and open the template in the editor.persistence.persistence.persistence.io. precision = 22. import java. catalog = "". import java.Id. @Id @Basic(optional = false) @Column(name = "CODIGO".persistence. import javax. query = "SELECT u FROM Usuario u WHERE u. @NamedQuery(name = "Usuario. 232 /** * * @author Luis Felipe Wanumen */ @Entity @Table(name = "USUARIO". public Usuario() { } public Usuario(BigDecimal codigo) { this.Table.findAll".findByCodigo". nullable = false.BigDecimal. scale = 0) private BigDecimal codigo.NamedQuery.persistence. @NamedQuery(name = "Usuario. */ package paquete1. import javax.persistence.Serializable. import javax.persistence.Column.findByNombre". } Enciclopedia Conociendo Curso de Jsp y Servlets .codigo = :codigo"). @Column(name = "NOMBRE". } public String getNombre() { return nombre. schema = "SYSTEM") @NamedQueries({@NamedQuery(name = "Usuario. import javax.

} @Override public boolean equals(Object object) { // TODO: Warning . } @Override public int hashCode() { int hash = 0. } Usuario other = (Usuario) object.codigo != null && ! this.nombre = nombre.Autor: Luis Felipe Wanumen Silva 233 public void setNombre(String nombre) { this.this method won't work in the case the id fields are not set if (!(object instanceof Usuario)) { return false.equals(other. } return true. } } Enciclopedia Conociendo Curso de Jsp y Servlets .codigo.codigo))) { return false. } @Override public String toString() { return "paquete1.Usuario[codigo=" + codigo + "]".codigo == null && other. return hash.codigo != null) || (this.hashCode() : 0). hash += (codigo != null ? codigo. if ((this.

EJERCICIO DE WEB SERVICE 15.Autor: Luis Felipe Wanumen Silva 234 15. CONSEGUIR EL SOFTWARE ANTES DE TRABAJAR Enciclopedia Conociendo Curso de Jsp y Servlets .1.

CONFIGURACION PREVIA DEL SERVIDOR Primero se observa que el servidor tenga correctamente configurada la tarjeta de red.2. debido a que se intenta en el ejercicio exponer un servicio web en donde un computador va a tener el servidor que hospeda el servicio web y otro equipo va a invocar dicho servicio: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 235 15.

es la sigueinte: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 236 La configuración del equipo Servidor en el que se montó el servicio web.

Autor: Luis Felipe Wanumen Silva 237 Enciclopedia Conociendo Curso de Jsp y Servlets .

transport.http.Autor: Luis Felipe Wanumen Silva 238 15. INSTALACION DEL SOFTWARE EN EL LADO DEL SERVIDOR Nos ubicamos dentro de una consola en la carpeta de instalación del AXIS y dentro del directorio de publicación.apache.3.SimpleAxisServer –p 8080 Enciclopedia Conociendo Curso de Jsp y Servlets .axis. tal como se muestra a continuación: Ejecutamos la instrucción: java org.

Autor: Luis Felipe Wanumen Silva

239

Y nos damos cuenta que el servidor de servicios ha iniciado correctamente cuando aparece una pantalla similar a la siguiente:

Es importante notar que si se tiene algún servidor por el mismo puerto el anterior pantallazo no se presenta y en cambio se podría presentar un error similar al siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

240

Otra cosa importante de notar es que el servidor de servicios no siempre debe funcionar sobre el puerto 80 o el puerto 8080, una prueba de esto se muestra a continuación:

En donde se ha iniciado el servidor por el puerto 8082 y ha funcionado correctamente.

En cuyo caso se podría comprobar con otra consola:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

241

Que en verdad se está escuchando por el puerto 8082:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

242

Pero bueno, la verdad el ejercicio se hizo por un puerto estándar como lo es el 8080.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

243

En el lado del servidor y después de haber instalado AXIS, se procede a tener en cuenta los sigueintes archivos:

C:\axis-1_4\lib\axis.jar; C:\axis-1_4\lib\axis-ant.jar; C:\axis-1_4\lib\commons-discovery-0.2.jar; C:\axis-1_4\lib\commons-logging-1.0.4.jar; C:\axis-1_4\lib\jaxrpc.jar; C:\axis-1_4\lib\log4j-1.2.8.jar; C:\axis-1_4\lib\saaj.jar; C:\axis-1_4\lib\wsdl4j-1.5.1.jar; C:\axis-1_4\lib\mail.jar; C:\axis-1_4\lib\activation.jar;

Para incluirlos dentro del CLASSPATH de la máquina, tal como se muestra a continuaciòn:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

244

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

245

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva 246 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 247 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva

248

15.4. PROBAMOS LA CONFIGURACION DEL LADO DEL SERVIDOR

Ejecutamos la siguiente instrucción:

java org.apache.axis.utils.tcpmon 9090 felipe 8080

Tal como se muestra a continuación:

Y en contados segundos aparece una pantalla similar a la siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

249

La cual comprueba que el servidor de servicios está completamente arriba. En caso que aparezca tal como se muestra a continuación:
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

250

Quiere decir que está abajo, con lo cual se debe intentar comenzarlo haciendo click en el boton “Start”

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

251

La anterior herramienta usa una maravillosa consola de administración, la cual se muestra a continuación:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

252

La cual permite crear un monitor en un determinado puerto con el fin de lograr que ésta herramienta escuche lo que se envía por dicho puerto y cada vez que el servidor o un cliente hagan una transferencia de información por dicho puerto, saldrá en la herramienta el contenido de lo que se envía y de lo que se recibe.

La herramienta también permite hacer una simulación de las conexiones y esto se hace en la parte de abajo del monitor:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

253

En este caso, configuramos 4 bytes por pausa y le colocamos un regardo de 4 milisegundos para hacer la simulación.

También probamos que aparezca una pantalla similar en nuestro browser:
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

254

Desde internet podemos ver el archivo wsdl:

Enciclopedia Conociendo

Curso de Jsp y Servlets

tal como se muestra a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets . pero también lo pudimos haber hecho con “felipe”. en el anterior caso lo hicimos con “localhost”.Autor: Luis Felipe Wanumen Silva 255 Bueno.

Autor: Luis Felipe Wanumen Silva 256 Y el archivo wsdl: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 257 Enciclopedia Conociendo Curso de Jsp y Servlets .

5. ALGUNOS PROBLEMAS QUE SE PRESENTARON FUERON: Si nos fijamos en la linea: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 258 15.

pero en sí el archivo estaba dañado. también sucedía esto porque había un archivo de configuración que estaba dañado y cada vez que se instalaba el AXIS. dicho archivo conflictivo fue: mail. debido a que el servidor si no funciona correctamente.Autor: Luis Felipe Wanumen Silva 259 Vemos que allí se muestran problemas de configuración que es necesario ajustarlos antes de continuar con el ejercicio. se copiaba. la aplicación por tanto no se verá y se tuvieron que instalar otras versiones de AXIS.jar Enciclopedia Conociendo Curso de Jsp y Servlets . que fueran compatibles.

apache.org/xml-soap" Enciclopedia Conociendo Curso de Jsp y Servlets . procedí a bajar de otro sitio el AXIS.Autor: Luis Felipe Wanumen Silva 260 Después de probar que éste era el archivo que estaba dañado. y salío un pantallazo similar al siguiente: El cual para ser didácticos se muestra a continuación: <wsdl:definitions targetNamespace="http://xml.org/axis/wsdd/" xmlns:apachesoap="http://xml.apache.

org/wsdl/soap/" xmlns:xsd="http://www. <wsdl:message name="AdminServiceRequest"> <wsdl:part element="impl:AdminService" name="part" /> </wsdl:message> Enciclopedia Conociendo Curso de Jsp y Servlets .apache.org/wsdl/" xmlns:wsdlsoap="http://schemas.4 Built on Apr 22.org/axis/wsdd/" xmlns:wsdl="http://schemas.w3.xmlsoap. 2006 (06:55:48 PDT) --> ¡Error!Referencia de hipervínculo no válida.apache. <!-WSDL created by Apache Axis version: 1. <wsdl:types> ¡Error!Referencia de hipervínculo no válida.Autor: Luis Felipe Wanumen Silva 261 xmlns:impl="http://xml.w3.org/axis/wsdd/" xmlns="http://www.apache.org/2001/XMLSchema"> ¡Error!Referencia de hipervínculo no válida. <schema targetNamespace="http://xml.org/axis/wsdd/" xmlns:intf="http://xml.xmlsoap.org/2001/XMLSchema"> <element name="AdminService" type="xsd:anyType" /> <element name="AdminServiceReturn" type="xsd:anyType" /> </schema> </wsdl:types> ¡Error!Referencia de hipervínculo no válida.

<wsdl:binding name="AdminServiceSoapBinding" type="impl:Admin"> <wsdlsoap:binding style="document" transport="http://schemas. <wsdl:message name="AdminServiceResponse"> <wsdl:part element="impl:AdminServiceReturn" name="AdminServiceReturn" /> </wsdl:message> ¡Error!Referencia de hipervínculo no válida. <wsdl:operation name="AdminService"> <wsdlsoap:operation soapAction="" /> Enciclopedia Conociendo Curso de Jsp y Servlets .org/soap/http" /> ¡Error!Referencia de hipervínculo no válida. <wsdl:portType name="Admin"> ¡Error!Referencia de hipervínculo no válida. <wsdl:operation name="AdminService"> <wsdl:input message="impl:AdminServiceRequest" name="AdminServiceRequest" /> <wsdl:output message="impl:AdminServiceResponse" name="AdminServiceResponse" /> </wsdl:operation> </wsdl:portType> ¡Error!Referencia de hipervínculo no válida.Autor: Luis Felipe Wanumen Silva 262 ¡Error!Referencia de hipervínculo no válida.xmlsoap.

<wsdl:output name="AdminServiceResponse"> <wsdlsoap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> ¡Error!Referencia de hipervínculo no válida. <wsdl:service name="AdminService"> ¡Error!Referencia de hipervínculo no válida. <wsdl:port binding="impl:AdminServiceSoapBinding" name="AdminService"> <wsdlsoap:address location="http://felipe:8080/axis/services/AdminService" /> </wsdl:port> </wsdl:service> </wsdl:definitions> Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 263 ¡Error!Referencia de hipervínculo no válida. <wsdl:input name="AdminServiceRequest"> <wsdlsoap:body use="literal" /> </wsdl:input> ¡Error!Referencia de hipervínculo no válida.

Autor: Luis Felipe Wanumen Silva 264 15.6. } } Enciclopedia Conociendo Curso de Jsp y Servlets . MONTAJE DE UN EJERCICIO SENCILLO El siguiente es el código fuente del ejercicio de servicio web que se quiere mostrar: public class HolaMundo { public String hola(String nombre) { return new String("Hola " + nombre + "!").

Autor: Luis Felipe Wanumen Silva 265 Observe que la extensión del archivo es “jws”. Enciclopedia Conociendo Curso de Jsp y Servlets .

7. la cual es una máquina con la siguiente configuración de red: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 266 15. PROBANDO EL LADO DEL CLIENTE Fisicamente el cliente se probó en una máquina conectada a "Felipe".

import org.Autor: Luis Felipe Wanumen Silva 267 Dicha máquina se llama Esmeralda y antes de probar el aplicativo.apache.axis. se procede a crear el archivo siguiente en un entorno de desarrollo: import org. primero se probó que tuviera conexión con el servidor.Service.Call.client. lo cual se hizo de la siguiente manera: Una vez ya se sabe que se tiene conexión fisica.axis.apache.client. Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 268 import org.setReturnType( XMLType.rpc.setTargetEndpointAddress( new java.ParameterMode. import javax.XSD_STRING ).getPort() + "/axis/HolaMundo. call.addParameter( "nombre". Service service = new Service().IN ).URL(endpoint) ). String endpoint = "http://felipe:" + options.xml. public class HolaMundoClient { public static void main(String [] args) throws Exception { Options options = new Options(args).encoding.apache. ParameterMode. Enciclopedia Conociendo Curso de Jsp y Servlets .net. call.createCall(). call.apache.utils.XMLType.Options.axis. import org. call.axis.jws". XMLType. Call call = (Call) service.XSD_STRING.setOperationName( "hola" ).

se verifica si el servidor de servicios osea el web service funciona correctmente. } } Y antes de ejecutar el servidor. y esto se hizo abriendo el navegador y ejecutando la linea: http://felipe:8080 lo cual se muestra a continuacion: Enciclopedia Conociendo Curso de Jsp y Servlets .invoke( new Object [] { "Pepe" }).out. System.println(ret).Autor: Luis Felipe Wanumen Silva 269 String ret = (String) call.

Autor: Luis Felipe Wanumen Silva 270 En este caso usamos "realJ" para compilar el archivo: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 271 Y adicionalmente se hicieron las referencias respectivas para incluir los paquetes necesarios para que el servicio web funcionara: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 272 El resto de referencias. se muestran a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 273 Y con el ánimo de hacer la vida bastante fácil. se usó "realJ" para la creación de un archivo con extensión ".bat" que permitiera la ejecución de dicho programa: Enciclopedia Conociendo Curso de Jsp y Servlets .

en este caso: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 274 Esta opción solicita un nombre para un archivo bat.

se llama: "HolaMundoClient". el cual se muestra a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 275 El nombre del archivo bat.

Autor: Luis Felipe Wanumen Silva 276 Y cuyo contenido es el siguiente: A este archivo hizo falta agregarle el puerto y esto se hace a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 277 El cual se guarda y se ejecuta tal como se muestra a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets .

en este caso desde "realJ".Autor: Luis Felipe Wanumen Silva 278 Y para comprobar que la cuestión anda bien. dando el resultado mostrado a continuaciòn: Enciclopedia Conociendo Curso de Jsp y Servlets . también se ejecutó desde la propia herramienta de desarrollo.

java En una carpeta denominada Cliente.8.bat HolaMundoClient.java HolaMundoClient.class HolaMundoClient.Autor: Luis Felipe Wanumen Silva 279 15. tal como se muestra a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets . MANUAL DE INSTALACIÓN: Copie los archivos: HolaMundoClient.jpr MyApp.

Autor: Luis Felipe Wanumen Silva 280 Abra una consola: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 281 Ubiquese en la carpeta Cliente que se acabò de crear: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva

282

Desde allì ejecute el aplicativo:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

283

Observe que lo puede ejecutar sin necesidad de tantos comandos, simplemente ejecutando el ".bat".

Obviamente para lograr que esta ejecución se realice de la mejor forma, se debe tener cuidado que los archivos

axis.jar axis-ant.jar commons-discovery-0.2.jar commons-logging-1.0.4.jar
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

284

jaxrpc.jar log4j-1.2.8.jar saaj.jar wsdl4j-1.5.1.jar

Se encuentren dentro de un directorio en el raiz, denominado "lib", tal como se muestra a continuación:

También se debe verificar que el cliente tenga una máquina virtual apropiada y esto se puede hacer con el comando java - version.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

285

En este caso se ha probado tal como muestra a continuación:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

286

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

287

15.9. CARACTERÍSTICAS TÉCNICAS DONDE EJECUTO EL CLIENTE
El equipo cliente en el que se ha probado el servicio web, tiene la siguiente configuración:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

288

16. FRAMEWORKS PARA REALIZAR PRUEBAS
Las pruebas de una aplicativo son uno de los insumos más importantes a la hora de decidir si se implementa el aplicativo o no. Realmente probar cada modulo de un programa se denomina hacer pruebas unitarias.

16.1. FUNCIONAMIENTO DE JUNIT
En el caso de Junit se hacen pruebas por clase, es decir que a cada clase se le hace su prueba unitaria. Para cada clase creamos una clase de caso de prueba, lo cual gráficamente puede verse como se muestra en el siguiente diagrama: Casos de prueba para cada una de las clases

Caso de prueba para Clase 1

Caso de prueba para Clase 2

Caso de prueba para Clase 3

Caso de prueba para Clase 4

Caso de prueba para Clase 1

Clase 1

Clase 2

Clase 3

Clase 4

Clase 1

Clases de la aplicación que deseamos hacerles las pruebas unitarias

Los casos de prueba pueden agruparse según su funcionalidad en suites de prueba (test suite), lo cual gráficamente puede verse como se muestra a continuación:

Suites de prueba según funcionalidad 1

Suites de prueba según funcionalidad 2

Suites de prueba según funcionalidad 3

Caso de prueba para Clase 1

Caso de prueba para Clase 2

Caso de prueba para Clase 3

Caso de prueba para Clase 7

Caso de prueba para Clase 3

Caso de prueba para Clase 7

Enciclopedia Conociendo

Curso de Jsp y Servlets

Enciclopedia Conociendo Curso de Jsp y Servlets . } } // Cierra class Nodo Y ahora si la clase “Lista” propiamente dicha que contiene el siguiente código: Lista. debido a que permite aplicar todo un subárbol o un árbol a un conjunto de clases. los cuales tienen la estructura determinada por la siguiente clase: Nodo.Autor: Luis Felipe Wanumen Silva 289 Podemos seguir agrupando suites de prueba en suites de prueba con lo cual tenemos una estructura similar a la siguiente: Suites de prueba según funcionalidad A Suites de prueba según funcionalidad B Suites de prueba según funcionalidad 1 Suites de prueba según funcionalidad 2 Suites de prueba según funcionalidad 3 Caso de prueba para Clase 1 Caso de prueba para Clase 2 Caso de prueba para Clase 3 Caso de prueba para Clase 7 Caso de prueba para Clase 3 Caso de prueba para Clase 7 Con lo cual vemos que las suites de prueba se organizan en forma de árbol y cuando aplicamos una suite de pruebas ejecutamos las suites de pruebas que se encuentran dentro de esta suite de prueba.java public class Nodo{ Nodo siguiente.*. 16.awt.2.*. public Nodo(){ siguiente = null. CONSTRUCCION DE LA CLASE QUE VAMOS A PROBAR Vamos a construir una clase denominada “Lista” que va a contener elementos de tipo Nodo. import java.java import java.awt. int valor.event. Obviamente esto permite acelerar el proceso de testeo de aplicaciones.

nuevo. } antes = despues. } // Cierra while } // Cierra else externo return buscado. } // Cierra if externo else{ Nodo correr = cabeza. } // Cierra while interno antes. break. public void ingresarNodo(int valor){ boolean encontrado = buscarNodo(valor). siempre lo dejara al // final de la lista el ultimo elemento // ingresado.siguiente = nuevo. } else{ Nodo antes = cabeza. Nodo despues = cabeza. Nodo ultimo = null. if(cabeza==null){ cabeza = nuevo. } // Cierra boolean buscarNodo // Ingresa elementos a la lista sin importar // si los elementos ya se encuentran.valor==valor){ buscado = true.siguiente. } // else interno } // Entra al if cuando no existe Enciclopedia Conociendo Curso de Jsp y Servlets . if(!encontrado){ Nodo nuevo = new Nodo(). tampoco // importa el orden. } correr = correr.siguiente = despues.siguiente. nuevo.valor = valor.valor>valor){ break. despues = despues. if(cabeza==null){ return buscado. ultimo = nuevo. public boolean buscarNodo(int valor){ boolean buscado = false.Autor: Luis Felipe Wanumen Silva 290 public class Lista{ Nodo cabeza = null. while(correr!=null){ if(correr. while(despues!=null){ if(despues.

} corre = corre. Nodo correr2 = objeto. } } // Cierra while if(correr2!=null){ retornar = false. while(correr!=null){ cadena = cadena + correr.Autor: Luis Felipe Wanumen Silva } // Cierra void ingresarNodo() public String getListado(){ Nodo correr = cabeza. } correr1 = correr1.valor){ retornar = false. } if(correr1!=null && correr2==null){ retornar = false.valor!=correr2. while(corre!=null){ if(corre. // Nodo correr2 = objeto. while(correr1!=null){ if(correr1. } return retornar. correr2 = correr2.siguiente==null){ ultimo = corre. correr = correr. if(correr1==null && correr2!=null){ retornar = false.siguiente.siguiente. Nodo corre = cabeza.siguiente.cabeza. } // Cierra boolean comparar } // Cierra class Lista 291 Enciclopedia Conociendo Curso de Jsp y Servlets .siguiente. cadena = cadena + " ". } // Cierra if externo return false.cabeza. } // Cierra while }// Cierra public MyApp() public boolean comparar(Lista objeto){ boolean retornar=true. if(objeto!=null){ Nodo correr1 = cabeza.siguiente. } // Cierra String imprimirLista() public Lista(Nodo nodin){ cabeza = nodin.valor. } // Cierra while return cadena. String cadena = "".

debido a que es con la invocación de este método que vamos a comparar dos listas. es porque existe por lo menos un primer elemento “cabeza” que se debe almacenar en mencionada lista. el método retorna “false” en caso que no exista coincidencia alguna. Dicho método verifica que no existan elementos en la lista mediante la invocación del método “boolean buscarNodo(int valor)”.Autor: Luis Felipe Wanumen Silva 292 Realmente el objetivo de la creación de la clase anterior es tener una clase que permita adicionar elementos a la lista. teniendo en cuenta que el comienzo de la lista esta referenciado por una variable llamada “cabeza”.framework. una que se construye manualmente y otra que se construye invocando el método “ingresarNodo(int)” de la clase “Lista”. Esta ultima parte se explicara con detalle cuando se este explicando el testeo de la aplicación. el cual retorna “true” cuando existe en la lista un Nodo cuyo valor es igual al solicitado.3. ni es necesario para que funcione la inserción. El amigo lector / estudiante se estará preguntando: ¿Por qué incluir mas métodos si solamente se va a probar el método “ingresarNodo(int)”?. tal como se muestra a continuación: public ListaTest(String nombre){ super(nombre). También es importante mencionar que nuestra clase de prueba debe extender de la clase “TestCase” tal como se muestra a continuación: public class ListaTest extends TestCase{ } Otra cuestión importante de mencionar es que el constructor de la clase “ListaTest” debe recibir un “String” como parámetro. La respuesta es bien sencilla: “Se requieren otros métodos para que Junit logre probar correctamente el método ingresarNodo(int) y también se requieren otros métodos para que en si el método funcione”. CONSTRUCCION DE CASO DE PRUEBA PARA CLASE LISTA Ha llegado el momento de crear nuestro caso de prueba para la clase que anteriormente denominábamos “Lista”. El constructor de la clase “Lista” es necesario simplemente para garantizar que cuando se cree una lista. Finalmente decimos que la clase “Lista” tiene un método llamado “boolean comparar(Lista objeto)” y este método es necesario para que funcione Junit. para ello comenzamos diciendo que debemos usar el paquete “framework” como se muestra a continuación: import junit. De otra parte el método “boolean buscarNodo(int valor)” es necesario para que funcione el método “ingresarNodo(int)”. La lista permite el ingreso de elementos en forma ordenada y ascendente según el valor contenido en la variable “valor” de cada Nodo.*. } // Cierra constructor ListaTest() Enciclopedia Conociendo Curso de Jsp y Servlets . Detalladamente podemos decir que el método “String getListado()” se coloco como un ejercicio suelto porque ni es necesario para que funcione Junit. La inserción de elementos en la lista se hace con el método “ingresarNodo(int)”. 16.

nodo2Lista1.ingresarNodo(nodo5Lista2.ingresarNodo(nodo1Lista2. listaPROBANO.Autor: Luis Felipe Wanumen Silva 293 Ahora creamos un método llamado “testIngresarNodo()” con el que probaremos el método “ingresarNodo(int)” de la clase “Lista”. Ahora bien.ingresarNodo(nodo2Lista2. final static Nodo nodo4Lista2 = new Nodo(). Nodo(). final static Nodo nodo2Lista2 = new Nodo(). Nodo().siguiente = nodo2Lista1.valor nodo3Lista2.valor). listaPROBANO.valor = = = = = 1.valor nodo5Lista2. final static Nodo nodo5Lista2 = new Nodo(). vamos a proceder a realizar una lista que con seguridad sabemos que forma tiene. listaPROBANO.valor). 4. final final final final final static static static static static Nodo Nodo Nodo Nodo Nodo nodo1Lista1 nodo2Lista1 nodo3Lista1 nodo4Lista1 nodo5Lista1 = = = = = new new new new new Nodo(). Les asignamos unos valores: nodo1Lista2. 2.valor nodo4Lista2. listaPROBANO. 5. Se supone que si el método funciona como debe funcionar correctamente la lista tendría los siguientes nodos: 1 2 3 4 5 listaPROBANO Recordemos que esto debería funcionar debido a que en teoria el metodo “ingresarNodo(int)” ingresa elementos siempre y cuando no existan y los va ingresando en forma ordenada ascendentemente.valor nodo2Lista2. Nodo().siguiente = nodo3Lista1.siguiente = nodo4Lista1. Y la enlazamos manualmente tal como se muestra a continuación: nodo1Lista1. Enciclopedia Conociendo Curso de Jsp y Servlets . final static Nodo nodo3Lista2 = new Nodo().valor). nodo3Lista1.ingresarNodo(nodo4Lista2.valor). listaPROBANO. Nodo(). Creamos manualmente 5 nodos con el estereotipo “static”: final static Nodo nodo1Lista2 = new Nodo(). Los ingresamos a la lista usando el metodo “ingresarNodo(int)”: Lista listaPROBANO = new Lista(nodo1Lista2).valor). debido a que se ha hecho en forma manual: Lista listaBIEN = new Lista(nodo1Lista1). Veamos entonces detenidamente como es que funciona el método para el testeo. 3.ingresarNodo(nodo3Lista2.

valor nodo2Lista1.siguiente = nodo5Lista1.siguiente nodo2Lista1.framework.siguiente nodo4Lista1. 5. Observemos también que con esta forma de hacer pruebas uno puede definir manualmente los objetos que producen los métodos que se van a probar y luego al ser comparados con los verdaderos objetos que retorna la ejecución de estos métodos podremos saber si realmente funcionan nuestros métodos como lo esperábamos. public class ListaTest extends TestCase{ final final final final final final final final final final static static static static static static static static static static Nodo Nodo Nodo Nodo Nodo Nodo Nodo Nodo Nodo Nodo nodo1Lista1 nodo2Lista1 nodo3Lista1 nodo4Lista1 nodo5Lista1 nodo1Lista2 nodo2Lista2 nodo3Lista2 nodo4Lista2 nodo5Lista2 = = = = = = = = = = new new new new new new new new new new Nodo(). nodo3Lista1. Nodo(). 2. . 2. Junit se encargara automáticamente de verificar que el método funcione como queremos que funcione.valor nodo4Lista2. Nodo().siguiente nodo3Lista1. Nodo(). public void testIngresarNodos(){ nodo1Lista1.valor nodo1Lista2. Nodo().Autor: Luis Felipe Wanumen Silva nodo4Lista1. Veamos pues el código completo de nuestra clase de testeo: ListaTest. Nodo().valor Enciclopedia Conociendo = = = = = = = = = 1.java import junit. Obviamente tenemos gráficamente una lista similar a la siguiente: 1 2 3 4 5 listaBIEN 294 Las comparamos e informamos a Junit el resultado de dicha comparación invocando el método “assertTrue(boolean x)”. 5. Nodo(). 3.valor nodo4Lista1. Curso de Jsp y Servlets = = = = nodo2Lista1. 3.*. Nodo().valor nodo5Lista1.valor nodo2Lista2.valor nodo3Lista2. Nodo(). nodo4Lista1. 1. Nodo().siguiente nodo1Lista1.valor nodo3Lista1. 4. nodo5Lista1.

listaPROBANO. import java. listaPROBANO. public class MyApp{ public static void main (String[] args) { String[] nombresTest = {ListaTest. también hemos creado la clase que hace la prueba y nos vamos a disponer a realizar un programa principal que dispare la ejecución del framework junit.Autor: Luis Felipe Wanumen Silva nodo5Lista2.5. 16.class. Lista listaPROBANO = new Lista(nodo1Lista2).valor = 4.event.valor). EJECUCION DEL TESTRUNNER Al ejecutar el anterior programa tenemos un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .ingresarNodo(nodo2Lista2.TestRunner. } } // Cierra class MyApp El anterior programa lo que hace es ejecutar la herramienta “TestRunner” que usa a la clase “ListaTest” para probar la clase “Lista”.valor).valor).swingui.valor).ingresarNodo(nodo5Lista2.awt. listaPROBANO.ingresarNodo(nodo4Lista2. Lista listaBIEN = new Lista(nodo1Lista1).java import java.4.*.ingresarNodo(nodo1Lista2.valor).getName()}.main(nombresTest). assertTrue(listaBIEN. } // Cierra void testIngresarNodos() public ListaTest(String nombre){ super(nombre). listaPROBANO. ELABORACION DEL PROGRAMA QUE EJECUTA LA PRUEBA Ya hemos creado la clase que vamos a probar. listaPROBANO.comparar(listaPROBANO)). junit. } // Cierra constructor ListaTest() } // Cierra class ListaTest 295 16. dicho programa es el siguiente: MyApp.awt.*.ingresarNodo(nodo3Lista2.

Autor: Luis Felipe Wanumen Silva 296 En donde podemos escoger la ficha que muestra el árbol de pruebas. el cual nos presenta una interfaz similar a la siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .

public class Lista{ Nodo cabeza = null. import java.java import java. } // Cierra if externo else{ Nodo correr = cabeza. if(cabeza==null){ return buscado.awt. Enciclopedia Conociendo Curso de Jsp y Servlets .*.event. Nodo ultimo = null.Autor: Luis Felipe Wanumen Silva 297 Observamos pues que para nuestro ejercicio el metodo “testIngresarNodos” responde satisfactorio en la ejecución de las pruebas.awt. public boolean buscarNodo(int valor){ boolean buscado = false.*. Para comprobar que esto realmente es cierto vamos a modificar la clase “Lista” y la dejaremos tal como se muestra a continuación: Lista.

siguiente = nuevo. // antes = despues. break. ultimo = nuevo. nuevo. tampoco // importa el orden. } // else interno } // Entra al if cuando no existe } // Cierra void ingresarNodo() public String getListado(){ Nodo correr = cabeza. String cadena = "". cadena = cadena + " ".valor>valor){ break.siguiente. if(!encontrado){ Nodo nuevo = new Nodo(). while(despues!=null){ if(despues. } // Cierra while interno antes. } // Cierra boolean buscarNodo // Ingresa elementos a la lista sin importar // si los elementos ya se encuentran.Autor: Luis Felipe Wanumen Silva while(correr!=null){ if(correr. siempre lo dejara al // final de la lista el ultimo elemento // ingresado.siguiente.valor. } // Cierra while } // Cierra else externo return buscado.siguiente = despues. Nodo despues = cabeza.valor = valor. if(cabeza==null){ cabeza = nuevo.valor==valor){ buscado = true. } else{ Nodo antes = cabeza. } correr = correr. despues = despues. Enciclopedia Conociendo 298 Curso de Jsp y Servlets . public void ingresarNodo(int valor){ boolean encontrado = buscarNodo(valor). } // LO DEJAMOS EN COMENTARIO PARA // QUE ESTO INTENCIONALMENTE FUNCIONE // MAL Y PROVOQUE QUE EL JUNIT // INFORME DE UN ERROR POR AQUI. nuevo. while(correr!=null){ cadena = cadena + correr.

} if(correr1!=null && correr2==null){ retornar = false.siguiente. } // Cierra while return cadena.cabeza. correr2 = correr2. while(corre!=null){ if(corre. } correr1 = correr1. } // Cierra boolean comparar } // Cierra class Lista Al ejecutar el Junit con este error.valor){ retornar = false.siguiente. Nodo correr2 = objeto. } corre = corre. } } // Cierra while if(correr2!=null){ retornar = false. if(correr1==null && correr2!=null){ retornar = false. } return retornar. tenemos un pantallaza similar al siguiente: 299 Enciclopedia Conociendo Curso de Jsp y Servlets . while(correr1!=null){ if(correr1. Nodo corre = cabeza. // Nodo correr2 = objeto.siguiente.Autor: Luis Felipe Wanumen Silva correr = correr. } // Cierra String imprimirLista() public Lista(Nodo nodin){ cabeza = nodin.siguiente.siguiente. } // Cierra if externo return false.siguiente==null){ ultimo = corre.valor!=correr2. if(objeto!=null){ Nodo correr1 = cabeza.cabeza. } // Cierra while }// Cierra public MyApp() public boolean comparar(Lista objeto){ boolean retornar=true.

se muestran a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 300 Los otros errores que se muestran en la caja de abajo.

Autor: Luis Felipe Wanumen Silva 301 Enciclopedia Conociendo Curso de Jsp y Servlets .

PINTAR MEDIA PANTALLA CON UN LIENZO Importante decir que las aplicaciones principales que se pueden hacer en dispositivos ligeros se llaman “MIDLET”.setCurrent(canvas). import javax. 0.*. g. en un “MIDLET” se deben encontrar obligatoriamente los métodos public void startApp() public void pauseApp() public void destroyApp(boolean unconditional) los cuales están íntimamente ligados con los estados de un “MIDLET” que son: METODO public void startApp() public void pauseApp() public void destroyApp(boolean unconditional) ESTADO DEL MIDLET Activo Parado Destruido En el siguiente programa se tiene un MIDLET básico: import javax.microedition. 255).*. 0. g. getHeight()).microedition.fillRect(0. } public void pauseApp() { } public void destroyApp(boolean unconditional) { } class MiTablero extends Canvas { public void paint(Graphics g){ // Establece color a AZUL g. g. INTRODUCCION A LAS APLICACIONES MOVILES 17.getDisplay(this). public class Celular1 extends MIDlet { public Celular1() { // constructor } public void startApp() { Canvas canvas = new MiTablero().LEFT).1.Autor: Luis Felipe Wanumen Silva 302 17.lcdui. 0.drawString("Pantallazo 1".TOP | g.setColor(0. 0.midlet. display. y se podría decir que los “MIDLETs” son aplicaciones que corren en dichos dispositivos. Ahora bien. (int)(getWidth()/2). } } Enciclopedia Conociendo Curso de Jsp y Servlets . Display display = Display.

setCurrent(canvas). (int)(getWidth()/2). “Es como hacer un applet y colocarlo como un lienzo en la pantalla del dispositivo ligero”. Esto es una idea intuitiva que ayuda a comprender el funcionamiento de los lienzos en Java. g. a continuación se hace un rectángulo rellenado de color azul. En este caso este lienzo define el modo grafico en color azul. 0. En la siguiente tabla se aclaran cuales son las instrucciones del anterior programa que hacen cada una de las acciones mencionadas: ACCION Se obtiene una referencia al dispositivo de pantalla físico.drawString("Pantallazo 1". display. diremos que se comporta como un applet y por tanto tiene los métodos normales de un applet. = Hay que tener en cuenta que el MIDLET del que estamos hablando también define otro método que se llama “Celular1()”.TOP | g. 0. g. Finalmente el MIDLET que estamos estudiando tiene una clase interna que tiene el siguiente código: class MiTablero extends Canvas { public void paint(Graphics g){ // Establece color a AZUL g. el cual ocupa la mitad de la pantalla del dispositivo ligero y finalmente se coloca un letrero en color azul que dice “Pantallaza 1” con lo cual la ejecución del programa anterior produce unos resultados gráficos similares a los siguientes: Enciclopedia Conociendo Curso de Jsp y Servlets . Se crean los objetos que se quieren colocar en la pantalla. pero el único método de estos tres que tiene código es el “startApp()” el cual coloca un lienzo e la pantalla del dispositivo ligero. 0. Usando la referencia al dispositivo ligero se colocan los objetos previamente creados. Display display Display.fillRect(0.Autor: Luis Felipe Wanumen Silva } 303 En el cual la clase que extiende de MIDLET se llama “Celular1” y contiene los tres métodos que gestionan el estado del MIDLET. } } Esta clase es similar a un applet y para los amigos familiarizados con Java. razón por la cual en este momento tan solo nos limitaremos a decir que es el método constructor del MIDLET. La forma de colocar elementos en un dispositivo ligero esta dada por los siguientes pasos: • • • Se obtiene una referencia al dispositivo de pantalla físico. pero este método no hace labor alguna. 0. 255).LEFT). Se crean los objetos que se quieren colocar en la pantalla.setColor(0. g. de tal forma que las siguientes cosas que pinte se pintaran de color azul. CODIGO Canvas canvas = new MiTablero(). Usando la referencia al dispositivo ligero se colocan los objetos previamente creados. getHeight()).getDisplay(this).

Autor: Luis Felipe Wanumen Silva 304 La pregunta es: ¿Por qué no aparece el letrero: “Pantallaza 1”?. la respuesta es: porque esta del mismo color del fondo. con lo cual se hace necesario hacer la modificación que a continuación se muestra: public void paint(Graphics g){ // Establece color a AZUL Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva g.LEFT). 0.TOP | g. getHeight()).fillRect(0. 255). 0. 255). 0.setColor(0. (int)(getWidth()/2).setColor(0.drawString("Pantallazo 1". g. g. 255. } Con lo cual se tiene un resultado grafico similar al siguiente: 305 Enciclopedia Conociendo Curso de Jsp y Servlets . 0. g. g.

Autor: Luis Felipe Wanumen Silva 306 Enciclopedia Conociendo Curso de Jsp y Servlets .

setCurrent(pizarra2). 0. 255).microedition.setColor(255.Autor: Luis Felipe Wanumen Silva 307 17.*. g.fillRect(0.fillRect((int)(getWidth()/2). 255. g. COLOCAR DOS LIENZOS En forma análoga al ejercicio.setColor(0. } // Cierra void paint() } // Cierra class Tablero1 } // Cierra class Celular1 Enciclopedia Conociendo Curso de Jsp y Servlets . Display display = Display. g.TOP | g.lcdui.setColor(0. public class Celular1 extends MIDlet { public Celular1() { // constructor } public void startApp() { Canvas pizarra1 = new Tablero1().*. display. } // Cierra void paint() } // Cierra class Tablero1 class Tablero2 extends Canvas{ public void paint(Graphics g){ // Establece color a VERDE g. g.TOP | g. 0). 255).drawString("Pantallazo 1". getHeight()). 255. (int)(getWidth()/2). 0. 0. Canvas pizarra2 = new Tablero2().microedition.setColor(0. 0). display.getDisplay(this). // Establece color azul verdoso g.setCurrent(pizarra1).LEFT). 0.2. getHeight()). (int)(getWidth()/2). 0. g. // Establece color azul verdoso g.drawString("Pantallazo 1". g. solamente tendríamos que hacer añadir otro lienzo y cambiar las posiciones de cada lienzo en donde se van a colocar y los colores de los letreros que se mostraran tal como muestra el programa siguiente: Para obtener un resultado similar al siguiente: import javax.midlet. 0. } public void pauseApp() { } public void destroyApp(boolean unconditional) { } class Tablero1 extends Canvas{ public void paint(Graphics g){ // Establece color a AZUL g.getWidth() . 0.LEFT). import javax.

Autor: Luis Felipe Wanumen Silva El cual gráficamente puede ser visualizado de la siguiente manera: 308 Enciclopedia Conociendo Curso de Jsp y Servlets .

setColor(255. Canvas pizarra2 = new Tablero2(). (int) (getHeight()/4)). } // Cierra void paint() } // Cierra class Tablero1 class Tablero2 extends Canvas{ public void paint(Graphics g){ // Establece color a AZUL g. } // Cierra void paint() } // Cierra class Tablero2 class Tablero3 extends Canvas{ public void paint(Graphics g){ // Establece color a ROJO g.fillRect(0. Display display = Display.midlet. Canvas pizarra3 = new Tablero3(). (int)(3*getHeight()/4).setCurrent(pizarra1).0). (int) (getHeight()/4)).setColor(255. que a continuación se muestra un programa que pinta la bandera de “Colombia” (el país de donde es el autor del documento): import javax. 0). display. 0.setColor(0.setCurrent(pizarra2). g.microedition.3. display. getWidth().setCurrent(pizarra3).Autor: Luis Felipe Wanumen Silva 309 17.getWidth() .255. 0. import javax.lcdui. (int)(2*getHeight()/4).getDisplay(this). } // Cierra void paint() Enciclopedia Conociendo Curso de Jsp y Servlets .microedition. g.fillRect(0. display. g. 0.*.getWidth() . es por esta razón. (int)(getHeight()/2)). sino solamente rectángulos.fillRect(0. public class Celular1 extends MIDlet { public Celular1() { // constructor } public void startApp() { Canvas pizarra1 = new Tablero1(). } public void pauseApp() { } public void destroyApp(boolean unconditional) { } class Tablero1 extends Canvas{ public void paint(Graphics g){ // Establece color a AMARILLO g. PINTAR LA BANDERA DE COLOMBIA Una de las figuras que más fácil se pueden pintar en los dispositivos ligeros son las banderas que no tienen figuras raras.*. 255).

Autor: Luis Felipe Wanumen Silva } // Cierra class Tablero3 } // Cierra class Celular1 El cual genera el siguiente resultado: 310 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 311 Enciclopedia Conociendo Curso de Jsp y Servlets .

public class Celular1 extends MIDlet{ Display display. display. que equivalen a las ventanas Windows (“por hacer una comparación”). COLOCAR UNA FORMA EN LA PANTALLA En los dispositivos ligeros también se pueden colocar formas. En esta ocasión vamos a colocar una forma al interior de una aplicación J2ME. } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } // Cierra class Celular1 La visualización de esta aplicación en el emulador de Nokia produce un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 312 17.4.microedition. } // Cierra public Celular1 public void startApp() { display = Display.lcdui.getDisplay(this). Veamos pues. Form forma. import javax.setCurrent(forma).midlet.*.microedition.*. detenidamente el siguiente código: import javax. public Celular1() { // constructor forma = new Form("Primer forma").

Autor: Luis Felipe Wanumen Silva 313 De tal forma que cuando seleccionamos la aplicación el dispositivo nos muestra la forma que hemos tal como se muestra a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets .

setCurrent(forma). Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 314 Observe amigo lector / estudiante que si no hubiera sido por la instrucción siguiente: display.

display.microedition. } // Cierra public Celular1 public void startApp() { display = Display.microedition.*. import javax. Form forma. public class Celular1 extends MIDlet{ Display display. podemos usar el código del ejercicio anterior para añadir un StringItem a la forma creada en mencionado ejercicio.setCurrent(forma). } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } // Cierra class Celular1 Y gráficamente los resultados se pueden observar a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 315 no se habría podido producir este efecto y tan solo se hubiera visto el nombre de la aplicación.5. AÑADIR UN STRING A UNA FORMA Continuando con el ejemplo anterior. Con lo cual podemos obtener un código fuente similar al siguiente: import javax.midlet. 17. cadena1 = new StringItem("".append(cadena1). forma. StringItem cadena1.getDisplay(this).*.lcdui. public Celular1() { // constructor forma = new Form("Primer forma"). pero no se habría podido ver el efecto descrito en este ultimo pantallaza."Cad1").

Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 316 Observe amigo lector / estudiante que el objeto StringItem no se puede modificar.

addCommand(uno).Autor: Luis Felipe Wanumen Silva 317 17.2). “dos” y “tres” son comandos que fueron definidos tal como se muestra a continuación: uno = new Command("UNO".Command. Es importante notar que hasta ahora se han definido las opciones del menú. tal como se muestra a continuación: forma. se le asigne el valor “1” al StringItem que hemos definido en la seccion anterior.Command. forma. Para llevar a cabo la asociación de eventos a los anteriores comandos.addCommand(dos).SCREEN. se ejecutan las siguientes instrucciones: forma. Para llevar a cabo esta tarea se deben adicionar a la forma tres elementos de tipo “Command”.1). en donde “uno”. forma. en donde el objeto que implementa el método “commandAction” en este caso es el mismo MIDLET actual: public void commandAction(Command c. Esto se hace con la instrucción: forma. pero no se han asociado eventos a cada una de estas opciones.addCommand(uno). forma. en el cual tengamos las opciones siguientes: UNO DOS TRES De tal manera que cuando el usuario seleccione la opción “UNO”.6.3). Con lo cual los comandos están asociados a la “forma”.Command. } if(c==dos){ Enciclopedia Conociendo Curso de Jsp y Servlets . dos = new Command("DOS". pero a parte de esta asociación se hace necesario que la “forma” tenga un oyente que este pendiente cuando se active cualquier evento sobre la forma y evalué en el método “commandAction” que tipo de evento de los anteriormente creados fue el que ocurrió.setText("1").Displayable d){ if(c==uno){ cadena1.addCommand(tres).addCommand(tres). tres = new Command("TRES".SCREEN.Displayable d){ y el método “commandAction” tiene el siguiente código fuente: public void commandAction(Command c.SCREEN. forma. UN PRIMER MENU CON EVENTOS En esta sección nos proponemos realizar un primer menú.addCommand(dos).setCommandListener(this).

} Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva cadena1. Command tres.SCREEN.addCommand(dos).lcdui. uno = new Command("UNO".append(cadena1). Form forma. Command dos.microedition. forma.SCREEN.setText("3"). } if(c==tres){ cadena1. } } // Cierra void commandAction() public Celular1() { // constructor forma = new Form("Primer forma").getDisplay(this). forma. tres = new Command("TRES". public class Celular1 extends MIDlet implements CommandListener{ Display display.setText("3").microedition.3). display. } if(c==tres){ cadena1.lcdui.lcdui. } if(c==dos){ cadena1.Command. } // Cierra public Celular1 public void startApp() { display = Display. con el ánimo de ser lo más didácticos posibles. import javax.setText("2").Command // javax.1).microedition.SCREEN.setCurrent(forma).addCommand(tres).setText("1")."Soy un ITEM").setCommandListener(this).microedition.*. dos = new Command("DOS".*. cadena1 = new StringItem("". StringItem cadena1. } } // Cierra void commandAction() 318 Ahora bien. forma. forma. forma. // javax. Command uno.Displayable d){ if(c==uno){ cadena1.Command.Command.Displayable public void commandAction(Command c.2).setText("2"). a continuación se muestra el MIDLET que contiene el código completo del ejercicio que nos proponemos en esta sección: import javax.midlet.addCommand(uno).

Autor: Luis Felipe Wanumen Silva 319 public void pauseApp() { } public void destroyApp(boolean unconditional) { } } // Cierra class Celular1 La ejecución del anterior programa produce un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .

obteniendo un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 320 En donde se puede apreciar que aparece un “Menu” en la parte inferior izquierda que nos permite desplegar un Menú cuando pulsamos el botón que se encuentra justo debajo de esta palabra.

Autor: Luis Felipe Wanumen Silva 321 El amigo lector / estudiante puede comprobar que llegados a este punto. es posible presionar el botón “1” para ejecutar la instrucción: cadena1.setText("1"). Enciclopedia Conociendo Curso de Jsp y Servlets .

con lo cual obtenemos el resultado: Enciclopedia Conociendo Curso de Jsp y Servlets .setText("3").setText("2"). hemos presionado el botón “2”. y finalmente si se presiona el botón “3” se ejecuta la instrucción: cadena1. Para este caso.Autor: Luis Felipe Wanumen Silva 322 y en forma análoga si se presiona el botón “2” se ejecuta la instrucción: cadena1.

Autor: Luis Felipe Wanumen Silva 323 Es bueno tener en cuenta que esto se puede también hacer presionando el botón del centro llamado “select” cuando la opción del menú correspondiente esta seleccionada. es decir para este caso cuando este seleccionada la opción “2”: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 324 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 325 18.midlet. javax. java. EJEMPLO DE SERVICIO WEB MOVIL Para crear una aplicación móvil podemos descargar un emulador de aplicaciones móviles que nos permita compilar las aplicaciones que hagamos y visualiar sus resultados desde el computador.microedition. public class Hilo extends Thread{ public void run(){ try{ StringBuffer objetoBuffer = new StringBuffer(). objetoEntrada = objetoConector.*. Command. private TextField caja2.openInputStream().open(direccion+codi).1.read())!=-1){ objetoBuffer.setString(objetoBuffer. javax.getString(). CONECTARSE A UN SERVIDOR WEB DESDE UN MOVIL La siguiente aplicación nos permite conectarse con un servlet y trae los resultados del servlet al teléfono móvil.toString()). private Form formulario. int caracter=0.io. Veamos: import import import import javax. private String direccion = "http://localhost:1900/examples/servlet/MyApp?codigo=". String codi. 18.microedition. while((caracter= objetoEntrada.io.microedition. private Command comandoBuscar = new Command("Busca". InputStream objetoEntrada = null.*.*. codi = caja1. objetoConector = (HttpConnection)Connector.lcdui.*.OK. public class Tecno extends MIDlet implements CommandListener{ private TextField caja1. 1).append((char)caracter). HttpConnection objetoConector = null. Enciclopedia Conociendo Curso de Jsp y Servlets . } caja2.

start(). formulario. Hilo miHilo = new Hilo(). TextField. 15. } catch(Exception e){ } // Cierra catch } // Cierra commandAction } // Cierra Tecno } 326 Enciclopedia Conociendo Curso de Jsp y Servlets . Displayable s) { if (c == comandoBuscar) { // caja1.setCurrent(formulario).setString("Ponchado"). caja1 = new TextField("Cedula". TextField.setCommandListener(this).ANY).ANY). "".append(caja1).getDisplay(this). formulario. 15. Display. formulario.append(caja2). formulario. try{ miHilo. caja2 = new TextField("Nombre". "".addCommand(comandoBuscar). } public Tecno(){ } public void commandAction(Command c.Autor: Luis Felipe Wanumen Silva } // Cierra try catch(Exception e){ } } // Cierra run } public void destroyApp(boolean boleano){ } public void pauseApp(){ } public void startApp(){ formulario = new Form("Soy Forma1").

Display.microedition.Form.lcdui.microedition. import java. import javax.io.microedition.midlet.*.io.lcdui. import javax. 19.microedition.java”. import javax.*.*.midlet. import javax. Enciclopedia Conociendo Curso de Jsp y Servlets .microedition. import javax. EJEMPLO DE SERVICIO WEB MOVIL En el siguiente ejercicio se darán los pautas necesarias para crear paso por paso un servicio web móvil.microedition.*.lcdui. import javax.microedition.MIDlet. el cual contenga el siguiente código: import javax.1. CREACION DE LA APLICACIÓN MOVIL Primero consiga el emulador mostrado en la siguiente figura: Después cree un archivo con el nombre “dos.Autor: Luis Felipe Wanumen Silva 327 19.*.lcdui.

public class Hilo extends Thread{ public Hilo(){ } public void run(){ response = new Alert( "Weather Status". public class dos extends MIDlet implements CommandListener { Form mainForm.setTimeout( Alert.jws?wsdl". private Alert response. static final String serviceNamespace = "http://localhost:8080/axis/servicio.HttpTransport. response.FOREVER ).microedition.*. import org. AlertType.*. static final String methodName = "saludar".Autor: Luis Felipe Wanumen Silva 328 import java.kxml.io.jws". Hilo objeto = new Hilo(). private SoapObject request. import javax. private ClassMap classMap. // private SoapObject request. import org.kxml.microedition. private HttpTransport transport. null. // Display display. static final String soapAction = " ".midlet.*.lcdui.*.*. import org. // private ClassMap classMap. null.jws:http://DefaultNamespace:http://localhost:8080/ axis/servicio. Enciclopedia Conociendo Curso de Jsp y Servlets . static final String serviceUrl = "http://localhost:8080/axis/servicio.*.´ static final String entrada = "saludarRequest". import javax.transport.INFO).ksoap. private Display display.parser. import org.ksoap.

classMap = new ClassMap(). display = Display. methodName ). transport. try{ objeto. } public void commandAction(Command c.setCurrent(mainForm). } catch(Exception e){ } } protected void startApp() { display. response.debug = true. try{ Object result = transport.call( request ). soapAction + "#" + methodName ).setCurrent( response ).prefixMap.start().setClassMap( classMap ). Displayable s) { } Enciclopedia Conociendo Curso de Jsp y Servlets . serviceNamespace ). String resultado = (String)result.Autor: Luis Felipe Wanumen Silva 329 transport = new HttpTransport(serviceUrl. entrada.getDisplay( this ). "LUCHIN" ). request = new SoapObject( serviceNamespace.prefixMap = new PrefixMap( classMap.setString( resultado ). classMap. display.addProperty( "nombrecin". transport. } catch(Exception e){ } } } public dos() { mainForm = new Form("Text Field"). request.

http://localhost:8080/axis/servicio. } } Es bueno observar que si se entra a la siguiente dirección en el navegador.jws se tiene siguiente resultado: Enciclopedia Conociendo Curso de Jsp y Servlets .jws” que contenga el siguiente código: public class servicio{ public String saludar(String nombrecin){ String interno. return interno.Autor: Luis Felipe Wanumen Silva 330 protected void destroyApp(boolean unconditional) { } protected void pauseApp() { } } 19. MONTAJE EN EL SERVIDOR DE SERVICIOS WEB Despues dentro de la carpeta AXIS del servidor de servicios web cree un archivo llamado “servicio.2. interno = "Buenas noches "+nombrecin.

org/wsdl/" xmlns:wsdlsoap="http://schemas.jws" xmlns:apachesoap="http://xml.<!-WSDL created by Apache Axis version: 1.<wsdl:message name="saludarResponse"> <wsdl:part name="saludarReturn" type="xsd:string" /> </wsdl:message> .org/soap/encoding/" xmlns:wsdl="http://schemas.<wsdl:operation name="saludar" parameterOrder="nombrecin"> <wsdl:input message="impl:saludarRequest" name="saludarRequest" /> <wsdl:output message="impl:saludarResponse" name="saludarResponse" /> </wsdl:operation> </wsdl:portType> . 2006 (06:55:48 PDT) --> .<wsdl:operation name="saludar"> Enciclopedia Conociendo Curso de Jsp y Servlets .org/wsdl/soap/" xmlns:xsd="http://www.Autor: Luis Felipe Wanumen Silva 331 Y si se hace click en el enlace para ver el WSDL obtenemos: <?xml version="1.<wsdl:message name="saludarRequest"> <wsdl:part name="nombrecin" type="xsd:string" /> </wsdl:message> .org/soap/http" /> .xmlsoap.<wsdl:binding name="servicioSoapBinding" type="impl:servicio"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/xml-soap" xmlns:impl="http://localhost:8080/axis/servicio.xmlsoap.w3.jws" xmlns:soapenc="http://schemas.jws" xmlns:intf="http://localhost:8080/axis/servicio.<wsdl:definitions targetNamespace="http://localhost:8080/axis/servicio.apache.4 Built on Apr 22.xmlsoap.org/2001/XMLSchema"> .0" encoding="UTF-8" ?> .<wsdl:portType name="servicio"> .

org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded" /> </wsdl:input> .Autor: Luis Felipe Wanumen Silva 332 <wsdlsoap:operation soapAction="" /> .<wsdl:input name="saludarRequest"> <wsdlsoap:body encodingStyle="http://schemas.jws" use="encoded" /> </wsdl:output> </wsdl:operation> </wsdl:binding> .org/soap/encoding/" namespace="http://localhost:8080/axis/servicio.<wsdl:port binding="impl:servicioSoapBinding" name="servicio"> <wsdlsoap:address location="http://localhost:8080/axis/servicio.3.xmlsoap. 19.<wsdl:service name="servicioService"> .<wsdl:output name="saludarResponse"> <wsdlsoap:body encodingStyle="http://schemas. EJECUCION DEL SERVICIO Al ejecutar el servicio obtenemos una pantalla similar a la siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .xmlsoap.jws" /> </wsdl:port> </wsdl:service> </wsdl:definitions> Que no es mas que el archivo WSDL que describe el servicio web.

Autor: Luis Felipe Wanumen Silva 333 Y el cargar el aplicativo obtenemos: Enciclopedia Conociendo Curso de Jsp y Servlets .

con lo cual obtenemos lo siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 334 El cual nos indica que tenemos que conectarnos a un servidor y le decimos que si.

Autor: Luis Felipe Wanumen Silva 335 Enciclopedia Conociendo Curso de Jsp y Servlets .

microedition.microedition.io. private TextField caja3.bluetooth. Enciclopedia Conociendo Curso de Jsp y Servlets .microedition. import javax.java import import import import import import javax. javax. private TextField caja1.Display. private TextField caja2. private TextField caja6.StreamConnection. private TextField caja4. public static Form objetoForma.1.io. import java.Connector.DataOutputStream. import javax.lcdui. public class Bluetooth1 extends MIDlet{ public static Display objetoDisplay.bluetooth. Veamos pues todo el código fuente: Bluetooth1.microedition.io.microedition.bluetooth.IOException. private TextField caja5.DiscoveryAgent.MIDlet.io.microedition. TECNOLOGIA BLUETOOTH 20.Autor: Luis Felipe Wanumen Silva 336 20. javax.io.StreamConnectionNotifier.LocalDevice.microedition.lcdui. import java. private LocalDevice localDevice.TextField.Form.io.lcdui. javax. import javax.midlet. javax. import java.OutputStream. import javax.UUID. MOSTRANDO ESTADO DE UN DISPOSITIVO BLUETOOTH A continuación se muestra el código fuente de un aplicativo en el lado del servidor que activa el bluetooth y espera por conexiones de clientes de clientes para capturar el mensaje que envía el primer cliente que se conecta. javax.

objetoForma.append(caja3)."texto".60."texto".getDisplay(this). objetoForma = new Form("Formulario1"). objetoForma.append(caja2)."texto".ANY). if (!localDevice.120. try { // consigue referencia al dispositivo local localDevice = LocalDevice."texto".setCurrent(objetoForma). objetoForma. Enciclopedia Conociendo Curso de Jsp y Servlets .getLocalDevice(). objetoForma.ANY). caja3 = new TextField("NombreServicio Bluetooth".ANY).setString("NO Pudo crear dispositivo").TextField. OutputStream out = null. caja6 = new TextField("Estado coneccion Cliente".ANY).TextField. caja2 = new TextField("Servidor y UUID Bluetooth". objetoForma.100. false). caja4 = new TextField("Servicio Bluetooth Completo".TextField."texto".append(caja1).append(caja6). } else{ caja1.Autor: Luis Felipe Wanumen Silva 337 private static final UUID identificadorServicio = new UUID("F0E0D0C0B0A000908070605040302010". objetoDisplay.TextField.ANY). // Notificador para aceptar conecciones private StreamConnectionNotifier notificador.GIAC)){ caja1.setString("SE Pudo crear dispositivo"). // Maneja la coneccion con el cliente StreamConnection coneccion."texto". public void destroyApp(boolean x){ } public void pauseApp(){ } public void startApp(){ objetoDisplay = Display.ANY).120.append(caja4).TextField. // Hilo para atender a clientes Hilo objetoHilo = new Hilo(). caja5 = new TextField("Estado Servicio Nuestro".80.TextField.setDiscoverable(DiscoveryAgent.append(caja5). objetoForma.40. caja1 = new TextField("Estado Dispositivo Bluetooth".

toString()). // adicionamos el nombre de nuestro servicio url.setString(url.setString(url.toString()). // indicate que este es un servidor url. } catch(Exception e){ caja6.setString("Pudo iniciar Servidor Bluetooth bien").setString("Problemas con el HILO"). // Informa a los clientes que no requieren // autorizacion para conectarse // Algunos dispositivos fallan cuando se coloca // authorize=true url. if(notificador==null){ caja5.toString()).append("localhost"). } 338 } // Cierra try externo catch(Exception e){ Enciclopedia Conociendo Curso de Jsp y Servlets . caja2.toString()).authorize=false").toString()).Autor: Luis Felipe Wanumen Silva } // prepara una URL para crear un notificador StringBuffer url = new StringBuffer("btspp://").setString(url. } try{ objetoHilo. } else{ caja5.start(). // adiciona el identificador UUID para este servicio url.append(". // Crea un notificador ahora notificador = (StreamConnectionNotifier)Connector. caja3.setString("Fallo al iniciar Servidor Bluetooth").append(identificadorServicio.append(". caja4.append(':').open(url.name=ServicioSaludar").

getLocalDevice(). } } // Cierra void startApp public class Hilo extends Thread{ public void run(){ while(true){ try{ caja6. // Cuando llega el cliente le // enviamos un saludo out = coneccion.flush(). en cambio el cliente tiene que buscar dispositivos servidores e intentar conectarse con los servicios que estan en dichos dispositivos.getDisplay(this). salida. DataOutputStream salida = new DataOutputStream(out).writeUTF("Buenas").setString("Esperando cliente").GIAC)) { Display.Autor: Luis Felipe Wanumen Silva caja6. if(!localDevice. } // Cierra catch interno } // Cierra while } // Cierra run() } // Cierra class Hilo } 339 El siguiente es un ejemplo sencillo de comunicación entre celulares usando la tecnología bluetooth. un identificador del servicio. en nuestro ejercicio veremos que lo mas sencillo es la implementación del Servidor Bluetooth debido a que el servidor atiene a clientes y no tiene que buscar servicios en los clientes. un identificador del servicio: Enciclopedia Conociendo Curso de Jsp y Servlets .setString("No llega cliente alguno"). El servidor lo que debe hacer es buscar su propio dispositivo bluetooth y si lo puede encontrar muestra un letrero: LocalDevice localDevice = LocalDevice. } Se crea un buffer que tiene la dirección del dispositivo bluetooth conformada por el protocolo btspp. CREACION DEL SERVIDOR BLUETOOTH El proceso de inicio del servidor bluetooth debe hacerse en un hilo aparte del MIDlet.setString("Llego un cliente").openOutputStream(). salida.setCurrent(new Alert("Existe servicio B")).2.acceptAndOpen(). caja6. coneccion = notificador.setString("Algo pasa").setDiscoverable(DiscoveryAgent. 20. } // Cierra try externo catch(IOException e){ caja6.

} De todas formas. String s = in. if(connection != null) connection. out. java.MIDlet.acceptAndOpen(). Realmente el servicio bluetooth usa un notificador que se crea con la clase Connector StreamConnectionNotifier notifier = (StreamConnectionNotifier)Connector.out.lcdui.io. url. url. es necesario hacer una verificación de si se pudieron crear dichos objetos para luego liberar los recursos de estos flujos.bluetooth.microedition. out.*.println("Cliente dice"+s).flush().append(".io.println(s). sea que se pueda o no crear los flujos de entrada o de salida para leer lo que los clientes envian o el flujo para enviarle a los clientes de parte del servidor.toString()).open(url.midlet.toString()). System.writeUTF("Servidor: HOLA MUNDO"). javax.append(SERVICIO_CHAT. esto se logra con un ciclo infinito: StreamConnection connection = null.close().*. esto se logra con las instrucciones: try { if(in != null) in.*.*. in = connection.out. System.openDataOutputStream(). DataInputStream in = null. import import import import import javax. } Para lograr una mayor comprensión de este servidor Bluetooth.name=Servicio chat.microedition. es decir admite tantas conexiones como la capacidad del dispostivo lo permita. a continuación se muestra el programa completo que implementa el servidor Bluetooth. javax. if(out != null) out. DataOutputStream out = null.close().openDataInputStream(). javax. La cual acepta conexiones aceptando y abriendo conexiones con los distintos clientes en forma indefinida.readUTF().authorize=true").Autor: Luis Felipe Wanumen Silva 340 StringBuffer url = new StringBuffer("btspp://localhost:"). while(true) { try { connection = notifier.microedition.close(). out = connection. Curso de Jsp y Servlets Enciclopedia Conociendo .

append("Servidor en marcha. Command.ITEM. out. String s = in.name=Servicio chat. Enciclopedia Conociendo 341 Curso de Jsp y Servlets .addCommand(comenzar). 1).GIAC)) { Display.flush(). Displayable s) { if (c == comenzar) { hilo.. System. DataOutputStream out = null.authorize=true"). in = connection.setCommandListener(this). StreamConnectionNotifier notifier = (StreamConnectionNotifier)Connector.append(".setDiscoverable(DiscoveryAgent.getDisplay(this). if(!localDevice.start(). out.println("Cliente dice"+s).toString()). formulario.. private Form formulario.writeUTF("Servidor: HOLA MUNDO"). } } public void run() { try { LocalDevice localDevice = LocalDevice.append(SERVICIO_CHAT.setCurrent(new Alert("Existe servicio B")).getLocalDevice().setCurrent(formulario). out = connection. Display.acceptAndOpen().openDataInputStream(). public void startApp() { thread = new Thread(this). url. } StringBuffer url = new StringBuffer("btspp://localhost:"). comenzar = new Command("Comenzar".toString()).open(url. Runnable { public static final UUID SERVICIO_CHAT = new UUID(0x2343). StreamConnection connection = null.getDisplay(this). private Thread hilo.readUTF(). private Command comenzar. formulario. formulario. url. while(true) { try { connection = notifier. DataInputStream in = null.Autor: Luis Felipe Wanumen Silva public class ServidorB extends MIDlet implements CommandListener.").out. } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command c. formulario = new Form("Ejemplo servidor Bluetooth").openDataOutputStream().

startInquiry(DiscoveryAgent. CREACION DEL CLIENTE BLUETOOTH En la anterior seccion se ha creado un servidor Bluetooth.GIAC).getLocalDevice(). El cliente inicia en forma similar al servidor buscando su propio dispositivo bluetooth: localDevice = LocalDevice.printStackTrace().out.setCurrent(new Alert("Error: "+e)).GIAC.close().println(s). Display.close(). } catch(IOException e) { } }// Cierra finally } // Cierra while } catch(IOException e) { e. discoveryAgent = localDevice.getDisplay(this). if(connection != null) connection. this).printStackTrace(). en esta seccion se creara un cliente Bluetooth que se comunique con dicho servidor. if(out != null) out. } finally { try { if(in != null) in.3.Autor: Luis Felipe Wanumen Silva System. } catch(IOException e) { e.setDiscoverable(DiscoveryAgent. } // Cierra catch } // Cierra run } // Cierra class ServidorB 342 20. Cuando se ejecuta la accion de comenzar activando el menu “comenzar” se le indica a dicho dispositivo que comience la accion de buscar otros dispositivos bluetooth y esto se logra con la invocación del metodo “startInquiry()” discoveryAgent. localDevice. Con la ejecucion de la anterior instruccion automáticamente se comienza una busqueda de dispositivos bluetooth que invoca a varios metodos como son: deviceDiscovered inquiryCompleted servicesDiscovered serviceSearchCompleted Enciclopedia Conociendo Curso de Jsp y Servlets .getDiscoveryAgent().close().

remoteDevice.getConnectionURL(ServiceRecord.searchServices(ATRIBUTOS. i++){ service = servRecord[i]. String url = service. sin embargo para que tenga sentido una aplicación bluetooth es bueno colocar codigo en el metodo “deviceDiscovered” el cua se invoca cuando un dispositivo bluetooth es encontrado.length.Autor: Luis Felipe Wanumen Silva 343 de los anteriores metodos un programador le puede colocar codigo que quiera a cada uno de ellos. obviamente debido a que en algun momento se invoco el metodo “searchServices” sobre un agente para lograr que este automáticamente ejecute el metodo “servicesDiscovered”. en nuestro caso colocamos codigo en dicho metodo que se encargue de obtener la direccion remota de dicho dispositivo: String address = remoteDevice. false). DataInputStream in = null. En nuestro caso el metodo “servicesDiscovered” obtiene la direccion del servicio ubicado en el dispositivo previamente encontrado para crear un objeto “conecction” de tal suerte que con este se pueda hacer una manipulación de los flujos de entrada y de salida al estilo sockets por medio de objetos tipo “DataInputStream” para recibir lo que el servidor envia y de objetos tipo “DataOutputStream” para enviarle al servidor mensajes. "+transId).SERVICIOS. DataOutputStream out = null. de tal forma que automáticamente se inicie el proceso de busqueda de servicios sobre este dispositivo bluetooth. StreamConnection connection = null. i<servRecord.getBluetoothAddress(). El otro metodo que vamos a desarrollar es el metodo “servicesDiscovered” que es invocado automáticamente por bluetooth cuando se encuentran servicios. this). busquedas. try { friendlyName = remoteDevice. System.ServiceRecord[] servRecord) { ServiceRecord service = null. } catch(IOException e) { } y luego de invocar el metodo “searchServices” aplicado sobre el agente de descubrimiento “discoveryAgent”.NOAUTHENTICATE_NOENCRYPT.println("Comenzada busqueda de serivicios en: "+device+".out.addElement(new Integer(transId)). Enciclopedia Conociendo Curso de Jsp y Servlets . String friendlyName = null. igualmente se guarda en un vector el identificador de estos servicios: int transId = discoveryAgent. for(int i=0. Nuestro metodo “servicesDiscovered” tiene el siguiente codigo: public void servicesDiscovered(int transID.getFriendlyName(true).

import java.writeUTF("saludos desde el cliente!"). } catch(IOException e) { e.io.microedition.close().setString(s).getDisplay(this).close(). out. texto. public static final int[] ATRIBUTOS = null.printStackTrace().*. import javax. String s = in.flush().bluetooth.io. import javax.*.setCurrent(texto). Display.microedition.openDataInputStream(). } finally { try { if(in != null) in.lcdui.*. if(connection != null) connection.open(url). } catch(IOException e) { } } // Cierra finally } // Cierra for } // Cierra void servicesDiscovered Recordemos que nuestro ejercicio no implementa codigo en los metodos serviceSearchCompleted inquiryCompleted con lo cual el codigo fuente para estos metodos toma la apariencia siguiente: public void serviceSearchCompleted(int transID.Autor: Luis Felipe Wanumen Silva try { connection =(StreamConnection) Connector. public static final UUID[] SERVICIOS = new UUID[]{ SERVICIO_CHAT }. Enciclopedia Conociendo Curso de Jsp y Servlets .util. import java. if(out != null) out.MIDlet. DiscoveryListener { public static final UUID SERVICIO_CHAT = new UUID(0x2343). public class ClienteB extends MIDlet implements CommandListener. a continuación se muestra el codigo completo de nuestro ciente Bluetooth: 344 import javax. out = connection.midlet.microedition.readUTF(). in = connection.*. out.*. import javax.openDataOutputStream().close(). int respCode) { } // Cierra void serviceSearchCompleted public void inquiryCompleted(int discType) { } // Cierra inquiryCompleted Para no ir tan lejos.

TextField. DiscoveryAgent discoveryAgent.ITEM. discoveryAgent = localDevice. Gauge. // cancelar = new Command("Cancelar".addCommand(cancelar)..null. 345 public void startApp() { busquedas = new Vector().". Command. // busqueda.getDisplay(this). 1). texto = new TextBox("El servidor te dice... } catch(Exception e) { e. } } // Cierra void void commandAction private void comenzar() { try { Enciclopedia Conociendo Curso de Jsp y Servlets .setCommandListener(this).addCommand(comenzar). busqueda. AlertType. Form principal.getDiscoveryAgent(). Alert alert = new Alert("Error". busqueda = new Form("Busqueda de servicio").getLocalDevice(). 50.UNEDITABLE).setCurrent(alert). Display."". Displayable s) { if (c == comenzar) { comenzar().CONTINUOUS_RUNNING)). } else /* if( c == cancelar)*/ { // cancelar().".ITEM.INDEFINITE. principal."No se puede hacer uso de Bluetooth". busqueda. Form busqueda.Autor: Luis Felipe Wanumen Silva private private private private private private Command comenzar.setCommandListener(this). 1).ERROR).setDiscoverable(DiscoveryAgent. try { localDevice = LocalDevice. Vector busquedas. LocalDevice localDevice = null.append(new Gauge("Buscando servicio.getDisplay(this).printStackTrace().GIAC). comenzar = new Command("Buscar".. localDevice.false. Display. principal = new Form("Ejemplo cliente SPP"). } } // Cierra void startApp public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void commandAction(Command c. principal.setCurrent(principal). TextBox texto. Command.Gauge.

this). } // Cierra else try { int transId = discoveryAgent.ERROR).SERVICIOS.getConnectionURL(ServiceRecord. System.addElement(new Integer(transId)). String url = service. } catch(BluetoothStateException e) { e. if(friendlyName == null) { device = address.getDisplay(this). } catch(IOException e) { } String device = null.DeviceClass deviceClass) { String address = remoteDevice.searchServices(ATRIBUTOS.err. i<servRecord.GIAC.setCurrent(busqueda).println("Comenzada busqueda de serivicios en: "+device+".setCurrent(alert). i++){ service = servRecord[i]. "+transId). busquedas. try { friendlyName = remoteDevice. Alert alert = new Alert("Error".printStackTrace(). for(int i=0.getDisplay(this).NOAUTHENTICATE_NOENCRYPT. Display.ServiceRecord[] servRecord) { ServiceRecord service = null. false)."No se pudo comenzar la busqueda". this). } } // Cierra deviceDiscovered public void inquiryCompleted(int discType) { } // Cierra inquiryCompleted public void servicesDiscovered(int transID. } else { device = friendlyName + " ("+address+")". AlertType.getFriendlyName(true).out.null. Display. System.Autor: Luis Felipe Wanumen Silva discoveryAgent.length. String friendlyName = null. } } // Cierra void comenzar() //metodos de la interfaz DiscoveryListener public void deviceDiscovered(RemoteDevice remoteDevice. Enciclopedia Conociendo 346 Curso de Jsp y Servlets . } catch(BluetoothStateException e) { e.startInquiry(DiscoveryAgent.getBluetoothAddress().println("No se pudo comenzar la busqueda"). remoteDevice.printStackTrace().

DataOutputStream out = null. } catch(IOException e) { e. int respCode) { } // Cierra void serviceSearchCompleted } // Cierra ClienteB 347 Enciclopedia Conociendo Curso de Jsp y Servlets .flush(). out = connection. } finally { try { if(in != null) in.Autor: Luis Felipe Wanumen Silva StreamConnection connection = null.getDisplay(this). texto. out. DataInputStream in = null.printStackTrace(). } catch(IOException e) { } } // Cierra finally } // Cierra for } // Cierra void servicesDiscovered public void serviceSearchCompleted(int transID.openDataOutputStream().readUTF().close(). Display. if(out != null) out.close(). try { connection =(StreamConnection) Connector.open(url). String s = in. if(connection != null) connection. in = connection.writeUTF("saludos desde el cliente!").close().setCurrent(texto). out.setString(s).openDataInputStream().

archi = new FileReader(new String("a. FileReader archi. A continuación vamos a mostrar un programa tipo Applet que intenta mostrar el contenido de un archivo llamado “a. BufferedReader bufer.toString()). después de lo cual el navegador enviara un mensaje de confirmación.java import java.txt”: MyApp. try{ String leido = "".*. bufer = new BufferedReader(archi).setText(e.applet. import java. } } } Enciclopedia Conociendo Curso de Jsp y Servlets .io. Con este ejercicio se intentara mostrar que Java es tan flexible que cuando este tipo de funcionalidades de acceder a un archivo se deseen. } ta. public void init(){ add(ta). se pueden usar algunos mecanismos para lograr que dicho applet quede firmado. import java. String res = "".*. public class MyApp extends Applet { TextArea ta = new TextArea(). while((res=bufer.readLine())!=null){ leido=leido+res+"\n".setText(leido). APPLET QUE LEE UN ARCHIVO LOCAL Una de las cosas que demuestra que Java es muy seguro es el hecho que en forma normal y natural un applet no puede tener a recursos como archivos que se encuentran en la maquina del cliente en donde se esta ejecutando el navegador que contiene a dicho applet.*.Autor: Luis Felipe Wanumen Silva 348 21.1. SEGURIDAD EN JAVA 21. } catch(Exception e){ ta. de tal suerte que si el cliente acepta dicho mensaje se ejecutaran las operaciones en el applet que normalmente no se podían hacer.txt")).awt.

la forma es generar un certificado para el applet y por ultimo firmar el applet.Autor: Luis Felipe Wanumen Silva 349 El problema del anterior archivo es que no se puede mostrar dicho archivo desde programas tipo Applet y en primera instancia el resultado de la ejecución del anterior programa es similar al siguiente: Existe una manera para lograr que se pueda desde un Applet se puedan ejecutar acciones de este tipo como de lectura de archivos. Para generar el certificado usamos la instrucción: C:\Progra~1\Java\jdk1.6.0\bin\keytool -genkey -alias aliacin -validity 120 –v En donde “aliacin” es el nombre del alias del certificado y 120 significa el numero de dias que sera valido dicho certificado. Nos pregunta la contraseña del almacen de claves: Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 350 En este caso colocamos la palabra “clave”. Esto simplemente se mostro con el fin de ir comprobando que realmente la clave no puede ser tan corta. Vamos pues a colocar la clave “123456”: Enciclopedia Conociendo Curso de Jsp y Servlets . con lo cual observamos que se produce el siguiente error: Dado que la contraseña es demasiado corta.

en este caso colocaremos la palabra “Universidad” tal como se muestra en el siguiente grafico: Enciclopedia Conociendo Curso de Jsp y Servlets . A continuación nos pregunta nuestro nombre y nuestro apellido colocaremos pues Luis Wanumen tal como se muestra a continuación: Seguidamente colocaremos el nombre de nuestra unidad de organización.Autor: Luis Felipe Wanumen Silva 351 Vemos pues que se nos solicita volver a digitar la clave. procedemos pues a volverla a digitar.

Autor: Luis Felipe Wanumen Silva 352 En el nombre de la organización colocaremos la palabra “Distrital” tal como indica la siguiente figura: Luego nos pide el nombre de la ciudad o localidad. en nuestro caso colocaremos “Bogota” tal como se muestra en el siguiente pantallaza: Enciclopedia Conociendo Curso de Jsp y Servlets .

colocaremos “Colombia” y en el codigo de pais de dos letras colocaremos “co” tal como se muestra en el siguiente grafico: Observamos pues que una vez digitada toda esta información se nos solicita confirmar todos estos datos. esta parte es importante pues nos sirve para hacer una ultima verificación de la información que usamos en la creación del certificado.Autor: Luis Felipe Wanumen Silva 353 A la pregunta estado o provincia. Observemos por simple curiosidad que pasaria si le colocasemos la palabra “yes”: Enciclopedia Conociendo Curso de Jsp y Servlets .

024 bits.Autor: Luis Felipe Wanumen Silva 354 Vemos que vuelve a solicitar los datos. Se solicita entonces la contraseña clave para “aliacin”. esto sucede porque la configuración de la maquina virtual esta en español con lo cual debemos contestar en español tal como se muestra a continuación: En este punto es importante notar que el par de claves se generan usando el algoritmo DSA de 1. tal como corrobora el pantallaza siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets . Con todo esto se ha generado el certificado para el applet. en este caso se recomienda que sea la misma que la del almacen de claves y esto se logra presionando la tecla ENTER.

jar aliacin –verbose En donde nos solicita la clave del almacen de claves identificado con el alias “aliacin”. tal como se muestra a continuación: En nuestro caso colocamos la clave “23456” Enciclopedia Conociendo Curso de Jsp y Servlets .0\bin\jarsigner MyApp. El proceso de firmado del applet comienza con el siguiente comando: C:\Progra~1\Java\jdk1.Autor: Luis Felipe Wanumen Silva 355 Ahora llego el momento de asociar el applet con el certificado que acabamos de expedir. pero hacer que dicha firma quede asociada al mencionado certificado se logra si se conoce la contraseña del almacen de claves. A este proceso se le conoce con el nombre de firmar el applet.6.

se puede ejecutar desde el navegador. tal como se muestra en la siguiente figura: Enciclopedia Conociendo Curso de Jsp y Servlets . nos genera el siguiente error: 356 El error se presente debido a que se tiene que modificar el archivo “MyApp. Incluso para garantizar que funcione a veces se hace necesario cerrar el navegador para que no exista aplicación alguna que este asociada al archivo “MyApp.Autor: Luis Felipe Wanumen Silva Y a pesar de haberle colocado bien la clave.jar”. Una vez se ha firmado el applet. Una vez se ha firmado el applet se tiene claro que el certificado expira en seis meses y esto se muestra mediante un Warning. Esto fue lo que realmente se hizo para que funcionara este ejercicio.jar” y esta siendo usado por el navegador.

readUTF Cliente OutputStream salida ObjectOutputStream carritoSalida carritoSalida. writeUTF Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 357 Vemos pues que al momento de cargar el applet aparece un aviso de advertencia que se puede ver en mas detalle como se muestra a continuación: Servidor InputStream entrada ObjectInputStream carritoEntrada carritoEntrada.

txt” con el siguiente contenido: Para el caso de nuestro ejercicio vamos indicarle al navegador que confiaremos siempre en el contenido del editor “Luis Wanumen”: Enciclopedia Conociendo Curso de Jsp y Servlets . es simplemente que el contenido esta asociado con un almacen de certificado que no es de confianza pero que si es aprobado por el cliente permitiria la ejecución de la accion de ver el contenido de un archivo.Autor: Luis Felipe Wanumen Silva 358 Esto demuestra que la firma digital ha sido creada. En este momento y antes de continuar vamos a crear un archivo llamado “a. pero lo que aparece no es un error.

Enciclopedia Conociendo Curso de Jsp y Servlets . 359 Ahora bien. De otra parte ahora hacemos clic sobre el boton con el rotulo “Ejecutar”. a continuación se muestra el resultado de la ejecución del applet. En este momento el navegador puede demorarse un poco debido a que esta validando las acciones que realiza el applet.Autor: Luis Felipe Wanumen Silva Esto se logra señalando en la opcion mencionada tal como muestra la figura anterior.

Enciclopedia Conociendo Curso de Jsp y Servlets .class a otra carpeta para que el navegador no los tomara y asegurarnos que tomar únicamente el jar que había sido firmado. realmente la primera vez que se ejecuto esto no funciono y lo que pasaba era que tocaba pasar los archivos . La verdad esto no tiene mucha lógica pero en forma real fue algo que se presento cuando se ejecuto este ejercicio y algo que soluciono el problema para lograr que el Applet leyera el archivo.Autor: Luis Felipe Wanumen Silva 360 Bueno.

ALGUNAS APIS DE GOOGLE API de Google Apps API de datos de Google Base API de datos de blogger API de datos de Google Calendar API de datos de Google Code Search API de datos de Google Contacts API de datos de Google Health API de datos de Bloc de notas de Google API de datos de Hojas de calculo de Google Docs API de datos de Google fotos API de datos para la lista de Google Docs API de datos de Youtube API de Feed Burneo API de Gatgets de Google API de Client Login API AuthSub API Ajax de Google API de Google Chart API de Google Maps 22. se solicita una direccion URL. Una clave para las APIs de google.1.com/intl/es-CO/apis/maps/signup.html Cuando se entra al sitio anterior. 22.2. DEFINICION DE APIS DE GOOGLE: Las apis de google son métodos que ofrece google para que los desarrolladores de aplicaciones puedan invocarlos desde sus propias aplicaciones.google. 22.3. REQUERIMIENTOS Un entorno de desarrollo que soporte servicios web Kit para desarrolladores que proporciona google.Autor: Luis Felipe Wanumen Silva 361 22. PROGRAMACION CON GOOGLE 22. en este caso se aconseja digitar http://localhost Enciclopedia Conociendo Curso de Jsp y Servlets .4. OBTENER LA CLAVE DEL API DE GOOGLE MAPS La clave del API de Google Maps se puede obtener en http://code.

org Para el caso especifico de la ciudad de Bogotá la capital de Colombia tenemos los siguientes datos: Descripción: capital of a political entity population 7. ALGUNAS COSAS CURIOSAS DE GOOGLE Algunos dicen que google esta desarrollando sistemas operativos como: Goobuntu Google Media Server para dispositivos de salon.602 Latitud: N 4° 36' 0'' Longitud: W 74° 5' 0'' 22. una de ellas es: http://www. Google Phone es Android Open Handset Alliance Investigar si esto es verdad Enciclopedia Conociendo Curso de Jsp y Servlets . COLOCAR LA ALTITUD Y LA LATITUD Para colocar la altitud y la latitud existen algunas paginas que nos permiten hacer este trabajo para establecer las coordenadas.geonames.5.Autor: Luis Felipe Wanumen Silva 362 y hacer clic sobre el boton “Generar Clave de API” En nuestro caso google genero la siguiente clave: ABQIAAAAJrGl_mJsgRhksSed5PPrNxT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQH0EuEF7PLIMnfq3z 0SbEz4z__ow 22.102.6.

Autor: Luis Felipe Wanumen Silva 363 Enciclopedia Conociendo Curso de Jsp y Servlets .

de la siguiente forma: Login Crear Usuario Enviar Mensaje Cambiar nombre Usuario Salir El foro funciona de la siguiente manera: En cliente debe crear un usuario antes de poder enviar un mensaje. INVESTIGACIONES PROPUESTAS PARA LOS ESTUDIANTES DE JAVA AVANZADO 23. Puede funcionar en Windows o en Linux. Web o como quiera La condicion Lenguaje JAVA. YA QUE EL PROGRAMA ES SIMPLEMENTE ESO. Awt. DESCRIPCION DEL PROGRAMA El programa debe manejar un servidor que sea capaz de pedir solicitudes de varios clientes. El motor de BD cualquiera. el servidor no admite en el foro al segundo cliente que tenga un nombre repetido. PERO EN REALIDAD ESTO ES UN REQUISITO PARA ENTRAR AL PARCIAL. UN PROGRAMA. Interfaz com Swing. Si dos usuarios tienen el mismo nombre.1. El servidor valida al usuario basado en el nombre de usuario que halla llegado. Enciclopedia Conociendo Curso de Jsp y Servlets . Un usuario puede cambiar su nombre de usuario y este cambio debe reflejarse en cada uno de los demas clientes. El parcial es la sustentación del programa. PROPUESTA DE PARCIAL PRIMERO EL PARCIAL ES UN SOFTWARE DOCUMENTADO.Autor: Luis Felipe Wanumen Silva 364 23.

Grupos MAXIMO 3 Fecha 12 de marzo. Celular 315 832 72 69 365 23. UNA PRIMERA PROPUESTA Este lunes en Ocho 28 Mayo LUNES Por correo luchofelipe2000@yahoo.2. pero nota individual. ANGELICA SANCHEZ Y DANIEL GOMEZ Ventajas de hacer una web semantica con JENA y Protege Enciclopedia Conociendo Curso de Jsp y Servlets .com Minimo Hojas(200) Maximo Hojas (Todas las que quiera) 15 Dias Documento Investigativo (Entregar Digitalizado) ANDREA SANCHEZ.Autor: Luis Felipe Wanumen Silva Sustentación en grupos.

Aportes CAMILO ANDRES CHAVEZ LAURA VELASCO Y ANGELA VARGAS Que se esta haciendo actualmente para ponerle seguridad a los servicios Web. ANDREA CASTRO ANDRIANA VALDERRAMA Y JORGE VASQUEZ Orquestacion de servicios web NIDIA TORRES XENIA CASTILLO JOSE VICENTE ARANGO Grilla Computacional Enciclopedia Conociendo Curso de Jsp y Servlets . Documentos de Soporte.Autor: Luis Felipe Wanumen Silva 366 Desventajas de hacer una web semantica con Protege. Ejemplos buenos bajados de Internet.

Autor: Luis Felipe Wanumen Silva 367 ROSA CADENA ROBINSON QUINTERO Seguridad con Java Criptografia OSCAR RIVERA FREDY HERNANDEZ Servidor de autenticacion con Java BLANCA NIETO JONATHAN NINO Bases de datos hechas en Java CARLOS ORJUELA DANIEL MADRIGAL MANUEL ESPITIA Java y SVG DIANA PUENTES ANDRES YEPES MIDDLETS con Java Enciclopedia Conociendo Curso de Jsp y Servlets .

convertirla a un formato que acepte JENA para que pueda ser procesada por este motor de inferencia y usar las APIS para realizar dicha inferencia.3. Enciclopedia Conociendo Curso de Jsp y Servlets . Hacer una aplicación cliente que envie y muestre los archivos de un servidor Ftp. Una vez creada la ontología. móviles preferiblemente con Java.Autor: Luis Felipe Wanumen Silva 368 FERNANDO AGUDELO YEPES Opcion 1 Servicios web con Java Manual Paso a paso Ejemplos Opcion 2 Grilla computacional con Java PARA EL QUE LLEGUE Bases de datos Federadas con Java 23. Hacer aplicaciones inalámbricas. PROPUESTAS PARA EL SEMESTRE 2008 I Existen algunas propuestas que estoy pensando como son: Hacer una aplicación cliente que envie y visualice los correos de un servidor de correo. Obviamente esto se debe hacer si se tiene un modelo definido sobre un problema que se quiera trabajar y modelado correctamente con UML.NET. Hacer un chat entre dos celulares. pero los que quieran que lo hagan con . 23. PROPUESTAS PARA EL SEMESTRE 2007 III Existen algunas propuestas que estoy pensando como son: Manejar Protege para comprender como crear ontologías con protege.4.

Hacer programas que creen archivos XML usando JDOM.robot y para que las instrucciones se puedan ejecutar independientemente de cualquier sistema operativo podemos usar SIGAR. permitiendo anadir. Para manipular y controlar el servidor remoto se puede usar java. Proyecto de aplicaciones de Servidor de Streamming c. Proyecto de gesion remota de un equipo desde otro equipo. PARA TRABAJAR PROYECTO DE MONITOREO DESDE UN MOVIL HAY QUE ESTUDIAR ESTOS TEMAS c1. PROPUESTAS PARA EL PRIMER SEMESTRE 2010 I Propuestas de temas para proyectos de grado: a. f. c5. Hacer programas que creen archivos XML usando SAX. de la misma manera para hacer una aplicacion de gestion y administracion se requiere una arquitectura que en java es una arquitectura de gestion que incluye servicios de monitorizacion y administracion de aplicaciones basadas en Java a esta arquitectura en java se le llama arquitectura JMX. Proyecto de aplicaciones de gestion de un servidor de correo desde un movil c. 23. Proyecto de aplicaciones de television digital. Proyecto de aplicaciones GSM b. h. Proyecto de aplicaciones de gestion de un servidor CUALQUIERA desde un movil d. Si vamos a administrar un servidor de correo habria que entender el protocolo POP3 c3.Autor: Luis Felipe Wanumen Silva 369 Hacer un chat con tecnología RMI que tenga en cuenta los mensajes perdidos cuando cualquier cliente se desconecte. e. Hacer programas que creen archivos XML usando DOM. Proyecto de gestion con LDAP y Java. permitiendo anadir. OTRAS PROPUESTAS. Proyecto de tecnologia de agentes speak y de traduccion. Proyecto de aplicacion de administracion de turnos en un cafe Internet. Comprender el protocolo de administracion SNMP c2. buscar y ordenar elementos del archivo XML. Hay que administrar el servidor usando una tecnologia que permita aprovechar JMX y los agentes inteligentes Enciclopedia Conociendo Curso de Jsp y Servlets . Si vamos a administrar un servidor de correo habria que entender el protocolo IMAP c4. Proyecto de aplicaciones de gestion de un servidor ftp desde un movil c. buscar y ordenar elementos del archivo XML. buscar y ordenar elementos del archivo XML. i. Conjunto de herramientas para JMX es JDMK c6. Proyecto de comercio electronico g.5. controladora y el modelo. Esta arquitectura define la capa de instrumentacion. permitiendo anadir. Si vamos a administrar un servidor de correo habria que entender el protocolo SMTP c3. De la misma manera como para hacer una aplicacion web se requiere una arquitectura centrada en n-capas o a veces en tres capas de las cuales las mas conocidas con la vista. capa de agente y capa de gestion o adaptacion.

org/wiki/JDMK http://catalogs.snmp4j. 1.0) JSR 160 JMX Remote API JSR 3 (JMX 1.6.org/wiki/Java_Management_Extensions b.net/projects/sigar/files/sigar/1. Para comprender el modelo de capas JMX http://es.3. DE AQUI SE PUEDE BAJAR SIGAR http://sourceforge.wikipedia.6/hyperic-sigar-1.1.com/is-bin/INTERSHOP.pgid=Q2ye6_Ocx8nOZgiKCJkpiAe00000iMyu1CV5. API para trabajar SNMP con Java http://www.org/ Enciclopedia Conociendo Curso de Jsp y Servlets .sun.Autor: Luis Felipe Wanumen Silva y esto se logra con JDMK 370 LES ACONSEJO ESUDIAR Y ACCEDER A LOS SIGUIENTES ENLACES(Especialmente a Heidy y Lorena que van a trabajar monitoreo desde un movil) a. Estudiar las especificaciones JSR para JMX que son: JSR 255 (JMX 2.net/project/showfiles. UN EJEMPLO USANDO SIGAR http://casidiablo.wikipedia.zip/download https://sourceforge.net/descargar/Informacion+Sistema+Java d.sid=rYOP3irSQqWv3mG87UspbrJTxfq 5LnIP_hvXA3lKxfq5Lg==?CatalogCategoryID=nopIBe.enfinity/WFS/Sun_Catalogue-Sun_Catalogue_MXSite/es_ES/-/USD/ViewCatalogBrowse. y 1. Un Link para comprender que es JDMK http://es.php?group_id=172552 c.2) e.dDNsAAAEUL045G_c2 f.0.

Secretos y soluciones para la seguridad de Redes Stuart McClure Joel Scambray George Kurtz Mc Graw Hill 19 Puntos criticos sobre seguridad de software. AlfaOmega @Ra-ma 2003 Java 2. BIBLIOGRAFIA FACIL DE CONSEGUIR EN COLOMBIA SOBRE JAVA J2ME Java 2 Micro Edition Agustin Froufe Quintas Alfa Omega Rama Hackers. Tercera Edicion. XML Al descubierto Vision Experta Potente Software Prentice Hall Michael Morrison et al.Autor: Luis Felipe Wanumen Silva 371 24. Manual de Usuario y tutorial Agustin Froufe Quintas AlfaOmega @RA-MA. Java 2 Caracteristicas Avanzadas Abarca J2SE versiones.1. David LeBlanc y John Viega Mc Graw Hill 2007 Comunicaciones y bases de datos con Java A traves de ejemplos Jesus Bobadilla Adela Sancho. 2003 Manual de Referencia JSP Mc Graw-Hill Osborne Media Phil Hanna. Enciclopedia Conociendo Curso de Jsp y Servlets . BIBLIOGRAFÍA E INFOGRAFÍA 24. Fallas mas comunes en programacion como corregirlas Michael Howard.

1998. Horstmann y Gary Cornell (book/CD-ROM). J2EE Keogh Mc Graw Hill 372 24. REFERENCIAS DE JAVA En esta sección se incluyen referencias de utilidad sobre el lenguaje de programación Java. Michael C. George Reese. Edición. Buena referencia para CORBA. Wiley. 1997. Los primeros capítulos constituyen una buena introducción a Java. Java series. 5.net y JDBC "Core Java 1. Hortstmann / Gary Cornell Prentice Hall Seguridad en Java Edicion Especial Jamie Jaworski Paul J.Perrone. Henry Wong. "Java 1. 2a. O'Reilly. Referencia muy completa y breve de Java 1. Prentice Hall. basando la presentación de Java en conociemientos de C.Autor: Luis Felipe Wanumen Silva Sun Microsystem Cay s. Al Saganich. Prentice-Hall. Manuel J.2. David Flanagan. Scott Oaks. Enciclopedia Conociendo . Martin Snyder. 2002 Desarrollo de Juegos con J2ME AlfaOmega @RA-MA. 4. Referencia detallada de hilos de control en Java "Database Programming with JDBC and Java" . Como programar en Java Deitel y Deitel Prentice Hall JavaServer Pages Manual de Usuario y Tutorial Agustin Froufe AlfaOmega @RA-MA. Streams y Networking "Java in a Nutshell: A Desktop Quick Reference for Java Programmers" . Referencia detallada sobre el uso de Java para accesar Bases de Datos Relacionales. Prieto. O'Reilly. 3. Manual de Usuario. O'Reilly. Muy recomendables son los capítulos de Hilos de Control. Daconta. 1997. 1. cubre SQL. java.1" . 1998. Eric Monk. 1997. Sun Microsystems Press. RMI. Cay S.1 "Java Threads" . Este libro está dirigido a programadores que conocen C y C++ y desean utilizar Java rápidamente.2 and JavaScript for C and C++ Programmers" . JDBC y RMI Curso de Jsp y Servlets 2.

"Java Programming with Corba" . Enciclopedia Conociendo Curso de Jsp y Servlets .F. especificación y uso del modlo RMI/OS. URLs y Manejadores de Contenido 24. 5. 5-7. Explora la arquitectura. 6. Jon Siegel. 2nd edition. Troy Bryan Downing. Wiley. julio-septiembre 1998. Jeri Edwards. 2. Springer 1998. 1). IDG Books. Java RMI and COM/DCOM" .M. Discute métodos de análisis y diseño. compara implementaciones disponibles y contiene ejemplos detallados "Java RMI" .1996. no. "An architectural view of distributed objects and components in CORBA. Elliotte Rusty Harold. "Client-Server programming with Java and Corba" . Referencia detallada sobre programación en redes. RMI y Microsoft COM/DCOM Jim Waldo. Dan Harkey. Una guía completa para elaborar aplicaciones en Java usando CORBA. 1998. Software Concepts & Tools (vol. Andreas Vogel y Keith Duddy. 373 "Java Network Programming" . 1998. 3. Wiley. REFERENCIAS DE JAVA-CORBA-RMI 1. Contiene ejemplos de aplicaciones distribuidas 4.. Robert Orfali. muy recomendables los capítulos de Sockets. Wiley. Discute cómo implementar sistemas cliente-servidor combinando Java y CORBA Plasil. 1997.. "Remote procedure calls and Java Remote method invocation" IEEE Concurrency. Se comparan sistemas de objetos distribuidos CORBA. Stal. Compara sistemas de objetos distribuidos tipo CORBA con RMI "Corba: fundamentals and programming" . 1998.3.Autor: Luis Felipe Wanumen Silva 6. 19. O'Reilly.

Autor: Luis Felipe Wanumen Silva 374 Enciclopedia Conociendo Curso de Jsp y Servlets .

Autor: Luis Felipe Wanumen Silva 375 Enciclopedia Conociendo Curso de Jsp y Servlets .

...........56 4............................................ COMENTARIOS EN PAGINAS JSP....................................................... ARMAR LA CADENA DE CONSULTA Y ENSAMBLAR LA APLICACION.......8.....84 6......................53 4..................................85 6.. PAGINACIÓN DE RESULTADOS CON JSP..................................................... PRIMER EJERCICIO DE ETIQUETAS JSP............................................................Autor: Luis Felipe Wanumen Silva 376 TABLA DE CONTENIDO 1....................... SERVLET QUE INSERTA DATOS EN BASE DE DATOS.. INGRESAMOS ALGUNOS DATOS........5...... COLOCAR HIPERENLACE ANTERIOR........................................................................71 5......3 2................ CONCEPTOS BASICOS DE SERVLETS......................................... ETIQUETAS JSP........2......................................50 4............ CORREGIR EL NUMERO DE REGISTROS QUE APARECEN EN LA ULTIMA PAGINA..................................2....81 6.........48 4..............6..3..................1..................67 5....................................73 5.............................................................1........................................37 3.........................................................................................................................................42 3...........................37 3..........................................................................1...8.....83 6..........................................6.............................................................4..............................................82 6...................... SERVLETS SENCILLOS CON CONEXIÓN A BASES DE DATOS..................................20 2..................................................................5.... DEPENDIENDO LA PAGINA ACTUAL..2.................. DESDE UNA JSP USAMOS EL TAG........3.....................................................7..................75 6....................................................2 1.......... COLOCAR HIPERENLACE SIGUIENTE... CREAR LA LIBRERÍA DE ETIQUETAS................37 3............. PAGINACION CON SERVLETS..................5.....................4..................86 7........8...... HACER QUE EL NUMERO DE REGISTROS SEA DINAMICO.........................................................................................................1...............2.............2.............................7......66 4...........54 4... RECONOCER QUE PARAMETRO SE ENVIA EN PAGINAS RECURSIVAS.................... UN TIP SOBRE LAS IMPORTACIONES..................9............ LA DIRECTIVA INCLUDE..... CICLO DE VIDA DE PAGINA JSP.................................. PAGINACION CON SIGUIENTE Y ANTERIOR............................................. TALLER PROPUESTO SOBRE TAGS JSP..... BUSCAR UN REGISTRO EN SQL SERVER 2000 Y USANDO SERVLETS....................................................................................47 3............. 63 4......38 3... CREANDO SENCILLA APLICACIÓN WEB NETBEANS 3 CAPAS.............38 3...................................... PASO 1: CREAR LA BASE DE DATOS................ ERROR COMÚN CON EL USO DE TAGS...............................................................................3...............................2 2.......81 6.......5 2........................ IMPRIMIR LOS HIPERENLACES NECESARIOS DE ACUERDO CON EL NUMERO DE PAGINAS DE USUARIO...........4........................... EJECUTAMOS LA APLICACION...................... CUIDADOS CON LA DIRECTIVA INCLUDE................. SELECCIÓN DE DATOS DE ORACLE 10G..............6............5........1....................................................1....... FORMA DE HACER TAGS CON NETBEANS 6....3..6..................86 Enciclopedia Conociendo Curso de Jsp y Servlets .......................................... UN TAG QUE CONSULTA DATOS.................................................................. ES POSIBLE QUE PAGINAS JSP CONTENGAN CODIGO NO JSP............................................................................................ UNA FORMA DE IMPRIMIR ELEMENTOS EN JSP............................................. CONCEPTOS BASICOS DE JSP...........................................9..........................................4.................................84 6...........71 5.................................10..............................................39 3.45 3..........3....... CREAMOS LA ETIQUETA PROPIAMENTE DICHA....41 3.............................................. CREAMOS LA BASE DE DATOS..12 2...26 2...................50 4.................................... LA DIRECTIVA PAGE IMPORT........................................................... DECLARANDO VARIABLES EN JSP Y USO DE EXPRESIONES..................................................... UN TIP SOBRE LAS DECLARACIONES....................................82 6.....................................1.......................... LOS COMPONENTES NECESARIOS...........1......... SERVLET QUE MUESTRA DATOS DE UNA TABLA...............7..............................5...................................... CREAMOS EL BEAN....... SE DEBE CALCULAR EL RANGO DE REGISTROS A MOSTRAR...33 3.............................................................58 4...........................................52 4.....3 2....................................................... RECONOCER CUANTAS PAGINAS SON NECESARIAS ................85 7.................

..................2.... ENVIO DE CORREO DESDE UNA INTRANET....................151 10................................................................................................................................................................................................................................2.....................................................1............................................................................................ DESCRIPCION.....................................4.151 10........................158 10............................................................. PASO 9: ENSAMBLE Y DESPLIEGUE DE LA APLICACION.......................................................1..............2........ ENVIO DE CORREO CON ARCHIVO ADJUNTO.....133 9......................................1....................................173 11... CONECCION SERVIDOR FTP USANDO SOCKETS...........3.......179 12...............2.......................177 12................3......................... ENVIANDO MENSAJES DE CORREO USANDO SOCKETS.144 10................176 11...........1............148 10..................................................................... PROGRAMA EN JAVA............................ PASO 8: INGRESANDO CODIGO EN LA VISTA..............173 11..............3.3...............................................144 10.........................................118 9.................................... PASO 4: CREACION DEL PAQUETE QUE TENDRA LA LOGICA Y EL ACCESO A DATOS.............................3................................ EL LADO DEL SERVIDOR ES:........105 7................ ELABORACION DE UN CHAT POR PASOS.2.........................................185 13............3..................................179 12..... CREACION DE UNA SESSION DESDE UNA JSP...........185 Enciclopedia Conociendo Curso de Jsp y Servlets ............... ENVIAR ARCHIVOS A SERVIDOR FTP......107 7............................................................... EJECUCIÓN DEL PROGRAMA..................... PLANTEAMIENTO DEL ENUNCIADO.....114 8..... PASO 7: INGRESANDO CODIGO EN EL CONTROLADOR...............................2..........2.............................110 7..............................................1.......................................... EJECUCIÓN DEL PROGRAMA:.. TRABAJANDO CON RMI...........128 9...........................6..............................................................................5............................................................... PASO 3: CREACION DE UN PROYECTO WEB CON NETBEANS...............................................................103 7...89 7..... PASO 10: EJECUCION DE LA APLICACIÓN......130 9.............................161 10......180 12..................................................6..........2...3.......................162 10......................2..........................................................8 CHAT PUBLICO USANDO HILOS...................7........ CREACION DE UNA COOKIE DESDE UN SERVLET.127 9......137 9..........109 7........................... PASO 5: CREACION DE LA VISTA........................................................4..................10....... PROGRAMA SIN MODELAR NO ES PROGRAMAR.8..................1.... DESCRIPCION DE EJERCICIO.........................................................3.......... PASO 2: CREAR EL ORIGEN DE DATOS..........Autor: Luis Felipe Wanumen Silva 377 7....................... EL LADO DEL CLIENTE ES:...... ESTABLECIMIENDO DE CLASES...138 10..... ESTABLECIMIENTO DE FRASES IMPORTANTES.........................................................2...............3...... SEGUNDA MEJORA AL PROGRAMA ANTERIOR........................................................... PASO 6: INGRESANDO CODIGO EN EL MODELO..144 10.......144 10.................................................................................... EL METODO ACCEPT DE SERVERSOCKET................................... ENVIO DE ARCHIVOS POR FTP.....................................................................4........ IMPORTANCIA DEL DIAGRAMA DE CLASES EN EL MODELAMIENTO DE UN PROGRAMA DE UN AVION...112 8.................4.......161 10...........5............................................................152 10....97 7.........................................................................................................................................1........3.151 10........................................................................................185 13............................. PRIMEROS PASOS......................2...................................... DIAGRAMA DE CLASE............................. QUE ES UN HILO.......................................................115 9...........................2............................1....2.......9..................................................170 11. EL SERVIDOR CREA AÑADE A LA LISTA CADA VEZ QUE LLEGA UN CLIENTE..153 10................. PRIMERO CREAMOS Y COMPILAMOS LA CLASE INTERFACE .......................................... UN EJEMPLO DE UN CLIENTE Y UN SERVIDOR.......... MEJORANDO EL PROGRAMA ANTERIOR COLOCANDOLE UNAS BELLAS INTERFACES GRAFICAS...............114 8.1................92 7.............. IMPORTANCIA DEL DIAGRAMA DE ESTADOS EN UN ENVIO DE INFORMACION MINICHAT.. IMPORTANCIA DEL DIAGRAMA DE CLASES EN EL MODELAMIENTO DE UN PROGRAMA DE UN PIRATA.............. MANIPULACION DE COOKIES Y SESIONES.1..................................... CONECTARSE A SERVIDOR FTP.................................................................................... CONECTAR A SERVIDOR DE CORREO USANDO SOCKETS ..............................................................................................................................................2.........118 9..................... EXPLICACIÓN DE LA IMPLEMENTACIÓN...................181 13......................7.............2...............119 9..............174 11............. ENVIO Y RECEPCION DE CORREO ELECTRONICO............................................1.3......1..........................................................

.....1..............1........287 16............................. SCRIPT PARA EJECUTAR EL CLIENTE.......................................... UN PRIMER MENU CON EVENTOS.................................................... INTRODUCCION A LAS APLICACIONES MOVILES........................302 17............................. REQUERIMIENTOS........361 22..........327 19.... EJEMPLO DE SERVICIO WEB MOVIL..................342 21........208 15.............................................................307 17................. OBTENER LA CLAVE DEL API DE GOOGLE MAPS.................................................. COLOCAR DOS LIENZOS........ MOSTRANDO ESTADO DE UN DISPOSITIVO BLUETOOTH..339 20...............................264 15......................... CREAMOS Y COMPILAMOS EL OBJETO REMOTO QUE SE VA A COMPARTIR........... CREACION DEL SERVIDOR BLUETOOTH ................. INSTALACION DEL SOFTWARE EN EL LADO DEL SERVIDOR.........3............................. MANUAL DE INSTALACIÓN:................................................................... EJEMPLO DE SERVICIO WEB MOVIL....4................................................................................... PROBANDO EL LADO DEL CLIENTE..................361 22...........4..............332 20....................................................................191 14..................................................................................336 20............................... PROBAMOS LA CONFIGURACION DEL LADO DEL SERVIDOR.1............................ FUNCIONAMIENTO DE JUNIT..............235 15........... COLOCAR UNA FORMA EN LA PANTALLA...................... MONTAJE EN EL SERVIDOR DE SERVICIOS WEB.. BEAN Y JAVA BEAN.........361 22..... COLOCAR LA ALTITUD Y LA LATITUD.............................................189 13.......... FRAMEWORKS PARA REALIZAR PRUEBAS.........................................................................................................................302 17..........9..............................258 15........................... MONTAJE DE UN EJERCICIO SENCILLO..... AÑADIR UN STRING A UNA FORMA.289 16............................................. COLOCAMOS LA APLICACIÓN QUE HICIMOS EN EL SERVIDOR RMI... CREACION DE UN BEAN DE ENTIDAD CON NETBEANS Y ORACLE 10G EXPRESS ....................195 14..............188 13.............. CONFIGURACION PREVIA DEL SERVIDOR................................................................................ DEFINICION DE APIS DE GOOGLE: .................5.........................................................288 16.... CARACTERÍSTICAS TÉCNICAS DONDE EJECUTO EL CLIENTE......3....327 19...........................325 18..... ELABORACION DEL PROGRAMA QUE EJECUTA LA PRUEBA........................3........3..........................................................288 16............279 15.......... EJECUCION DEL TESTRUNNER............................................................3....................................2..........2................................ INVOCACION DEL CLIENTE.......................2........................................... ALGUNAS APIS DE GOOGLE.............6.............................................234 15................................189 13.................................................................................................................234 15.............238 15.. CONSTRUCCION DE CASO DE PRUEBA PARA CLASE LISTA.............................................. CREAMOS LA APLICACIÓN DEL LADO DEL SERVIDOR.........5.......................362 Enciclopedia Conociendo Curso de Jsp y Servlets ............1................ TECNOLOGIA BLUETOOTH..........5.................... ALGUNOS PROBLEMAS QUE SE PRESENTARON FUERON:..........315 17.....................186 13.........348 22....................9...................................................................4.................................................. CONSTRUCCION DE LA CLASE QUE VAMOS A PROBAR......8..............................295 17.......................................................................189 14................................... PINTAR LA BANDERA DE COLOMBIA.....348 21...........1............................................... REGISTRAR EL OBJETO REMOTO................................................8........................317 18.........................................312 17........6........... PROGRAMACION CON GOOGLE.......... SUBIR EL SERVIDOR RMI....................................................................361 22......................2.........188 13........6..................................... CREACION DE LA APLICACIÓN MOVIL.................... ARQUITECTURA DE LOS JAVA BEAN..................2........ BEAN TIPO MESSAGE CON JAVA................ APPLET QUE LEE UN ARCHIVO LOCAL......... CONECTARSE A UN SERVIDOR WEB DESDE UN MOVIL......248 15........191 14................................................295 16.................................292 16.................................................................. EJERCICIO DE WEB SERVICE..................266 15...............1..........................361 22..336 20...............................................................5........................................4.................309 17..........1..... EJECUCION DEL SERVICIO.................................................... CONSEGUIR EL SOFTWARE ANTES DE TRABAJAR..............................................2.......................................................................................................... PINTAR MEDIA PANTALLA CON UN LIENZO.........4................................... SEGURIDAD EN JAVA.......................7.........................187 13......................3...1..................2......................................................330 19.........................5..............................3.............................................1...Autor: Luis Felipe Wanumen Silva 378 13....................................................... CREACION DEL CLIENTE BLUETOOTH .........................................3......325 19..........................................7.................

.............. PROPUESTA DE PARCIAL PRIMERO..............3.371 24..............364 23..................................................................................................372 24.............................. PROPUESTAS PARA EL SEMESTRE 2008 I...............365 23.....................................362 23............................................................ BIBLIOGRAFÍA E INFOGRAFÍA.................3....4............ ALGUNAS COSAS CURIOSAS DE GOOGLE.............364 23. INVESTIGACIONES PROPUESTAS PARA LOS ESTUDIANTES DE JAVA AVANZADO............. REFERENCIAS DE JAVA-CORBA-RMI....................2........... REFERENCIAS DE JAVA...............Autor: Luis Felipe Wanumen Silva 379 22..368 23............................................................5................................................. PROPUESTAS PARA EL PRIMER SEMESTRE 2010 I..................368 23............................................................................................1....................................................................................... PROPUESTAS PARA EL SEMESTRE 2007 III.............. BIBLIOGRAFIA FACIL DE CONSEGUIR EN COLOMBIA SOBRE JAVA...............376 Enciclopedia Conociendo Curso de Jsp y Servlets ..............................................1........371 24.................................2......373 TABLA DE CONTENIDO....... UNA PRIMERA PROPUESTA..............................................369 24..........6.....

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->