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

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

odbc. para aquellos lectores / estudiantes que no comprendan lo que es una sentencia preparada. 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. En este caso particular nuestro orígen de datos está con una base de datos en “sql server 7. 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. Pero bueno.?) Enciclopedia Conociendo Curso de Jsp y Servlets . a continuación se dirán unas cosas al respecto.JdbcOdbcDriver" ). Esta es la razón por la cual la sentencia se ha definido de la forma: Insert into estudiante values (?.getConnection( "jdbc:odbc:luchodb".jdbc. 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.0” cuyo nombre de usuario es “sa” y de password no se le ha colocado valor alguno. Dichas instrucciones están diciendo que se va a crear una variable denominada “sentencia1”. Observemos ahora las siguientes líneas: String in = "insert into estudiante values(?. la cual es una sentencia preparada.forName( "sun. conexion_sql1=DriverManager.prepareStatement(in). En el caso del ejercicio suponemos que existe una base de datos denominada “colegio”. Primero que todo las sentencias preparadas. 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”. sino que hay un método “doPost”. sentencia1 = conexion_sql1. "sa".Autor: Luis Felipe Wanumen Silva } 9 } Observemos que en este caso no hay un método “doGet”. son sentencias que reciben parámetros. Class.?)"."" ).

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

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

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. IOException { int actual = 4.Autor: Luis Felipe Wanumen Silva 12 2.servlet.io. Connection conexion_access. java.*. 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.http. String actualin = req.servlet. 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. Nombre Hugo Paco Luis Martha Oscar Hugo Paco Luis Martha Oscar Natalia Paris Andrea Serna Patricia Giraldo public class paginame extends HttpServlet { ResultSet rs. 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. Statement sentencia.getParameter("ac"). } else{ actual = Integer.*. HttpServletResponse resp) throws ServletException.parseInt(actualin). public void doGet(HttpServletRequest req.3. if(actualin==null){ actual = 1. Enciclopedia Conociendo Curso de Jsp y Servlets . javax. por cuanto si los datos a enviar al cliente son demasiados. java.*.sql.*.

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

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

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 .

co m gina@multinal. [apellido] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL . N'IsUserTable') = 1) drop table [dbo].4.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.[usuario]') and OBJECTPROPERTY(id.co carolinatv@rcn. Después insertamos algunos datos en la tabla.com miler@udistrital.[usuario] GO CREATE TABLE [dbo]. 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. [nombre] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL .co rrodriguez@udistrital.edu. [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. [correo] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL .edu. [direccion_larga] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY] GO Y bueno. 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.[usuario] ( [codigo] [int] NULL .sysobjects where id = object_id(N'[dbo].co jcguevarab@udistrital.edu. Todo esto dentro de un formulario que tambien contiene los Enciclopedia Conociendo Curso de Jsp y Servlets .com esmeralda@usme.Autor: Luis Felipe Wanumen Silva 20 2.

Autor: Luis Felipe Wanumen Silva 21 botones basicos de cancelar y enviar que tiene un formulario comun y corriente. 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”.

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

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

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

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

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

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

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

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

menos cuando estemos ubicados en la ultima pagina.println("<a href=http://localhost:8080/examples/servlet/Paginacion?ac="+ (actual+1)+">Siguiente</a>"). } Y esto hace que se muestre en todos los casos. 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.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.

se muestran tanto el enlace de ¨anterior¨ como de ¨siguiente¨ tal como lo muestra la siguiente pantalla: Enciclopedia Conociendo Curso de Jsp y Servlets .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.

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. De todas formas esto si lo que hace es disminuir la congestion de red. esto obviamente se puede mejorar con el animo de disminuir el trabajo realizado por el servidor con cada consulta. debido a que al cliente tan solo se le envian un segmento de datos y el flujo que pasa por la red. Enciclopedia Conociendo Curso de Jsp y Servlets . el servidor realmente tuvo que recorrer todos los datos antes de mostrar solamente al cliente unos cuantos.

import java.*.Autor: Luis Felipe Wanumen Silva 33 2. public MyApp(){ add(ta). Autor: Luis Felipe Wanumen Silva import java.*. System.sql. 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.awt.*.JdbcOdbcDriver" ). public class MyApp extends Frame{ Connection conexion_sql. } }).exit(0). import java. String cadena = "".forName( "sun. Enciclopedia Conociendo Curso de Jsp y Servlets . 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. 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. Fecha: 17 de septiembre de 2007.awt.3). 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.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(). // Carga el driver JDBC-ODBC try { // Se usa este driver cuando se encuentra instalado en el sistema // Class.jdbc. TextArea ta = new TextArea(1. ResultSet rs=null.odbc. this. La instalacion enterprise la habia hecho hace dos meses y me presentaba algunos errores.event. Statement sentencia=null.6.

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

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

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

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

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

%> <% obj_cadena1="Soy cadena 1".5. %> <%! int var_entero1 = 165. %> <% obj_entero1=new Integer(123). %> <% var_entero1=654. 3.jsp Autor: Luis Felipe Wanumen Silva<br> Imprimiendo variables<br> <%! String obj_cadena1. %> <%! Integer obj_entero1. %> <%=obj_cadena1 %><br> <%=obj_entero1 %><br> <%=var_entero1 %><br> La cual produce el siguiente resultado: Enciclopedia Conociendo Curso de Jsp y Servlets . En realidad las expresiones nos permiten ahorrarnos código al momento de imprimir variables. También es posible imprimir otro tipo de datos tal como se muestra en la siguiente paginas jsp: ejemplo4. 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.Autor: Luis Felipe Wanumen Silva 39 Cuando usamos el igual en la instrucción: <%=variable1%> En realidad estamos usando expresiones.

%><br> Variable 3=<%out.jsp Autor: Luis Felipe Wanumen Silva<br> Declarando variables<br> <%! int variable1 = 165.println(variable1).%><br> Variable 2=<%out.println(variable3). Ahora veamos el siguiente ejemplo: ejemplo5. %> <%! int variable2 = 165.println()”. La anterior página al ser vista desde el navegador produce el siguiente resultado: Enciclopedia Conociendo Curso de Jsp y Servlets .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.println(variable2). %> Variable 1=<%out. %> <%! int variable3 = 165.%><br> Que muestra que es posible imprimir usando la instrucción “out.

%> <% obj_cadena1="Soy cadena 1". %> <%! int var_entero1 = 165.6.jsp Autor: Luis Felipe Wanumen Silva<br> Imprimiendo variables<br> <%! String obj_cadena1. %><br> <%out.jsp Enciclopedia Conociendo Curso de Jsp y Servlets . con lo cual esta sección explica la directiva “include” y esto se hace por medio de la siguiente pagina jsp: ejemplo7. %> <% obj_entero1=new Integer(123). %><br> <%out.println(obj_cadena1). %><br> El cual produce el siguiente resultado: 3. %> <% var_entero1=654. LA DIRECTIVA INCLUDE Las directivas se usan para entregar información de las paginas usadas.println(var_entero1). %> <%out.println()”: ejemplo6. 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. %> <%! Integer obj_entero1.println(obj_entero1).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.

7.Autor: Luis Felipe Wanumen Silva 42 Autor: Luis Felipe Wanumen Silva<br> LA DIRECTIVA INCLUDE<br> <%@ include file="DatosLuisF. la cual para nuestro ejemplo contiene las siguientes lineas: Realmente la explicación es bien sencilla.txt"%> La cual como podemos observar hace referencia a una pagina llamada "DatosLuisF.txt". Lo que hace la pagina JSP es incluir el contenido de archivo "DatosLuisF. Con lo cual el resultado de la ejecución de la pagina JSP es el siguiente: 3.txt". 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 43 ejemplo8. contiene el siguiente código: "pagina1.html" para nuestro caso.jsp Autor: Luis Felipe Wanumen Silva<br> LA DIRECTIVA INCLUDE<br> <html> <body>Este es un cuerpo</body> </html> <%@ include file="pagina1.html"%> Y que la pagina que es incluida.0: Enciclopedia Conociendo Curso de Jsp y Servlets . o sea la pagina "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.

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 .

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

addElement("Luis "). obj_Vector1.*.println(obj_Vector1.println(obj_Vector1. out.elementAt(0)).addElement("Felipe ").elementAt(2)).println(obj_Vector1.util.addElement("Luis ").elementAt(1)). out. out.println(obj_Vector1.println(obj_Vector1.addElement("Felipe ").addElement("Silva"). out. obj_Vector1. out. "%> No estaría disponible la clase “Vector” de java. %> 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.println(obj_Vector1. obj_Vector1. obj_Vector1.addElement("Wanumen ").elementAt(0)). Enciclopedia Conociendo Curso de Jsp y Servlets .elementAt(1)). obj_Vector1.%> <% obj_Vector1. out.%> <% obj_Vector1. obj_Vector1. tal cual se muestra en la siguiente pagina: ejemplo10.elementAt(3)).Autor: Luis Felipe Wanumen Silva 46 <% Vector obj_Vector1 = new Vector().addElement("Silva").addElement("Wanumen ").jsp <% Vector obj_Vector1 = new Vector().

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

--%> <%@page import="java. pero dicho string no termina con el punto y coma lo cual provoca un error en tiempo de ejecución de la pagina jsp.Autor: Luis Felipe Wanumen Silva 48 También funciona. %> En el navegador se produce un error similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets . 3.*. 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”. la cual se le intenta asignar el string “Hola Mundo”."%> <%! String cadena = "Hola Mundo"%> <% out.println(cadena).10.util. <%-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.

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

se debe mostrar al usuario los hiperenlaces necesarios para mostrar todo el conjunto de resultados. Se pueden hacer algunas mejoras a la aplicación a nivel de interfaz de usuario. 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. tales como colocar hiperenlaces anterior y siguiente para imprimir más dinamismo a la página.jsp?p=3>3</a> <a href=ejemplo1. RECONOCER QUE PARAMETRO SE ENVIA EN PAGINAS RECURSIVAS <% String valor = request. 4.jsp?p=4>4</a> El ejercicio corriendo es: Enciclopedia Conociendo Curso de Jsp y Servlets .jsp?p=2>2</a> <a href=ejemplo1.Autor: Luis Felipe Wanumen Silva 50 4. 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.1.jsp?p=1>1</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. out. %> <a href=ejemplo1. out. 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. Otras cosas se deben tener en cuenta.println("Soy la pagina "+valor).getParameter("p").println("<br>").

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

Autor: Luis Felipe Wanumen Silva 52 4. 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. Es decir que vamos a mostrar cuatro resultados por pagina. En este caso 29/4 El resultado es 7.25 Enciclopedia Conociendo Curso de Jsp y Servlets . 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.2.

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.println("El numero de paginas a mostrar es "+paginas_usuario). int numero_registros = 29.3. 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. Veamos: <% int tamano_paginacion = 4. out.jsp?p="+i+">"+i+"</a>").getParameter("p"). int auxiliar = (int)(numero_registros/tamano_paginacion). } out. int paginas_usuario = 0.println("<a href=ejemplo1. for(int i=1. entonces dicho resultado es igual al numero de paginas a mostrar.println("Soy la pagina "+valor). int numero_registros = 29. if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar.i<=paginas_usuario. pero con valores de parámetros diferentes. int auxiliar = (int)(numero_registros/tamano_paginacion).i++){ out. } Enciclopedia Conociendo Curso de Jsp y Servlets . int paginas_usuario = 0. } else{ paginas_usuario = auxiliar+1. out.Autor: Luis Felipe Wanumen Silva 53 Si la división es exacta. %> 4. String valor = request. } out.getParameter("p"). if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar. en caso que no sea exacto.println("El numero de paginas a mostrar es "+paginas_usuario+"<br>"). out.println("<br>"). } else{ paginas_usuario = auxiliar+1. String valor = request.println("Soy la pagina "+valor).println("<br>"). entonces al resultado se le suma uno y se obtiene el número de paginas a mostrar.

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

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.

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

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

6.Autor: Luis Felipe Wanumen Silva 58 4. int actual = Integer. tenemos limite_inferior = actual*tamano_paginacion . int siguiente = -1. Enciclopedia Conociendo Curso de Jsp y Servlets .parseInt(valor). int auxiliar = (int)(numero_registros/tamano_paginacion). DEPENDIENDO LA PAGINA ACTUAL. int paginas_usuario = 0. int limite_inferior = 0. String valor = request.println("<br>"). int numero_registros = 29.getParameter("p"). int limite_superior = 0. int anterior = -1. out. A nivel de código tenemos pues las siguientes mejoras: <% int tamano_paginacion = 4. out. Y para el registro final tenemos en forma análioga: limite_superior = actual*tamano_paginacion.println("Soy la pagina "+valor). 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.tamano_paginacion+1.

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

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

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

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

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

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

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

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

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. El código de nuestra definición de la etiqueta se muestra a continuación: etiquetillas.jsp” invoquen etiquetas al estilo html. lo primero que tenemos que hacer es crear una definición de la etiqueta en un archivo llamado “etiquetillas. PRIMER EJERCICIO DE ETIQUETAS JSP Supongamos que vamos a crear una etiqueta JSP llamada “TagMio1”.1//EN" "http://java.dtd"> <taglib> <tlibversion>1.1. El archivo anterior también esta indicando Enciclopedia Conociendo Curso de Jsp y Servlets . Inc.Autor: Luis Felipe Wanumen Silva 71 5. ETIQUETAS JSP Las etiquetas jsp permiten que una aplicación java con paginas “.tld <?xml version="1.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.sun.2</jspversion> <shortname>capitulo6</shortname> <info> Librería de Etiquetas </info> <tag> <name>TagMio1</name> <tagclass>carpeta.com/dtd/web-jsptaglibrary_1_2.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”.TagMio1</tagclass> <bodycontent>empty</bodycontent> <info>Etiqueta simple de saludo</info> <!-. 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.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems.

tagext. out.println( "<table border=1>" ).jsp.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 “.jsp. } public int doStartTag() throws JspTagException { try { JspWriter out = pageContext. if( nombre != null ) { out. } else { out.getMessage() ).println( "<tr><td>Hola Mundo de etiquetas JSP</td></tr>" ).getOut(). } } 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.getMessage() ).getOut(). import javax. } public int doEndTag() throws JspTagException { try { pageContext. public class TagMio1 extends TagSupport { private String nombre = null.print( "</table>" ). } return( SKIP_BODY ). } } catch( Exception e ) { throw new JspTagException( e.java package carpeta. } public void release() { super. } catch( Exception e ) { throw new JspTagException( e.println( "<tr><td> Hola Tag Mio1" +nombre+ " </td></tr>" ). dicho archivo contiene el siguiente código: TagMio1.release(). Ahora Enciclopedia Conociendo Curso de Jsp y Servlets .class” de nuestra etiqueta java. } public String getNombre() { return( nombre ). } return( SKIP_BODY ).servlet.*.servlet. import javax.*.

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

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 “. El problema viene si se hace una pagina “.tld”.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.jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas. Enciclopedia Conociendo Curso de Jsp y Servlets .jsp” que intente ejecutar el siguiente código: TagMio2.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”.

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 . UN TAG QUE CONSULTA DATOS El deseo en esta parte es realizar un tag que pueda ser invocado tal como muestra la pagina “TagMio2.jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas.3.Autor: Luis Felipe Wanumen Silva 75 5.jsp” a continuación: TagMio2.

sql.//DTD JSP Tag Library 1.java package carpeta.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 .1//EN" "http://java.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems.0</tlibversion> <jspversion>1.TagMio2</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>nombre</name> </attribute> </tag> </taglib> De tal suerte que podremos crear el archivo “TagMio2. import java.dtd"> <taglib> <tlibversion>1.sun.tld <?xml version="1. en este caso vamos a crear un archivo llamado etiquetillas que contendrá el siguiente código: Etiquetillas.2</jspversion> <shortname>capitulo6</shortname> <info> Librería de Etiquetas correspondiente al capítulo 6 </info> <tag> <name>TagMio2</name> <tagclass>carpeta.*. Inc.java” con el siguiente código: TagMio2.com/dtd/web-jsptaglibrary_1_2.

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

java” ubicado como muestra la siguiente figura: Enciclopedia Conociendo Curso de Jsp y Servlets .tld” en el lugar correcto tal como muestra la siguiente figura: De tal suerte que la invocación del archivo “TagMio2. 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.release(). } } En donde se supone que para logar la correcta ejecución del Tag.

jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas.Autor: Luis Felipe Wanumen Silva 79 Podrá ser invocado desde una pagina “TagMio2.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 80 Enciclopedia Conociendo Curso de Jsp y Servlets .

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

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

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

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.6. INGRESAMOS ALGUNOS DATOS Enciclopedia Conociendo Curso de Jsp y Servlets . Nombre varchar(50) ) 6.5.

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

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

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 .

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

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 .

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

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

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 .

Autor: Luis Felipe Wanumen Silva 97 7.4. y específicamente vamos a crear un paquete al interior de la carpeta “Source Packages” Enciclopedia Conociendo Curso de Jsp y Servlets . 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.

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 .

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

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

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

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

stt=this.stt.conectaBd(). } } 106 En donde se presenta un metodo llamado “conectaBd()” que se conecta con la base de datos mediante un origen de sistema llamado “origen”. c.out. } // Cierra Inserta public static void main(String[] args) { // TODO Auto-generated method stub ConexionBd c = new ConexionBd(). } public int Inserta (String sentencia){ int dat=0. } catch(Exception e){ 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. (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.con.out. System. dat=this. } return resp.error="no se puedo realizar el insert a la bd". if(conectaBd()){ try{ this.java” Antes de explicar detenidamente la clase “Registro. this.println(e).close().Autor: Luis Felipe Wanumen Silva } catch(Exception e){ System. Enciclopedia Conociendo Curso de Jsp y Servlets . this.println("No se puede realizar la conexión").stt.createStatement(). } } // Cierra if return dat.executeUpdate(sentencia). } public ConexionBd() { super().con. Es importante notar que este Bean tiene el metodo main() y esto es valido debido a que este Bean no es un Bean Empresarial.close().

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

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. Enciclopedia Conociendo Curso de Jsp y Servlets .

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

Cuando la pagina JSP recibe valores para las variables “codigo”.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. en nuestro caso estamos diciendo que la referencia a este Bean se pierde cuando se pasa a otra pagina jsp. 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.9.Autor: Luis Felipe Wanumen Silva Con la directiva <%@ page language="java" import="java. “page”. “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. 7. Otros tipos son: “sesion”. “request” y “application”. 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?.* %> 110 Se incorporan librerías y no es posible usar este tipo de inclusiones para incluir otros archivos que cambian o sean dinámicos. Scope: Duración de la referencia a este Bean.util.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. PASO 9: ENSAMBLE Y DESPLIEGUE DE LA APLICACION Enciclopedia Conociendo Curso de Jsp y Servlets .

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 . 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 112 7. 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.10.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 .

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 .

addCookie(c4).servlet.*.*. resp. HttpServletResponse resp) throws ServletException. Cookie c1 = new Cookie("Nombre1". resp. resp."Silva"). MANIPULACION DE COOKIES Y SESIONES 8. 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. out = resp. i < cookies.setContentType("text/html"). public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest req. IOException { PrintWriter out. Cookie c4 = new Cookie("Apellido2".Autor: Luis Felipe Wanumen Silva 114 8. resp.getCookies()."Felipe").servlet. 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. import java. CREACION DE UNA COOKIE DESDE UN SERVLET El siguiente ejemplo muestra como crear cookies desde un servlet.*.println("<h1>Mostrando Cookies</h1>").addCookie(c1).http. Cookie c2 = new Cookie("Nombre2". i++) { Cookie c = cookies[i].length.getWriter(). import javax. Cookie c3 = new Cookie("Apellido1". El ejemplo completo es el siguiente: import javax.addCookie(c2). resp.addCookie(c3)."Wanumen").1.io."Luis"). Cookie[] cookies = req. for (int i = 0. Enciclopedia Conociendo Curso de Jsp y Servlets . 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.setAttribute("Nombre". %> Al ejecutar la pagina anterior obtenemos un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets ."Luis Wanumen").println(name + " = " + value).getValue().getName().2. out. 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. String value = c. 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”.Autor: Luis Felipe Wanumen Silva String name = c. 115 } } } 8.

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

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

.Autor: Luis Felipe Wanumen Silva 118 9....... ubicaciones.. PRIMEROS PASOS Usamos en primera medida el paquete java. ELABORACION DE UN CHAT POR PASOS 9... y en fin... Sentencia.. Sentencia.... inmediatamente se ejecutan las sentencias que estan en el el bloque match(Exception e). nos permite el manejo de URL. } catch(Exception e ){ } Lo que hace es intentar ejecutar las sentencias que se encuentran dentro del try. y estados de conexiones... 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.1.... Sentencia..net que nos permite manejar conexiones con equipos. Recordemos que la sentencia: try{ Sentencia.. Enciclopedia Conociendo Curso de Jsp y Servlets ...

} 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 . usando las siguientes instrucciones: InputStream recibir = ap_cliente1. while(true){ int c = recibir. if(c==-1) break. En el momento que un cliente se conecte.Autor: Luis Felipe Wanumen Silva 119 9. System.accept().2.read().println((char)c).getInputStream(). el servidor podrá ejecutar la siguiente línea: Socket ap_cliente1 = ssock. 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. el sistema creará un “ServerSocket” que estará escuchando por el puerto 210 ssock = new ServerSocket(210). 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”.out. UN EJEMPLO DE UN CLIENTE Y UN SERVIDOR El siguiente es un ejemplo de una aplicación cliente y una aplicación servidora.

net.getOutputStream(). a continuación se muestra el código de la aplicación que reside en el lado del servidor: Clase3. System.getBytes().java public class Clase3 { public static void main(String[] args) { // Create application frame.show(). byte[] bytes_enviados = salida. 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”. frame.*.java import java. // Show frame. Enciclopedia Conociendo Curso de Jsp y Servlets . envia.210). OutputStream envia = cliente.println(new String(bytes_enviados)).out. Ahora bien. el sistema envie “Hola” al servidor.Autor: Luis Felipe Wanumen Silva 120 String salida = "Hola". cliente = new Socket("xp".write(bytes_enviados). Clase3Frame frame = new Clase3Frame(). con el ánimo de lograr la mayor comprensión del tema por parte del amigo lector / estudiante. } } Clase3Frame.

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

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

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

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

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

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”. 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. pero esto en últimas es puro maquillaje de interfaz gráfica. } } Cuando el Servidor detecta que ha llegado un cliente. el anterior código en esencia no es largo. Enciclopedia Conociendo Curso de Jsp y Servlets . Espero que el ejercicio halla sido de agrado para el lector. Para el caso específico de nuestro ejemplo.Autor: Luis Felipe Wanumen Silva 126 System. 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”. Como el amigo lector / estudiante pudo observar. lo que hace es atenderlo y recibe lo que éste le esté enviando.exit(0).

System. public class Servidor { public Servidor(){ try{ ServerSocket objetoServidor = new ServerSocket(80). int num_cliente = 1. } } Enciclopedia Conociendo Curso de Jsp y Servlets .println("No pude crear el objeto servidor").out. System.*.accept(). } } catch(Exception e){ System.out.println("Pude crear el objeto servidor").3. num_cliente ++.Autor: Luis Felipe Wanumen Silva 127 9.accept().out. } Espera a que un cliente se conecte con el servidor y cuando se conecta imprime el numero del cliente.net. } } // Cierra public Servidor() public static void main(String[] args) { System. 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.println("Ha llegado el cliente "+num_cliente). 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.out.out. aumenta el contador de clientes y espera a que otro cliente se conecte y asi sucesivamente hasta que se termine abruptamente del programa. while(true){ Socket refCliente = objetoServidor.println("Hola Soy el SERVIDOR"). Servidor principal = new Servidor(). acepta dicha conexión. System. num_cliente ++.

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

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

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

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

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

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. 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. En terminos graficos la situación es la siguiente: apCabeza Cuando no ha llegado cliente alguno. Esto se logra por medio de una clase nueva llamada “LISTACLIENTES”. la cual contiene una subclase llamada “NODOCLIENTE”. 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 133 9.

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 .Autor: Luis Felipe Wanumen Silva 134 Para el primer cliente la situación es la siguiente.

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

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

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

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

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

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

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

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

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

2. activa. DESCRIPCION El ejemplo que se muestra a continuación realmente solamente implementa en un solo sentido el flujo de información. debido básicamente que se presume mas experiencia de los desarrolladores. 10. 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. Es importante recordar que en algunas metodologías se es mas riguroso en el modelamiento que en otras. 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. debido a que una coneccion con un servidor tiene varios estados. porque si asi fuera se extenderia tanto como un documento de soporte a una aplicación y esto se escapa del presente material. 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.1. La otra parte en donde el servidor envía información al cliente no se ha tenido en cuenta. en tanto que en RUP hay menos rigurosidad.1.1. 10. por ejemplo en RUP hay mas rigurosidad en el modelamiento. 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. 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. y los servidores solamente reciben la información y la manipulan. desactiva o en cualquier otro estado.Autor: Luis Felipe Wanumen Silva 144 10. Para hacer metodologicos y mas claros. EL LADO DEL SERVIDOR ES: Enciclopedia Conociendo Curso de Jsp y Servlets . a saber una coneccion puede estar suspendida. es decir los clientes se conectan e intentan enviar flujos de información a los servidores.1. Obviamente el ejemplo no es lo mas completo. pero de todas formas en ambas se requiere modelamiento.

caso en el cual no hay que volver al estado de iniciado ni ninguno de los anterior. 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. El estado “recursivo” es presenta cuando se estan enviando datos. Mi nuevo estado es denegado Enciclopedia Conociendo Curso de Jsp y Servlets .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. sino que se puede seguir en dicho estado a menos que se caiga la coneccion y se pasaria al estado de desactivado.

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

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

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. Button boton1 = new Button("Enviar").awt.java y Cliente.awt.*.Autor: Luis Felipe Wanumen Silva 148 10.java import java. import java. public class MyApp extends Frame { TextField texto = new TextField(" ").java Archivo MyApp.event. Cliente cliente = new Cliente().*. // Evento objEvento = new Evento(). Panel panel1 = new Panel(). Enciclopedia Conociendo Curso de Jsp y Servlets .3.1.

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

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

Observese la continuidad del estado enviandoDatos. caerá en el agua y se ahogará.1. Enciclopedia Conociendo Curso de Jsp y Servlets . La rampa tiene cinco pasos de ancho y 15 de largo. se ahoga Si el pirata da mas de 15 pasos hacia delante estará a salvo. pero si da más de 15 pasos hacia delante estará a salvo a bordo de su barco. Cuando el pirata se cae.2. el programa observa si se ha recibido aceptación por parte del servidor y en este caso pasa al estado de aceptado. 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. 10. IMPORTANCIA DEL DIAGRAMA DE CLASES EN EL MODELAMIENTO DE UN PROGRAMA DE UN PIRATA 10.2. 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. 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.Autor: Luis Felipe Wanumen Silva 151 El primer estado es un estado desactivo el del sobket que envia. Comenzamos a observar al pirata cuando está en el extremo de la rampa que se apoya sobre el muelle. • • • • • • • • • • • Un pirata ebrio se tambalea Un pirata sube por una rampa La rampa tiene cinco pasos de ancho y 15 de largo.2. Pero tan pronto se crea el socket. Cuando está a salvo no se ahoga El pirata en el barco estará a salvo. 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. PLANTEAMIENTO DEL ENUNCIADO Un pirata ebrio se tambalea al subir por una rampa del muelle a su barco. ESTABLECIMIENTO DE FRASES IMPORTANTES. Si da más de dos pasos hacia la izquierda o la derecha. debido a que no se ha creado.

ESTABLECIMIENDO DE CLASES pirata pos_x : int = null pos_y : int = null peso : int = 75 estado_vida : boolean = true moverse(int. 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. int) : void informar_caer_al_mar: void() Enciclopedia Conociendo Curso de Jsp y Servlets .2.2. 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.Autor: Luis Felipe Wanumen Silva 152 10.

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

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

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

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

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

Ahora bien. (que en este caso es la posición roja).2. puede desplazarse mediante las teclas de dirección del teclado y de esta manera podrá mover el pirata.Autor: Luis Felipe Wanumen Silva 158 10.4. 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. se obtiene un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets . el usuario. 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. Esto para el caso del programa que estamos explicando indica que el pirata se encuentra en dicha posición.

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.

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. Enciclopedia Conociendo Curso de Jsp y Servlets .

1 MyApp tablero : canvitas = new avioncito Curso de Jsp y Servlets : avion = new MyApp() main() . 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.1 Enciclopedia Conociendo 1.1... IMPORTANCIA DEL DIAGRAMA DE CLASES EN EL MODELAMIENTO DE UN PROGRAMA DE UN AVION 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.3.Autor: Luis Felipe Wanumen Silva 161 10.3.

3.awt. rectangulo cola = new rectangulo().*. Enciclopedia Conociendo Curso de Jsp y Servlets .event. int puntica[][].Autor: Luis Felipe Wanumen Silva 162 10. int cuerpito[][]. Veamos pues: avion.java import java. 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. rectangulo cuerpo = new rectangulo().applet. import java. int y = 400.2. triangulo ala_inferior = new triangulo().*. import java. int matriz[][] = new int[17][4]. int colita[][]. public class avion{ Graphics h. A continuación se muestran pues los contenidos de cada uno de los archivos que llevan a solucionar el problema del avión. por lo menos si asegura ser la mejor opción cuando se requieran hacer modificaciones al respecto. triangulo ala_superior = new triangulo(). triangulo punta = new triangulo(). 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.awt.*.

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

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

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

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

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

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

out.out. } }// Cierra if tipo == "punta" public void ajustarse(String tipo. posx1.out.equals("punta")){ posx1 = posx . posx2 = body. posx1 = body.out. posx2 = posx .posy. posy1.ancho/6.equals("ala_superior")){ posy = body.out. posy1.println("posx1 = "+ posx1 ). posy. System.ancho/3 + (int)body. }// Cierra if tipo == "ala_superior" if(tipo. posx1.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. posy2 = body.body. posy1 = body.println("posx2 = "+ posx2 ).posx + (int )body. System.println("posy2 = "+ posy2 ). return pos. System. posy2 = posy + (int)alto/2. System. posx = body.ancho/3.ancho/3. posy.posx + (int)body.println("posy = "+ posy ).println("posx = "+ posx ).posy. posx2.(int)alto/2.posy . rectangulo body){ if(tipo. posy2.(int)alto.ancho/3 + (int)body. System. posy2. } // Cierra int[][] devolver_grafica public void ajustarse(String tipo){ if(tipo.posx + (int)body. posx2.(int)alto. posx. posy1 = posy .println("posy1 = "+ posy1 ).alto*2. System.equals("ala_inferior")){ Enciclopedia Conociendo Curso de Jsp y Servlets .out.

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

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

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

sun.get("ftp1. FileOutputStream sale =new FileOutputStream("d:\\a. java.write(h).ftp.net. //DataInputStream t=3Dnew h. } try { TelnetInputStream in = client. Enciclopedia Conociendo Curso de Jsp y Servlets .read(h).1.DataInput. java. try { client.io.*.io. import import import import import import java.txt").udistrital. ENVIO DE ARCHIVOS POR FTP 12.*.out. FtpClient client =new FtpClient().Autor: Luis Felipe Wanumen Silva 179 12.login(user.println(in.openServer(server). } catch (IOException e) { e.edu. String user = "lwanumen". //while(t=in.TelnetInputStream. passwd). byte []h=new byte[100]. String passwd ="1234".IOException.cd("LUCHIN").).io.printStackTrace(). i=in.*. CONECTARSE A SERVIDOR FTP El siguiente ejemplo muestra como conectarse a un servidor FTP.io. java.*.binary().DataInputStream. 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.toString(). client. int i. client.net.co".txt"). client.read()) //System. public class MyApp { public static void main(String[] args) { String server ="gemini. sale. sun. int t.

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

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

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

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

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

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

rmi. import java. public class archivoO extends UnicastRemoteObject implements archivoI{ public archivoO() throws RemoteException{ super(). } public String Dev_datos(String cliente) throws RemoteException{ return "Hola como estas".server.*.rmi. import java.3. En pocas palabras cuando el cliente solicite algo al servidor.Autor: Luis Felipe Wanumen Silva 186 13. } } Al compilarlo nos debe aparecer una pantalla similar a la siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets . debe primero solicitar que el servidor le cree una instancia “archivoO” para que esta instancia lo atienda por medio de su metodo “Dev_datos()”.*. 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. 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 . public class archivoS{ public static void main(String args[]){ try{ if(System.*.setSecurityManager(new RMISecurityManager()).*.out.4.server.rebind("remotinalias".objetoRemoto).println("Objeto remoto preparado para usarse por parte del cliente").rmi. } archivoO objetoRemoto = new archivoO().Autor: Luis Felipe Wanumen Silva 187 13. System. Naming.getSecurityManager()==null){ System. import java.

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

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

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

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

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

Este comportamiento se debe a que el EJB de Session es concretamente un EJB de Session stateless y no almacena el estado.Autor: Luis Felipe Wanumen Silva 194 Los Session Bean se pueden clasificar en Session Bean Stateless y Session Bean Statefull.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. Los Stateless no garantizan el almacenamiento del estado. 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. No hay que manejar multiples excepciones que ha veces son innecesarias.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. 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. 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.var = 20 x = EJBSession.var = 20 x = EJBSession.getVar() Estado 3 Instancia Local 1 Int var = 20 Cliente 1 Local x = EJBSession. Cuando se trata de Bean tipo statefull. Se pude tener un EJB desde afuera del contenedor EJB Enciclopedia Conociendo Curso de Jsp y Servlets .

195 14.0 se trabaja programación orientada a atributos. 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 Con EJB3.2.

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 .

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

import javax. import javax.Stateless. /** * * @author Luis Felipe Wanumen */ @Stateless public class NewSessionBean implements NewSessionRemote { public String getMessage() { return "Hola Bean de Mensajeria".Autor: Luis Felipe Wanumen Silva } Le modificamos la parte del return y nos queda algo similar al siguiente: 204 /* * To change this template.ejb. /** * * @author Luis Felipe Wanumen */ @Remote public interface NewSessionRemote { String getMessage().Remote. } Después podemos crear un Servlet Enciclopedia Conociendo Curso de Jsp y Servlets . choose Tools | Templates * and open the template in the editor. */ package paquete1. choose Tools | Templates * and open the template in the editor. } // Add business logic below. (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. */ package paquete1.ejb.

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

IOException.ServletException.servlet.io. // import stateless.HttpServlet.servlet. import javax. */ package paquete1. import java. Creamos un servlet llamado “TestServlet” con el siguiente codigo: /* * To change this template.EJB.http. choose Tools | Templates * and open the template in the editor.TestEJBRemote.servlet.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.ejb.PrintWriter. import javax. import java.servlet.HttpServletRequest.HttpServletResponse. import javax.io. import javax. /** * * @author Luis Felipe Wanumen Enciclopedia Conociendo Curso de Jsp y Servlets .http. import javax.http.

println("<title>Servlet TestServlet</title>"). out. HttpServletResponse response) throws ServletException. out.println("<head>").println("</body>"). @Override protected void doGet(HttpServletRequest request.println("</html>"). IOException { response. out.setContentType("text/html. out.println("<body>").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. PrintWriter out = response. } } 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 .charset=UTF-8"). out.println("</head>").getMessage()). out.println(testEJB.getWriter().println("<html>"). out. out.

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 .3.Autor: Luis Felipe Wanumen Silva 208 14.

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 .

obviamente esto depende de la instalación). 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.

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 .

Autor: Luis Felipe Wanumen Silva 225 Se le coloca un nombre al JNDI. en este caso “JNDI3” NetBeans comienza a traer las tablas. 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.java /* * To change this template. choose Tools | Templates Enciclopedia Conociendo Curso de Jsp y Servlets .

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

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

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

2. CONFIGURACION PREVIA DEL SERVIDOR Primero se observa que el servidor tenga correctamente configurada la tarjeta de red. 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 .

3.http.apache.transport.SimpleAxisServer –p 8080 Enciclopedia Conociendo Curso de Jsp y Servlets .axis. 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.Autor: Luis Felipe Wanumen Silva 238 15. 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

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

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.

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.jar Enciclopedia Conociendo Curso de Jsp y Servlets .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. que fueran compatibles. se copiaba. la aplicación por tanto no se verá y se tuvieron que instalar otras versiones de AXIS. pero en sí el archivo estaba dañado. dicho archivo conflictivo fue: mail. debido a que el servidor si no funciona correctamente.

org/axis/wsdd/" xmlns:apachesoap="http://xml.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/xml-soap" Enciclopedia Conociendo Curso de Jsp y Servlets . procedí a bajar de otro sitio el AXIS.apache.apache.

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

Autor: Luis Felipe Wanumen Silva 262 ¡Error!Referencia de hipervínculo no válida. <wsdl:operation name="AdminService"> <wsdlsoap:operation soapAction="" /> Enciclopedia Conociendo Curso de Jsp y Servlets . <wsdl:portType name="Admin"> ¡Error!Referencia de hipervínculo no válida.org/soap/http" /> ¡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. <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.xmlsoap.

<wsdl:output name="AdminServiceResponse"> <wsdlsoap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> ¡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. <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.

Autor: Luis Felipe Wanumen Silva 264 15. } } Enciclopedia Conociendo Curso de Jsp y Servlets .6. 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 + "!").

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

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

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

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

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 .out.invoke( new Object [] { "Pepe" }). } } Y antes de ejecutar el servidor. System. se verifica si el servidor de servicios osea el web service funciona correctmente.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 .

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

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 .Autor: Luis Felipe Wanumen Silva 273 Y con el ánimo de hacer la vida bastante fácil.

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".Autor: Luis Felipe Wanumen Silva 275 El nombre del archivo bat. el cual se muestra a continuación: Enciclopedia Conociendo Curso de Jsp y Servlets .

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 .

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

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

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

CONSTRUCCION DE LA CLASE QUE VAMOS A PROBAR Vamos a construir una clase denominada “Lista” que va a contener elementos de tipo Nodo. 16.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. } } // Cierra class Nodo Y ahora si la clase “Lista” propiamente dicha que contiene el siguiente código: Lista.java public class Nodo{ Nodo siguiente.2.java import java. import java. public Nodo(){ siguiente = null.*.awt.event.*. int valor. Obviamente esto permite acelerar el proceso de testeo de aplicaciones. los cuales tienen la estructura determinada por la siguiente clase: Nodo.awt. Enciclopedia Conociendo Curso de Jsp y Servlets . debido a que permite aplicar todo un subárbol o un árbol a un conjunto de clases.

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

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

debido a que es con la invocación de este método que vamos a comparar dos listas. La lista permite el ingreso de elementos en forma ordenada y ascendente según el valor contenido en la variable “valor” de cada Nodo. Esta ultima parte se explicara con detalle cuando se este explicando el testeo de la aplicación. teniendo en cuenta que el comienzo de la lista esta referenciado por una variable llamada “cabeza”. 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”. La inserción de elementos en la lista se hace con el método “ingresarNodo(int)”. tal como se muestra a continuación: public ListaTest(String nombre){ super(nombre). el cual retorna “true” cuando existe en la lista un Nodo cuyo valor es igual al solicitado. el método retorna “false” en caso que no exista coincidencia alguna. El amigo lector / estudiante se estará preguntando: ¿Por qué incluir mas métodos si solamente se va a probar el método “ingresarNodo(int)”?. para ello comenzamos diciendo que debemos usar el paquete “framework” como se muestra a continuación: import junit.framework. De otra parte el método “boolean buscarNodo(int valor)” es necesario para que funcione el método “ingresarNodo(int)”. 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. es porque existe por lo menos un primer elemento “cabeza” que se debe almacenar en mencionada lista. una que se construye manualmente y otra que se construye invocando el método “ingresarNodo(int)” de la clase “Lista”. 16.3. 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. Detalladamente podemos decir que el método “String getListado()” se coloco como un ejercicio suelto porque ni es necesario para que funcione Junit. 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”. Dicho método verifica que no existan elementos en la lista mediante la invocación del método “boolean buscarNodo(int valor)”.*. } // Cierra constructor ListaTest() Enciclopedia Conociendo Curso de Jsp y Servlets . ni es necesario para que funcione la inserción.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. El constructor de la clase “Lista” es necesario simplemente para garantizar que cuando se cree una lista.

Nodo().ingresarNodo(nodo5Lista2. Nodo(). 5. Nodo().siguiente = nodo2Lista1.ingresarNodo(nodo2Lista2. final static Nodo nodo5Lista2 = new Nodo(). 4.ingresarNodo(nodo3Lista2. final static Nodo nodo4Lista2 = new Nodo().valor nodo3Lista2. debido a que se ha hecho en forma manual: Lista listaBIEN = new Lista(nodo1Lista1). Creamos manualmente 5 nodos con el estereotipo “static”: final static Nodo nodo1Lista2 = new Nodo().siguiente = nodo3Lista1. nodo3Lista1.valor). Les asignamos unos valores: nodo1Lista2. Enciclopedia Conociendo Curso de Jsp y Servlets .valor nodo4Lista2. Y la enlazamos manualmente tal como se muestra a continuación: nodo1Lista1. 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. listaPROBANO. 2.valor). Nodo(). Ahora bien. listaPROBANO.valor = = = = = 1.valor). listaPROBANO. 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().valor nodo2Lista2.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”.valor nodo5Lista2. listaPROBANO. Veamos entonces detenidamente como es que funciona el método para el testeo. 3.valor).ingresarNodo(nodo4Lista2. final static Nodo nodo3Lista2 = new Nodo().siguiente = nodo4Lista1. final static Nodo nodo2Lista2 = new Nodo(). listaPROBANO.valor). Los ingresamos a la lista usando el metodo “ingresarNodo(int)”: Lista listaPROBANO = new Lista(nodo1Lista2).ingresarNodo(nodo1Lista2. vamos a proceder a realizar una lista que con seguridad sabemos que forma tiene. nodo2Lista1.

nodo4Lista1. nodo3Lista1. Nodo().valor nodo5Lista1.java import junit. 2.framework. Junit se encargara automáticamente de verificar que el método funcione como queremos que funcione.siguiente nodo2Lista1.valor nodo3Lista2. Veamos pues el código completo de nuestra clase de testeo: ListaTest. 3. 1.Autor: Luis Felipe Wanumen Silva nodo4Lista1.valor nodo4Lista2. public void testIngresarNodos(){ nodo1Lista1.valor nodo1Lista2. Nodo(). . Nodo(). Nodo().siguiente nodo1Lista1. 3. Nodo().valor nodo4Lista1.*. 5. nodo5Lista1. Nodo().valor nodo3Lista1. 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.valor nodo2Lista1. 5. 2. Curso de Jsp y Servlets = = = = nodo2Lista1.valor nodo2Lista2. 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)”.siguiente nodo3Lista1. 4. Nodo().siguiente nodo4Lista1.valor Enciclopedia Conociendo = = = = = = = = = 1. 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(). Nodo().siguiente = nodo5Lista1. Nodo().

Lista listaPROBANO = new Lista(nodo1Lista2). ELABORACION DEL PROGRAMA QUE EJECUTA LA PRUEBA Ya hemos creado la clase que vamos a probar.*.5. EJECUCION DEL TESTRUNNER Al ejecutar el anterior programa tenemos un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .ingresarNodo(nodo5Lista2. 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. public class MyApp{ public static void main (String[] args) { String[] nombresTest = {ListaTest.4. import java.java import java. } // Cierra void testIngresarNodos() public ListaTest(String nombre){ super(nombre).valor). } } // 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”. Lista listaBIEN = new Lista(nodo1Lista1).comparar(listaPROBANO)).swingui.awt.main(nombresTest). assertTrue(listaBIEN. junit.valor). listaPROBANO.valor = 4. listaPROBANO.awt. listaPROBANO.Autor: Luis Felipe Wanumen Silva nodo5Lista2.*.class.valor).ingresarNodo(nodo3Lista2.getName()}.ingresarNodo(nodo1Lista2.valor).TestRunner. listaPROBANO.ingresarNodo(nodo4Lista2.valor). listaPROBANO.event. } // Cierra constructor ListaTest() } // Cierra class ListaTest 295 16. 16. dicho programa es el siguiente: MyApp.ingresarNodo(nodo2Lista2.

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 .

event. if(cabeza==null){ return buscado. Para comprobar que esto realmente es cierto vamos a modificar la clase “Lista” y la dejaremos tal como se muestra a continuación: Lista.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. import java.*. } // Cierra if externo else{ Nodo correr = cabeza.java import java. public boolean buscarNodo(int valor){ boolean buscado = false. Nodo ultimo = null. public class Lista{ Nodo cabeza = null.*. Enciclopedia Conociendo Curso de Jsp y Servlets .awt.

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

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

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 .

public class Celular1 extends MIDlet { public Celular1() { // constructor } public void startApp() { Canvas canvas = new MiTablero().setCurrent(canvas).drawString("Pantallazo 1". 0. } public void pauseApp() { } public void destroyApp(boolean unconditional) { } class MiTablero extends Canvas { public void paint(Graphics g){ // Establece color a AZUL g. 255). INTRODUCCION A LAS APLICACIONES MOVILES 17.setColor(0. g.*.LEFT). Display display = Display. 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. 0. y se podría decir que los “MIDLETs” son aplicaciones que corren en dichos dispositivos. 0. g.fillRect(0. 0.microedition.lcdui.getDisplay(this). display.1. g. } } Enciclopedia Conociendo Curso de Jsp y Servlets .microedition. Ahora bien.Autor: Luis Felipe Wanumen Silva 302 17. getHeight()). import javax.midlet. (int)(getWidth()/2).*.TOP | g. PINTAR MEDIA PANTALLA CON UN LIENZO Importante decir que las aplicaciones principales que se pueden hacer en dispositivos ligeros se llaman “MIDLET”.

Display display Display. getHeight()). display. 0. de tal forma que las siguientes cosas que pinte se pintaran de color azul. 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. Usando la referencia al dispositivo ligero se colocan los objetos previamente creados. g.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.LEFT). 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. Se crean los objetos que se quieren colocar en la pantalla.TOP | g. Se crean los objetos que se quieren colocar en la pantalla. = Hay que tener en cuenta que el MIDLET del que estamos hablando también define otro método que se llama “Celular1()”. 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. 0.getDisplay(this). En este caso este lienzo define el modo grafico en color azul. a continuación se hace un rectángulo rellenado de color azul. “Es como hacer un applet y colocarlo como un lienzo en la pantalla del dispositivo ligero”.fillRect(0. 0. Esto es una idea intuitiva que ayuda a comprender el funcionamiento de los lienzos en Java.drawString("Pantallazo 1". 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. 255).setCurrent(canvas). razón por la cual en este momento tan solo nos limitaremos a decir que es el método constructor del MIDLET. (int)(getWidth()/2). Usando la referencia al dispositivo ligero se colocan los objetos previamente creados. CODIGO Canvas canvas = new MiTablero(). diremos que se comporta como un applet y por tanto tiene los métodos normales de un applet.setColor(0. g. 0. pero este método no hace labor alguna. g. } } Esta clase es similar a un applet y para los amigos familiarizados con Java. 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 .

Autor: Luis Felipe Wanumen Silva 304 La pregunta es: ¿Por qué no aparece el letrero: “Pantallaza 1”?. 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 . la respuesta es: porque esta del mismo color del fondo.

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

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

0).microedition. Canvas pizarra2 = new Tablero2(). 255). (int)(getWidth()/2). display.setColor(0. 0. // Establece color azul verdoso g. COLOCAR DOS LIENZOS En forma análoga al ejercicio. display. 0.drawString("Pantallazo 1".fillRect(0. 0. } // Cierra void paint() } // Cierra class Tablero1 class Tablero2 extends Canvas{ public void paint(Graphics g){ // Establece color a VERDE g. 255. g.setColor(0.TOP | g. getHeight()). 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. } public void pauseApp() { } public void destroyApp(boolean unconditional) { } class Tablero1 extends Canvas{ public void paint(Graphics g){ // Establece color a AZUL g.getWidth() . // Establece color azul verdoso g.lcdui.drawString("Pantallazo 1". g.LEFT). getHeight()). g. 0. g.setColor(0.Autor: Luis Felipe Wanumen Silva 307 17.fillRect((int)(getWidth()/2).*.setCurrent(pizarra2). (int)(getWidth()/2). Display display = Display.*. 255. 255). } // Cierra void paint() } // Cierra class Tablero1 } // Cierra class Celular1 Enciclopedia Conociendo Curso de Jsp y Servlets . g.midlet. public class Celular1 extends MIDlet { public Celular1() { // constructor } public void startApp() { Canvas pizarra1 = new Tablero1(). import javax.TOP | g.LEFT). 0. 0. g. 0).2.setCurrent(pizarra1).microedition.getDisplay(this). 0.setColor(255.

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

display. 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.getWidth() . 0). } // Cierra void paint() Enciclopedia Conociendo Curso de Jsp y Servlets . 0. (int) (getHeight()/4)).setCurrent(pizarra2). g.microedition. g. } // Cierra void paint() } // Cierra class Tablero2 class Tablero3 extends Canvas{ public void paint(Graphics g){ // Establece color a ROJO g.setCurrent(pizarra1).255. getWidth().3. 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.getDisplay(this). Display display = Display.midlet. (int)(getHeight()/2)). display. } public void pauseApp() { } public void destroyApp(boolean unconditional) { } class Tablero1 extends Canvas{ public void paint(Graphics g){ // Establece color a AMARILLO g. display. (int) (getHeight()/4)).getWidth() . es por esta razón.lcdui.fillRect(0.setColor(0. sino solamente rectángulos.setCurrent(pizarra3). 0. Canvas pizarra2 = new Tablero2(). } // Cierra void paint() } // Cierra class Tablero1 class Tablero2 extends Canvas{ public void paint(Graphics g){ // Establece color a AZUL g.fillRect(0. import javax.Autor: Luis Felipe Wanumen Silva 309 17.*. 0.setColor(255. (int)(3*getHeight()/4).setColor(255. g. public class Celular1 extends MIDlet { public Celular1() { // constructor } public void startApp() { Canvas pizarra1 = new Tablero1().fillRect(0.microedition.0). 255). Canvas pizarra3 = new Tablero3().*. (int)(2*getHeight()/4).

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 .

*. detenidamente el siguiente código: import javax. En esta ocasión vamos a colocar una forma al interior de una aplicación J2ME.microedition.4. } 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 . Veamos pues. } // Cierra public Celular1 public void startApp() { display = Display. public class Celular1 extends MIDlet{ Display display.setCurrent(forma). que equivalen a las ventanas Windows (“por hacer una comparación”). public Celular1() { // constructor forma = new Form("Primer forma").Autor: Luis Felipe Wanumen Silva 312 17.midlet.microedition.*.getDisplay(this).lcdui. COLOCAR UNA FORMA EN LA PANTALLA En los dispositivos ligeros también se pueden colocar formas. Form forma. import javax. display.

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).Autor: Luis Felipe Wanumen Silva 314 Observe amigo lector / estudiante que si no hubiera sido por la instrucción siguiente: display. Enciclopedia Conociendo Curso de Jsp y Servlets .

*. podemos usar el código del ejercicio anterior para añadir un StringItem a la forma creada en mencionado ejercicio. public class Celular1 extends MIDlet{ Display display. } 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 . display. Con lo cual podemos obtener un código fuente similar al siguiente: import javax.microedition. } // Cierra public Celular1 public void startApp() { display = Display.5. pero no se habría podido ver el efecto descrito en este ultimo pantallaza.getDisplay(this). Form forma.midlet. cadena1 = new StringItem("". 17.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.setCurrent(forma).*.lcdui. public Celular1() { // constructor forma = new Form("Primer forma"). StringItem cadena1.microedition. forma.append(cadena1)."Cad1"). import javax. AÑADIR UN STRING A UNA FORMA Continuando con el ejemplo anterior.

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

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

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

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 .

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. obteniendo un resultado similar al siguiente: Enciclopedia Conociendo Curso de Jsp y Servlets .

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 .

y finalmente si se presiona el botón “3” se ejecuta la instrucción: cadena1.setText("2"). 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. con lo cual obtenemos el resultado: Enciclopedia Conociendo Curso de Jsp y Servlets . hemos presionado el botón “2”.setText("3").

es decir para este caso cuando este seleccionada la opción “2”: Enciclopedia Conociendo Curso de Jsp y Servlets .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.

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

while((caracter= objetoEntrada. private Form formulario.*. HttpConnection objetoConector = null. javax. javax. private TextField caja2. objetoConector = (HttpConnection)Connector.microedition.Autor: Luis Felipe Wanumen Silva 325 18. codi = caja1. InputStream objetoEntrada = null. 1). public class Hilo extends Thread{ public void run(){ try{ StringBuffer objetoBuffer = new StringBuffer().append((char)caracter).getString(). int caracter=0. objetoEntrada = objetoConector.*.1. java. Veamos: import import import import javax.openInputStream(). String codi.open(direccion+codi).*.microedition. Enciclopedia Conociendo Curso de Jsp y Servlets . 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. private String direccion = "http://localhost:1900/examples/servlet/MyApp?codigo=". } caja2.*. 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.read())!=-1){ objetoBuffer.OK.microedition.setString(objetoBuffer.lcdui. private Command comandoBuscar = new Command("Busca". Command.io. 18.toString()). public class Tecno extends MIDlet implements CommandListener{ private TextField caja1.midlet.io.

} public Tecno(){ } public void commandAction(Command c.ANY). 15. formulario.start(). try{ miHilo.setCommandListener(this). Hilo miHilo = new Hilo().setString("Ponchado").getDisplay(this). "". "". formulario.addCommand(comandoBuscar). formulario. formulario. caja1 = new TextField("Cedula". Display. TextField. 15. } catch(Exception e){ } // Cierra catch } // Cierra commandAction } // Cierra Tecno } 326 Enciclopedia Conociendo Curso de Jsp y Servlets .append(caja1).append(caja2). caja2 = new TextField("Nombre".ANY). TextField. Displayable s) { if (c == comandoBuscar) { // caja1.setCurrent(formulario).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").

*.*. import javax. el cual contenga el siguiente código: import javax.microedition.microedition.microedition. import javax.java”.*.*.1.microedition.io. 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. import java.io.Form. 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. import javax. import javax.lcdui.lcdui. Enciclopedia Conociendo Curso de Jsp y Servlets .*. 19. import javax.lcdui.midlet.MIDlet.midlet. import javax.lcdui.Display.microedition.microedition.

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

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

} } 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 . MONTAJE EN EL SERVIDOR DE SERVICIOS WEB Despues dentro de la carpeta AXIS del servidor de servicios web cree un archivo llamado “servicio. interno = "Buenas noches "+nombrecin.jws” que contenga el siguiente código: public class servicio{ public String saludar(String nombrecin){ String interno. return interno. http://localhost:8080/axis/servicio.2.Autor: Luis Felipe Wanumen Silva 330 protected void destroyApp(boolean unconditional) { } protected void pauseApp() { } } 19.

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

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

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 .

private TextField caja1. TECNOLOGIA BLUETOOTH 20.DiscoveryAgent. import javax.Display. Veamos pues todo el código fuente: Bluetooth1.MIDlet. import java.microedition.UUID.io. javax.IOException.io. import javax.DataOutputStream.microedition.LocalDevice. 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.microedition.java import import import import import import javax.bluetooth. private TextField caja6. private LocalDevice localDevice.io.bluetooth.microedition.microedition.microedition.bluetooth. import java. private TextField caja3. private TextField caja4.1.Autor: Luis Felipe Wanumen Silva 336 20.TextField. public class Bluetooth1 extends MIDlet{ public static Display objetoDisplay.lcdui.OutputStream.StreamConnection. import javax.midlet.io.StreamConnectionNotifier. javax.Connector.microedition.lcdui.Form. public static Form objetoForma.io. Enciclopedia Conociendo Curso de Jsp y Servlets . javax. javax. private TextField caja5.io.lcdui. import java. import javax. private TextField caja2.

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

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

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

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

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

println(s). 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 . if(connection != null) connection.getDisplay(this).getLocalDevice(). 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.startInquiry(DiscoveryAgent. en esta seccion se creara un cliente Bluetooth que se comunique con dicho servidor.Autor: Luis Felipe Wanumen Silva System. El cliente inicia en forma similar al servidor buscando su propio dispositivo bluetooth: localDevice = LocalDevice.printStackTrace().getDiscoveryAgent(). if(out != null) out.setCurrent(new Alert("Error: "+e)). } finally { try { if(in != null) in. } catch(IOException e) { e. this).GIAC.close().close().GIAC). } // Cierra catch } // Cierra run } // Cierra class ServidorB 342 20. CREACION DEL CLIENTE BLUETOOTH En la anterior seccion se ha creado un servidor Bluetooth.out.3. discoveryAgent = localDevice. localDevice.close(). } catch(IOException e) { } }// Cierra finally } // Cierra while } catch(IOException e) { e.printStackTrace().setDiscoverable(DiscoveryAgent. Display.

getBluetoothAddress().SERVICIOS. this). String friendlyName = null. DataInputStream in = null. "+transId). El otro metodo que vamos a desarrollar es el metodo “servicesDiscovered” que es invocado automáticamente por bluetooth cuando se encuentran servicios.getFriendlyName(true). busquedas.searchServices(ATRIBUTOS. Enciclopedia Conociendo Curso de Jsp y Servlets . 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.length.out.Autor: Luis Felipe Wanumen Silva 343 de los anteriores metodos un programador le puede colocar codigo que quiera a cada uno de ellos. try { friendlyName = remoteDevice. for(int i=0. i++){ service = servRecord[i]. } catch(IOException e) { } y luego de invocar el metodo “searchServices” aplicado sobre el agente de descubrimiento “discoveryAgent”.NOAUTHENTICATE_NOENCRYPT. en nuestro caso colocamos codigo en dicho metodo que se encargue de obtener la direccion remota de dicho dispositivo: String address = remoteDevice. String url = service. Nuestro metodo “servicesDiscovered” tiene el siguiente codigo: public void servicesDiscovered(int transID.addElement(new Integer(transId)).ServiceRecord[] servRecord) { ServiceRecord service = null. i<servRecord. System. StreamConnection connection = null. DataOutputStream out = null. 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.getConnectionURL(ServiceRecord.println("Comenzada busqueda de serivicios en: "+device+". false). remoteDevice. de tal forma que automáticamente se inicie el proceso de busqueda de servicios sobre este dispositivo bluetooth. igualmente se guarda en un vector el identificador de estos servicios: int transId = discoveryAgent. 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”.

in = connection.io. texto. String s = in. import javax.open(url).flush().microedition. import javax.util.openDataInputStream(). Enciclopedia Conociendo Curso de Jsp y Servlets .close().setString(s).bluetooth. if(connection != null) connection.lcdui. public static final int[] ATRIBUTOS = null.openDataOutputStream(). out.*. import javax. public class ClienteB extends MIDlet implements CommandListener.MIDlet.*.microedition.writeUTF("saludos desde el cliente!").printStackTrace().*.*. } catch(IOException e) { e. } 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.midlet.io.Autor: Luis Felipe Wanumen Silva try { connection =(StreamConnection) Connector. Display. public static final UUID[] SERVICIOS = new UUID[]{ SERVICIO_CHAT }.close().readUTF().getDisplay(this). out = connection. a continuación se muestra el codigo completo de nuestro ciente Bluetooth: 344 import javax.*. DiscoveryListener { public static final UUID SERVICIO_CHAT = new UUID(0x2343).microedition.setCurrent(texto). import java. out. import java. if(out != null) out.close(). int respCode) { } // Cierra void serviceSearchCompleted public void inquiryCompleted(int discType) { } // Cierra inquiryCompleted Para no ir tan lejos. } finally { try { if(in != null) in.

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

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

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

} } } Enciclopedia Conociendo Curso de Jsp y Servlets . 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. public void init(){ add(ta).io. BufferedReader bufer. después de lo cual el navegador enviara un mensaje de confirmación. } catch(Exception e){ ta. A continuación vamos a mostrar un programa tipo Applet que intenta mostrar el contenido de un archivo llamado “a.*. public class MyApp extends Applet { TextArea ta = new TextArea().toString()). FileReader archi.setText(leido). archi = new FileReader(new String("a.txt")).*.awt.applet. import java.setText(e.java import java.Autor: Luis Felipe Wanumen Silva 348 21. String res = "". Con este ejercicio se intentara mostrar que Java es tan flexible que cuando este tipo de funcionalidades de acceder a un archivo se deseen.readLine())!=null){ leido=leido+res+"\n". import java.1. } ta. se pueden usar algunos mecanismos para lograr que dicho applet quede firmado. try{ String leido = "". while((res=bufer. SEGURIDAD EN JAVA 21.*. bufer = new BufferedReader(archi). 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”: MyApp.

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. Para generar el certificado usamos la instrucción: C:\Progra~1\Java\jdk1. 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.6. 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”. 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. Esto simplemente se mostro con el fin de ir comprobando que realmente la clave no puede ser tan 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 .

Observemos por simple curiosidad que pasaria si le colocasemos la palabra “yes”: Enciclopedia Conociendo Curso de Jsp y Servlets .Autor: Luis Felipe Wanumen Silva 353 A la pregunta estado o provincia. 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. 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.

024 bits.Autor: Luis Felipe Wanumen Silva 354 Vemos que vuelve a solicitar los datos. en este caso se recomienda que sea la misma que la del almacen de claves y esto se logra presionando la tecla ENTER. Con todo esto se ha generado el certificado para el applet. 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 . Se solicita entonces la contraseña clave para “aliacin”.

pero hacer que dicha firma quede asociada al mencionado certificado se logra si se conoce la contraseña del almacen de claves. tal como se muestra a continuación: En nuestro caso colocamos la clave “23456” Enciclopedia Conociendo Curso de Jsp y Servlets .6. A este proceso se le conoce con el nombre de firmar el applet.0\bin\jarsigner MyApp.jar aliacin –verbose En donde nos solicita la clave del almacen de claves identificado con el alias “aliacin”. 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.

nos genera el siguiente error: 356 El error se presente debido a que se tiene que modificar el archivo “MyApp.jar”. Esto fue lo que realmente se hizo para que funcionara este ejercicio. Una vez se ha firmado el applet se tiene claro que el certificado expira en seis meses y esto se muestra mediante un Warning. Una vez se ha firmado el applet.Autor: Luis Felipe Wanumen Silva Y a pesar de haberle colocado bien la clave. 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. tal como se muestra en la siguiente figura: Enciclopedia Conociendo Curso de Jsp y Servlets . se puede ejecutar desde el navegador.jar” y esta siendo usado por el navegador.

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. writeUTF Enciclopedia Conociendo Curso de Jsp y Servlets . readUTF Cliente OutputStream salida ObjectOutputStream carritoSalida carritoSalida.

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 .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. 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. pero lo que aparece no es un error.

359 Ahora bien. Enciclopedia Conociendo Curso de Jsp y Servlets . 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.

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. 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 .Autor: Luis Felipe Wanumen Silva 360 Bueno.

google.4.Autor: Luis Felipe Wanumen Silva 361 22. 22. en este caso se aconseja digitar http://localhost Enciclopedia Conociendo Curso de Jsp y Servlets .3. 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. REQUERIMIENTOS Un entorno de desarrollo que soporte servicios web Kit para desarrolladores que proporciona google. OBTENER LA CLAVE DEL API DE GOOGLE MAPS La clave del API de Google Maps se puede obtener en http://code. Una clave para las APIs de google. 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.com/intl/es-CO/apis/maps/signup. se solicita una direccion URL.1. 22. PROGRAMACION CON GOOGLE 22.html Cuando se entra al sitio anterior.2.

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.5.geonames. Google Phone es Android Open Handset Alliance Investigar si esto es verdad Enciclopedia Conociendo Curso de Jsp y Servlets . una de ellas es: http://www.602 Latitud: N 4° 36' 0'' Longitud: W 74° 5' 0'' 22.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.6.102. ALGUNAS COSAS CURIOSAS DE GOOGLE Algunos dicen que google esta desarrollando sistemas operativos como: Goobuntu Google Media Server para dispositivos de salon.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.

Autor: Luis Felipe Wanumen Silva 363 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. YA QUE EL PROGRAMA ES SIMPLEMENTE ESO. Puede funcionar en Windows o en Linux. El parcial es la sustentación del programa. PERO EN REALIDAD ESTO ES UN REQUISITO PARA ENTRAR AL PARCIAL. El motor de BD cualquiera. DESCRIPCION DEL PROGRAMA El programa debe manejar un servidor que sea capaz de pedir solicitudes de varios clientes.1. El servidor valida al usuario basado en el nombre de usuario que halla llegado. UN PROGRAMA. Web o como quiera La condicion Lenguaje JAVA.Autor: Luis Felipe Wanumen Silva 364 23. Awt. PROPUESTA DE PARCIAL PRIMERO EL PARCIAL ES UN SOFTWARE DOCUMENTADO. INVESTIGACIONES PROPUESTAS PARA LOS ESTUDIANTES DE JAVA AVANZADO 23. el servidor no admite en el foro al segundo cliente que tenga un nombre repetido. Enciclopedia Conociendo Curso de Jsp y Servlets . Interfaz com Swing. 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. Si dos usuarios tienen el mismo nombre.

UNA PRIMERA PROPUESTA Este lunes en Ocho 28 Mayo LUNES Por correo luchofelipe2000@yahoo.2.com Minimo Hojas(200) Maximo Hojas (Todas las que quiera) 15 Dias Documento Investigativo (Entregar Digitalizado) ANDREA SANCHEZ. 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 .Autor: Luis Felipe Wanumen Silva Sustentación en grupos. Grupos MAXIMO 3 Fecha 12 de marzo. Celular 315 832 72 69 365 23.

Aportes CAMILO ANDRES CHAVEZ LAURA VELASCO Y ANGELA VARGAS Que se esta haciendo actualmente para ponerle seguridad a los servicios Web. Documentos de Soporte. 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 .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 .

pero los que quieran que lo hagan con . 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. Hacer aplicaciones inalámbricas. Hacer una aplicación cliente que envie y muestre los archivos de un servidor Ftp.4.3. móviles preferiblemente con Java. Enciclopedia Conociendo Curso de Jsp y Servlets . 23.NET. Una vez creada la ontología. 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. Hacer un chat entre dos celulares.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. Obviamente esto se debe hacer si se tiene un modelo definido sobre un problema que se quiera trabajar y modelado correctamente con UML. PROPUESTAS PARA EL SEMESTRE 2007 III Existen algunas propuestas que estoy pensando como son: Manejar Protege para comprender como crear ontologías con protege.

Hacer programas que creen archivos XML usando DOM. buscar y ordenar elementos del archivo XML. Proyecto de aplicaciones de gestion de un servidor ftp desde un movil c. Proyecto de aplicaciones de television digital. Proyecto de gestion con LDAP y Java. Proyecto de aplicaciones de gestion de un servidor de correo desde un movil c. Para manipular y controlar el servidor remoto se puede usar java. 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 Servidor de Streamming c. OTRAS PROPUESTAS. e. buscar y ordenar elementos del archivo XML. h. permitiendo anadir. buscar y ordenar elementos del archivo XML. Si vamos a administrar un servidor de correo habria que entender el protocolo SMTP c3. Proyecto de aplicaciones de gestion de un servidor CUALQUIERA desde un movil d.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. Conjunto de herramientas para JMX es JDMK c6. permitiendo anadir.robot y para que las instrucciones se puedan ejecutar independientemente de cualquier sistema operativo podemos usar SIGAR. Si vamos a administrar un servidor de correo habria que entender el protocolo POP3 c3. PARA TRABAJAR PROYECTO DE MONITOREO DESDE UN MOVIL HAY QUE ESTUDIAR ESTOS TEMAS c1. Hacer programas que creen archivos XML usando SAX. 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. PROPUESTAS PARA EL PRIMER SEMESTRE 2010 I Propuestas de temas para proyectos de grado: a. Si vamos a administrar un servidor de correo habria que entender el protocolo IMAP c4. Proyecto de aplicaciones GSM b. 23. capa de agente y capa de gestion o adaptacion. Proyecto de gesion remota de un equipo desde otro equipo. Proyecto de comercio electronico g. c5. permitiendo anadir. Hay que administrar el servidor usando una tecnologia que permita aprovechar JMX y los agentes inteligentes Enciclopedia Conociendo Curso de Jsp y Servlets . Comprender el protocolo de administracion SNMP c2. f. i.5. Esta arquitectura define la capa de instrumentacion. Proyecto de aplicacion de administracion de turnos en un cafe Internet. Proyecto de tecnologia de agentes speak y de traduccion. Hacer programas que creen archivos XML usando JDOM. controladora y el modelo.

snmp4j.0.net/project/showfiles.wikipedia.enfinity/WFS/Sun_Catalogue-Sun_Catalogue_MXSite/es_ES/-/USD/ViewCatalogBrowse.wikipedia.net/descargar/Informacion+Sistema+Java d.1. API para trabajar SNMP con Java http://www.6.dDNsAAAEUL045G_c2 f. 1. Estudiar las especificaciones JSR para JMX que son: JSR 255 (JMX 2.com/is-bin/INTERSHOP.pgid=Q2ye6_Ocx8nOZgiKCJkpiAe00000iMyu1CV5.sid=rYOP3irSQqWv3mG87UspbrJTxfq 5LnIP_hvXA3lKxfq5Lg==?CatalogCategoryID=nopIBe.net/projects/sigar/files/sigar/1. DE AQUI SE PUEDE BAJAR SIGAR http://sourceforge. y 1.sun.org/ Enciclopedia Conociendo Curso de Jsp y Servlets .3.6/hyperic-sigar-1.zip/download https://sourceforge. UN EJEMPLO USANDO SIGAR http://casidiablo.2) e.php?group_id=172552 c. Para comprender el modelo de capas JMX http://es.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.org/wiki/JDMK http://catalogs.org/wiki/Java_Management_Extensions b. Un Link para comprender que es JDMK http://es.0) JSR 160 JMX Remote API JSR 3 (JMX 1.

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

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

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

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 .

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

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

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

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

Sign up to vote on this title
UsefulNot useful