Você está na página 1de 379

Autor: Luis Felipe Wanumen Silva

ENCICLOPEDIA CONOCIENDO

Prximame nte en Internet y en su librera ms cercana

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

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

CONTIENE CONCEPTOS, EJEMPLOS DE JSP, SERVLETS, BEANS, SOCKETS EJEMPLOS DE REDES Y ALGO MS.

PRIMERA VERSIN AUN NO REVISADA SANTAFE DE BOGOTA D.C. AGOSTO DE 2009.


Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

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 construccin de aplicaciones. Especficamente en el caso del cuadro anterior vemos que las pginas 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 pgina html por lo general enva datos a un servlet, el servlet enva datos al Bean, el bean procesa las solicitudes, devuelve los resultados al servlet y el servlet crea una pgina html para mostrarle al cliente.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

2. SERVLETS SENCILLOS CON CONEXIN A BASES DE DATOS


En esta seccin 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 ms 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

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

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>

En trminos de interfaz de usuario, la pgina anterior tiene un aspecto similar al siguiente:

en la que el usuario puede escribir el cdigo de un estudiante y el nombre. Cuando el usuario haga clic sobre el botn 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

Cuando el usuario haga clic sobre el botn insertar, se llama al servlet denominado inser y se le pasan los datos digitados por el usuario. Veamos pues el cdigo 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

Autor: Luis Felipe Wanumen Silva sentencia1.setString(2, x3); sentencia1.executeUpdate(); sentencia1.close(); conexion_sql1.close(); } // Cierra try catch( Exception e ) { return; } // Cierra catch PrintWriter out; String todo="";

try { Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); conexion_sql=DriverManager.getConnection( "jdbc:odbc:luchodb"," sa","" ); sentencia = conexion_sql.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSe t.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>"; rs.close(); sentencia.close(); conexion_sql.close(); } // 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); Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva }

Observemos que en este caso no hay un mtodo doGet, sino que hay un mtodo doPost, y esto se debe a que el formulario enviaba los datos usando el mtodo post y se hace necesario recibir los datos con este mtodo que es el apropiado para recibir cuando son enviados de esta forma. 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. En el caso del ejercicio suponemos que existe una base de datos denominada colegio, 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. Esto har que nuestra variable conexin_sql1 quede direccionada a dicho orgen de datos y nos permita manipular la base de datos a la que hace referencia dicho orgen de datos. En este caso particular nuestro orgen de datos est con una base de datos en sql server 7.0 cuyo nombre de usuario es sa y de password no se le ha colocado valor alguno.
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); conexion_sql1=DriverManager.getConnection( "jdbc:odbc:luchodb", "sa","" );

Observemos ahora las siguientes lneas:


String in = "insert into estudiante values(?,?)"; sentencia1 = conexion_sql1.prepareStatement(in);

Dichas instrucciones estn diciendo que se va a crear una variable denominada sentencia1, la cual es una sentencia preparada. Pero bueno, para aquellos lectores / estudiantes que no comprendan lo que es una sentencia preparada, a continuacin se dirn unas cosas al respecto. Primero que todo las sentencias preparadas, son sentencias que reciben parmetros. Esta es la razn por la cual la sentencia se ha definido de la forma: Insert into estudiante values (?,?)

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

10

En la cual el primer parmetro que se pase ms adelante ser recibido por la sentencia y reemplazado por el primer signo ? que aparezca. Mas adelante se espera que sta sentencia reciba otro parmetro y dicho parmetro ser reemplazado por el segundo signo ? que aparezca. Con esto bien claro, pasemos a ver las siguientes instrucciones:
sentencia1.clearParameters(); String x1 = req.getParameter("c_cod"); int x2 = Integer.parseInt(x1); String x3 = req.getParameter("c_nom"); sentencia1.setInt(1, x2); sentencia1.setString(2, x3);

Obviamente segn todo lo dicho, podemos ver que estas instrucciones estn pasando el cdigo digitado por el usuario en la pgina como primer parmetro, obviamente despus de convertirlo a entero. Observe amigo lector / estudiante que el primer parmetro se pasa con la instruccin setInt, dado que en la base de datos es un campo entero. De otra parte el segundo parmetro se pasa con la instruccin setString, dado que es un campo de tipo nvarchar. Observe nuevamente amigo lector como Java se encarga de convertir los tipos de datos Java a tipos de datos de la base de datos. Por ltimo se ejecuta la sentencia con la instruccin:
sentencia1.executeUpdate(); sentencia1.close(); conexion_sql1.close();

En donde adems se cierran las conexiones. Bueno y el otro try-catch ya lo habamos explicado y lo que es mostrar los datos. Para el caso grfico vemos pues los resultados de nuestro ejercicio:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

11

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

12

2.3. PAGINACION CON SERVLETS


La paginacin es una de las cosas mas interesantes que se pueden hacer cuando se accede a una base de datos desde una aplicacin. Bsicamente lo que busca la paginacin es resolver el problema de no mostrar demasiados datos en el lado del cliente cuando se hace una consulta, por cuanto si los datos a enviar al cliente son demasiados, 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. 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 aplicacin es el siguiente: import import import import javax.servlet.*; javax.servlet.http.*; java.io.*; java.sql.*; Nombre Hugo Paco Luis Martha Oscar Hugo Paco Luis Martha Oscar Natalia Paris Andrea Serna Patricia Giraldo

public class paginame extends HttpServlet { ResultSet rs; Connection conexion_access; Statement sentencia; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int actual = 4; String actualin = req.getParameter("ac"); if(actualin==null){ actual = 1; } else{ actual = Integer.parseInt(actualin); Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva } PrintWriter out; resp.setContentType("text/html"); out = resp.getWriter(); out.println("<h1>Hello World</h1>"); out.println("La pagina actual es "+actual+"<br>");

13

int numeroRegistros = 0; try { Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); conexion_access=DriverManager.getConnection("jdbc:odbc:conectorODBC", "sa",""); sentencia = conexion_access.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,Resul tSet.CONCUR_READ_ONLY); rs = sentencia.executeQuery("select * from usuario"); while(rs.next()){ numeroRegistros++; } // Cierra while(rs.next()) } catch(Exception e){ out.println("Han ocurrido errores"); } // Cierra try

int numeroRegistrosPorPagina = 4; int enlaces = 0; enlaces = (int)(numeroRegistros/numeroRegistrosPorPagina); if((enlaces*numeroRegistrosPorPagina)!=numeroRegistros){ enlaces++; } for(int j=1;j<=enlaces;j++){ out.println("<a href=http://localhost:8080/examples/servlet/paginame? ac="+j+">"+j+"</a>"); } int inferior; int superior; inferior = (actual*numeroRegistrosPorPagina) numeroRegistrosPorPagina + 1; if(actual == enlaces){ superior = numeroRegistros; } else{ Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva superior = (actual*numeroRegistrosPorPagina);

14

out.println("<br>Inferior = " + inferior); out.println("Superior = " + superior+"<br>"); String todo=""; try { Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); conexion_access=DriverManager.getConnection("jdbc:odbc:conect orODBC","sa",""); sentencia = conexion_access.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,Resul tSet.CONCUR_READ_ONLY); rs = sentencia.executeQuery("select * from usuario where codigo>="+inferior+" and codigo <="+superior); todo = "<html>"; todo = todo + "<body>"; todo = todo + "<center>"; todo = todo + "<table border=6>"; 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 todo todo = = = = todo todo todo todo + + + + "</table>"; "</center>"; "</body>"; "</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); } // Cierra doGet } // Cierra public class paginame

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva La ejecucin del programa produce un resultado similar al siguiente:

15

Cuando se hace clic en el enlace que tiene el numero 1se 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 2se 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 3se 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

Autor: Luis Felipe Wanumen Silva

20

2.4. 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.sysobjects where id = object_id(N'[dbo].[usuario]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[usuario] GO CREATE TABLE [dbo].[usuario] ( [codigo] [int] NULL , [nombre] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [apellido] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [direccion] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [correo] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [direccion_larga] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY] GO Y bueno, por las instrucciones podemos notar de paso que para nuestro ejercicio hemos creado la base de datos en el motor SQL Server y especficamente en SQL Server 2000 de Microsoft. Despus insertamos algunos datos en la tabla, de tal forma que la tabla quede como se muestra a continuacin: Codigo 1 3 4 5 6 7 2 nombre Luis Felipe Ginna Esmeralda Miler Rocio Juan Carlos Carolina apellido Wanumen Silva Murcia Vasquez Gomez Rodriguez Guevara Rodriguez direccion Al Sur Tunjuelito Usme Norte Bogota Centro Bogota Occidente Bogota Al Sur3 correo luchofelipe2000@yahoo.co m gina@multinal.com esmeralda@usme.com miler@udistrital.edu.co rrodriguez@udistrital.edu.co jcguevarab@udistrital.edu.co carolinatv@rcn.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. Todo esto dentro de un formulario que tambien contiene los

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

21

botones basicos de cancelar y enviar que tiene un formulario comun y corriente. 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. Despus 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

Autor: Luis Felipe Wanumen Silva

22

Bueno, estos resultados se logran porque en el servidor hemos creado un servlet que es capaz de recibir los datos y hacer la consulta. El codigo completo de dicho servlet es el siguiente: import import import import javax.servlet.*; javax.servlet.http.*; java.io.*; java.sql.*;

public class Consultame extends HttpServlet { Connection objConeccion; PreparedStatement sentencia; ResultSet resultados; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out; resp.setContentType("text/html"); out = resp.getWriter(); out.println("<h1>Resultados de su busqueda</h1>"); String cadenac = "Driver={SQL Server};Description=sqldemo;SERVER=SITEL; WSID=SITEL; UID=sa;PWD=;DATABASE=hijo"; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); out.println("Vemos hijo has podido cargar los drivers"); // objConeccion = DriverManager.getConnection("jdbc:odbc:dibd","sa",""); objConeccion = DriverManager.getConnection("jdbc:odbc:"+cadenac,"sa",""); Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva out.println("Andale que conoces la base de datos"); // sentencia = objConeccion.createStatement(); String consultaSQL = "select * from usuario where codigo

23

= ?";

sentencia = objConeccion.prepareStatement(consultaSQL, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); String codigin = req.getParameter("buscar"); codigin = codigin.trim(); sentencia.setInt(1,Integer.parseInt( codigin )); resultados = sentencia.executeQuery(); // resultados = sentencia.executeQuery("select * from usuario"); out.println(" <table border = 3>"); out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" <td>"); CODIGO"); </td>"); <td>"); NOMBRE"); </td>"); <td>"); APELLIDO"); </td>"); <td>"); DIRECCION"); </td>"); <td>"); CORREO"); </td>"); <td>"); DIRECCION LARGA"); </td>");

while(resultados.next()){ out.println("<tr>"); int cod = resultados.getInt("codigo"); String nom = resultados.getString("nombre"); String ape = resultados.getString("apellido"); String dir = resultados.getString("direccion"); String cor = resultados.getString("correo"); String dil = resultados.getString("direccion_larga"); out.println(" <td>"); out.println(""+cod); Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva out.println(" </td>");

24

out.println(" <td>"); out.println(""+nom); out.println(" </td>"); out.println(" <td>"); out.println(""+ape); out.println(" </td>"); out.println(" <td>"); out.println(""+dir); out.println(" </td>"); out.println(" <td>"); out.println(""+cor); out.println(" </td>"); out.println(" <td>"); out.println(""+dil); out.println(" </td>");

</table>"); } catch(Exception e){ out.println("Error DESCONOCIDO, espera a que te lo presente"); } } } En donde podemos apreciar que la variable cadenac tiene la cadena de coneccion String cadenac = "Driver={SQL Server};Description=sqldemo;SERVER=SITEL; WSID=SITEL; UID=sa;PWD=;DATABASE=hijo"; y no se ha usado coneccion usando DSN alguno, motivo por el cual se comentarea la instruccin: // objConeccion = DriverManager.getConnection("jdbc:odbc:dibd","sa",""); Observe que el recordset se crea de solo lectura: sentencia = objConeccion.prepareStatement(consultaSQL, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); Se recibe el contenido de la caja de texto html String codigin = req.getParameter("buscar");

} out.println("

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

25

Y como esto siempre se recibe como tipo string, lo que se hace es convertirlo a entero, debido a que en la base de datos este tipo de datos es entero. Esto se logra con las instrucciones: codigin = codigin.trim(); sentencia.setInt(1,Integer.parseInt( codigin )); En donde la variable codigin es entera. Luego se ejecuta la sentencia: resultados = sentencia.executeQuery(); Se imprimen los encabezados de la tabla html: out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" out.println(" <table border = 3>"); <td>"); CODIGO"); </td>"); <td>"); NOMBRE"); </td>"); <td>"); APELLIDO"); </td>"); <td>"); DIRECCION"); </td>"); <td>"); CORREO"); </td>"); <td>"); DIRECCION LARGA"); </td>");

y a continuacin se imprimen todos los registros que cumplen la condicion: while(resultados.next()){ out.println("<tr>"); int cod = resultados.getInt("codigo"); String nom = resultados.getString("nombre"); String ape = resultados.getString("apellido"); String dir = resultados.getString("direccion"); String cor = resultados.getString("correo"); String dil = resultados.getString("direccion_larga"); out.println(" <td>"); out.println(""+cod); out.println(" </td>"); Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

26

out.println(" <td>"); out.println(""+nom); out.println(" </td>"); out.println(" <td>"); out.println(""+ape); out.println(" </td>"); out.println(" <td>"); out.println(""+dir); out.println(" </td>"); out.println(" <td>"); out.println(""+cor); out.println(" </td>"); out.println(" <td>"); out.println(""+dil); out.println(" </td>"); } out.println(" </table>");

Si se presenta algun problema con la coneccion o en alguna otra parte del programa, se ejecuta lo que se encuentra en el bloque match: catch(Exception e){ out.println("Error DESCONOCIDO, espera a que te lo presente"); }

2.5. PAGINACION CON SIGUIENTE Y ANTERIOR


El siguiente ejercicio no es mas que una mejora del ejercicio hecho en secciones anteriores, sobre la paginacin con servlets. 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. Veamos pues el programa: import import import import javax.servlet.*; javax.servlet.http.*; java.io.*; java.sql.*;

public class Paginacion extends HttpServlet {

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva public String contarRegistros(){ ResultSet rs=null; Connection conexion_access=null; Statement sentencia=null; int numeroRegistros = 0; try { Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );

27

conexion_access=DriverManager.getConnection("jdbc:odbc:origenNueva"," ",""); sentencia = conexion_access.createStatement(); rs = sentencia.executeQuery("select * from estudiante"); while(rs.next()){ numeroRegistros++; } // Cierra while(rs.next()) } catch(Exception e){ return "-1"; } // Cierra try finally{ try{ rs.close(); conexion_access.close(); } catch(Exception e){ } return "" + numeroRegistros;

} } // Cierra public int contarRegistros() public String consultar(int infe, int supe){ int contador = 0; ResultSet rs=null; Connection conexion_access=null; Statement sentencia=null; String todo = ""; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conexion_access=DriverManager.getConnection("jdbc:odbc:origenN ueva","",""); sentencia = conexion_access.createStatement(); rs = sentencia.executeQuery("select * from estudiante"); todo = "<html>"; todo = todo + "<body>"; todo = todo + "<center>"; todo = todo + "<table border=6>"; while(rs.next()){ contador++; Enciclopedia Conociendo Curso de Jsp y Servlets

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

28

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva int enlaces = 0; enlaces = (int)(numeroRegistros/numeroRegistrosPorPagina); if((enlaces*numeroRegistrosPorPagina)!=numeroRegistros){ enlaces++; } if(actual>1){
out.println("<a href=http://localhost:8080/examples/servlet/Paginacion?ac="+(actual1)+">Anterior</a>");

29

} for(int j=1;j<=enlaces;j++){ out.println("<a href=http://localhost:8080/examples/servlet/Paginacion? ac="+j+">"+j+"</a>"); } if(actual<enlaces){ out.println("<a href=http://localhost:8080/examples/servlet/Paginacion?ac="+ (actual+1)+">Siguiente</a>"); } int inferior; int superior; inferior = (actual*numeroRegistrosPorPagina) numeroRegistrosPorPagina + 1; if(actual == enlaces){ superior = numeroRegistros; } else{ superior = (actual*numeroRegistrosPorPagina); }

out.println("<br>Inferior = " + inferior); out.println("Superior = " + superior+"<br>"); String todo=""; todo = consultar(inferior, superior); resp.setContentType("text/html"); out = resp.getWriter(); out.println(todo); } // Cierra doGet } // Cierra public class paginame Observe amigo lector que se implementan dos if adicionales, en los cuales se pregunta si la pagina actual es mayor que uno if(actual>1){
out.println("<a href=http://localhost:8080/examples/servlet/Paginacion?ac="+(actual1)+">Anterior</a>");

} Enciclopedia Conociendo Curso de Jsp y Servlets

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, si el caso es el que muestra la siguiente pantalla:

De otra parte el enlace con la etiqueta Siguiente se muestra gracias al codigo siguiente: if(actual<enlaces){ out.println("<a href=http://localhost:8080/examples/servlet/Paginacion?ac="+ (actual+1)+">Siguiente</a>"); } Y esto hace que se muestre en todos los casos, menos cuando estemos ubicados en la ultima pagina, tal como lo muestra el pantallaza siguiente:

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

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 bsicamente para despejar un poco el codigo del metodo GET para que no quedase muy largo. Tambien es importante notar que aunque al cliente se le muestran unicamente un segmento de datos, el servidor realmente tuvo que recorrer todos los datos antes de mostrar solamente al cliente unos cuantos, esto obviamente se puede mejorar con el animo de disminuir el trabajo realizado por el servidor con cada consulta. De todas formas esto si lo que hace es disminuir la congestion de red, debido a que al cliente tan solo se le envian un segmento de datos y el flujo que pasa por la red, no es tan grande como si se enviasen todos los datos.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

33

2.6. SELECCIN DE DATOS DE ORACLE 10G


El siguiente ejemplo muestra como seleccionar datos de una base de datos oracle 10G desde una aplicacin autnoma. 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. La instalacion enterprise la habia hecho hace dos meses y me presentaba algunos errores, 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. 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. Fecha: 17 de septiembre de 2007. Autor: Luis Felipe Wanumen Silva

import java.awt.*; import java.awt.event.*; import java.sql.*; public class MyApp extends Frame{ Connection conexion_sql; Statement sentencia=null; TextArea ta = new TextArea(1,3); String cadena = ""; ResultSet rs=null; public MyApp(){ add(ta); this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); // Carga el driver JDBC-ODBC try { // Se usa este driver cuando se encuentra instalado en el sistema // Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

34

// Si en el sistema no se encuentra instalado el driver, pero // tenemos el jar ubicado en // C:\OraHome_1\jdbc\lib\classes12.jar // Agregamos una referencia a este driver en el proyecto y // deberia funcionar la siguiente linea: DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); } catch( Exception e ) { System.out.println( "No se pudo cargar el puente JDBC-ODBC." ); System.out.println("error con la clase java"); return; } String 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 = driverOracle + + + + + + + + + + + + + + + + + + + + + + + + + "DRIVER=Oracle en Home1;"; "UID=scott;"; "TLO=O;"; "FBS=60000;"; "FWC=F;"; "CSR=F;"; "MDI=Me;"; "MTS=T;"; "DPM=F;"; "NUM=NLS;"; "BAM=IfAllSuccessful;"; "FRL=Lo;"; "GDE=F;"; "RST=T;"; "LOB=T;"; "FDL=10;"; "FRC=10;"; "QTO=T;"; "FEN=T;"; "XSM=Default;"; "EXC=F;"; "APA=T;"; "DBA=W;"; "DBQ=ORCL;"; "SERVER=ORCL"; // Linea Solucion

// driverOracle = driverOracle + "SERVER=athlon.paralela.local"; // Linea problema. // Cuando intentaba usar la anterior linea en vez de la linea llamada // linea solucion, obtenia que se conectaba y encontraba la tabla // que estaba consultando, pero a la hora de escribir la sentencia // getString o getInt para recuperar datos, obtenia un error que // decia que // el estado del cursor no era valido. Estaba convencido que el // problema Enciclopedia Conociendo Curso de Jsp y Servlets

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. // Como conclusion podemos decir con toda confianza que no siempre // que la linea de conectividad funcione, es porque la cuestion va a // funcionar // bien, o es porque el driver de hecho tiene todos los elementos // bien, // si no que se pueden presentar algunos problemas mas adelante si el // driver tiene alguno de los parametros mal especificados. // // // // String ruta1 = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=Medicos.mdb"; String ruta1 = "jdbc:odbc:DRIVER=Microsoft ODBC for Oracle;UID=orcl;SERVER=athlon";

String ruta1 = "jdbc:odbc:"+driverOracle; try{ // Establece la conexin con la base de datos conexion_sql = DriverManager.getConnection(ruta1,"scott","12346789"); } // Cierra try catch( Exception e ) { System.out.println("error en el dsn"); System.out.println(e); return; } try{ sentencia = conexion_sql.createStatement(); System.out.println("Estoy antes del while"); rs = sentencia.executeQuery("select * from usuar"); /* if(rs==null){ System.out.println("rs es null"); } else{ System.out.println("rs NO es null"); } */ // System.out.println(rs.getInt(1)); System.out.println("Estoy antes 3 del while"); while(rs.next()){ System.out.println("Estoy dentro del while"); cadena = cadena + rs.getInt("CODIGO"); cadena = cadena + "\t"; cadena = cadena + rs.getString("NOMBRE"); Enciclopedia Conociendo Curso de Jsp y Servlets

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

36

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

37

3. CONCEPTOS BASICOS DE JSP


En este manual se han trabajado algunas cuestiones importantes sobre los servlets, pero es necesario que se tenga en cuenta que estos a veces pueden presentar algunos problemas al trabajar. Uno de los principales problemas es el hecho que para hacer un programa con servlet que imprima al cliente contenido html, es necesario dejar un poco de lneas de cdigo en las que se manda cdigo html al cliente, lo cual a veces no resulta ser muy buena idea, por cuanto el cdigo se vuelve un poco complicado de comprender por la cantidad de lneas que se tienen.

3.1. CICLO DE VIDA DE PAGINA JSP

3.2. 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 cdigo Java, sino un texto cualquiera, para ilustrar esta situacin veamos primero el cdigo fuente del archivo denominado ejemplo1.jsp: Esto es un ejemplo loco El cual produce el siguiente resultado:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

38

3.3. COMENTARIOS EN PAGINAS JSP


El siguiente cdigo muestra como hacer comentarios: ejemplo2.jsp Esto no es un comentario <%--Esto es un comentario--%> El resultado de la anterior pagina es el similar al siguiente:

3.4. DECLARANDO VARIABLES EN JSP Y USO DE EXPRESIONES


El archivo ejemplo3.jsp muestra como declarar variables en JSP: ejemplo3.jsp Autor: Luis Felipe Wanumen Silva<br> Declarando variables<br> <%! int variable1 = 165; %> <%! int variable2 = 165; %> <%! int variable3 = 165; %> Variable 1 = <%=variable1%><br> Variable 2 = <%=variable2%><br> Variable 3 = <%=variable3%><br> El cual produce el siguiente resultado:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

39

Cuando usamos el igual en la instruccin: <%=variable1%> En realidad estamos usando expresiones. En realidad las expresiones nos permiten ahorrarnos cdigo al momento de imprimir variables.

3.5. UNA FORMA DE IMPRIMIR ELEMENTOS EN JSP


El anterior ejemplo mostraba que era posible imprimir con la instruccin: <%=variable1%> En donde variable1 es una variable de tipo entera. Tambin es posible imprimir otro tipo de datos tal como se muestra en la siguiente paginas jsp: ejemplo4.jsp Autor: Luis Felipe Wanumen Silva<br> Imprimiendo variables<br> <%! String obj_cadena1; %> <%! Integer obj_entero1; %> <%! int var_entero1 = 165; %> <% obj_cadena1="Soy cadena 1"; %> <% obj_entero1=new Integer(123); %> <% var_entero1=654; %> <%=obj_cadena1 %><br> <%=obj_entero1 %><br> <%=var_entero1 %><br> La cual 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 estn disponibles en una pagina jsp. Ahora veamos el siguiente ejemplo: ejemplo5.jsp Autor: Luis Felipe Wanumen Silva<br> Declarando variables<br> <%! int variable1 = 165; %> <%! int variable2 = 165; %> <%! int variable3 = 165; %> Variable 1=<%out.println(variable1);%><br> Variable 2=<%out.println(variable2);%><br> Variable 3=<%out.println(variable3);%><br> Que muestra que es posible imprimir usando la instruccin out.println(). La anterior pgina al ser vista desde el navegador produce el siguiente resultado:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

41

A manera de ejemplo y de refuerzo a continuacin se imprimen unos objetos de datos usando la instruccin out.println(): ejemplo6.jsp Autor: Luis Felipe Wanumen Silva<br> Imprimiendo variables<br> <%! String obj_cadena1; %> <%! Integer obj_entero1; %> <%! int var_entero1 = 165; %> <% obj_cadena1="Soy cadena 1"; %> <% obj_entero1=new Integer(123); %> <% var_entero1=654; %> <%out.println(obj_cadena1); %><br> <%out.println(obj_entero1); %><br> <%out.println(var_entero1); %><br> El cual produce el siguiente resultado:

3.6. LA DIRECTIVA INCLUDE


Las directivas se usan para entregar informacin de las paginas usadas. En realidad esta definicin no es muy clara a menos que se comience a explicar cada una de las directivas mas usadas en JSP, con lo cual esta seccin explica la directiva include y esto se hace por medio de la siguiente pagina jsp: ejemplo7.jsp

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

42

Autor: Luis Felipe Wanumen Silva<br> LA DIRECTIVA INCLUDE<br> <%@ include file="DatosLuisF.txt"%> La cual como podemos observar hace referencia a una pagina llamada "DatosLuisF.txt", la cual para nuestro ejemplo contiene las siguientes lineas:

Realmente la explicacin es bien sencilla. Lo que hace la pagina JSP es incluir el contenido de archivo "DatosLuisF.txt". Con lo cual el resultado de la ejecucin de la pagina JSP es el siguiente:

3.7. CUIDADOS CON LA DIRECTIVA INCLUDE


Imaginemos que la pagina JSP que contiene la directiva include tiene el siguiente cdigo fuente: Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

43

ejemplo8.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, o sea la pagina "pagina1.html" para nuestro caso, contiene el siguiente cdigo: "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.0:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

44

El problema est si observamos el cdigo fuente de dicha pgina generada. Vemoslo:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

45

Es claro que este cdigo funcionara solo en algunos navegadores, pero en otros navegadores se pueden producir resultados inesperados

3.8. 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 estn disponibles sus clases para dicho archivo JSP. A continuacin se muestra un archivo llamado ejemplo9.jsp en el cual se incluye el paquete java.util, con lo cual se puede hacer uso de la clase Vector. La pgina en mencin contiene el siguiente cdigo fuente: ejemplo9.jsp <%@ page import="java.util.*; "%>

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

46

<% Vector obj_Vector1 = new Vector();%> <% obj_Vector1.addElement("Luis "); obj_Vector1.addElement("Felipe "); obj_Vector1.addElement("Wanumen "); obj_Vector1.addElement("Silva"); out.println(obj_Vector1.elementAt(0)); out.println(obj_Vector1.elementAt(1)); out.println(obj_Vector1.elementAt(2)); out.println(obj_Vector1.elementAt(3)); %> El resultado de la ejecucin de la anterior pagina JSP es el siguiente:

Observe amigo lector / estudiante que si no se hubiera colocado la sentencia: <%@ page import="java.util.*; "%> No estara disponible la clase Vector de java, tal cual se muestra en la siguiente pagina: ejemplo10.jsp <% Vector obj_Vector1 = new Vector();%> <% obj_Vector1.addElement("Luis "); obj_Vector1.addElement("Felipe "); obj_Vector1.addElement("Wanumen "); obj_Vector1.addElement("Silva"); out.println(obj_Vector1.elementAt(0)); out.println(obj_Vector1.elementAt(1)); Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

47

out.println(obj_Vector1.elementAt(2)); out.println(obj_Vector1.elementAt(3)); %>

La cual produce el siguiente error:

3.9. UN TIP SOBRE LAS IMPORTACIONES


El punto y coma al final de la importacin del paquete se puede o no colocar. Esto se ve claro cuando ejecutamos la siguiente pagina: <%@page import="java.util.*;"%> <%! String cadena = "Hola Mundo";%> <% out.println(cadena); %> La cual funciona y al ejecutar la siguiente pagina: <%@page import="java.util.*"%> <%! String cadena = "Hola Mundo";%> <% out.println(cadena); %> Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

48

Tambin funciona, con lo cual podemos concluir que el uso del punto y coma al final de la importacin no es obligatorio.

3.10. 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, pero dicho string no termina con el punto y coma lo cual provoca un error en tiempo de ejecucin de la pagina jsp. <%-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. --%> <%@page import="java.util.*;"%> <%! String cadena = "Hola Mundo"%> <% out.println(cadena); %> En el navegador se produce un error similar al siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

49

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

50

4. PAGINACIN DE RESULTADOS CON JSP


En esta seccin del libro vamos a mostrar en forma didctica los elementos ms relevantes que se deben tener en cuenta para paginar resultados usando Jsp. En primera medida es necesario comprender como una pgina jsp puede llamarse as misma y para saber que datos debe mostrar debe aprenderse a pasar parmetros a una pgina jsp, se debe mostrar al usuario los hiperenlaces necesarios para mostrar todo el conjunto de resultados, pero antes de ello se debe se debe hallar el nmero de paginas necesarias haciendo una consulta sobre la base de datos y contando el nmero de registros que conforman el conjunto de resultados. Se pueden hacer algunas mejoras a la aplicacin a nivel de interfaz de usuario, tales como colocar hiperenlaces anterior y siguiente para imprimir ms dinamismo a la pgina. Otras cosas se deben tener en cuenta, pero tranquilo amigo lector / estudiante que en la presente seccin se le irn indicando las cosas gradualmente de manera que al finalizar la seccin pueda hacer un ejercicio profesional de paginacin de resultados.

4.1. RECONOCER QUE PARAMETRO SE ENVIA EN PAGINAS RECURSIVAS

<% String valor = request.getParameter("p"); out.println("Soy la pagina "+valor); out.println("<br>"); %> <a href=ejemplo1.jsp?p=1>1</a> <a href=ejemplo1.jsp?p=2>2</a> <a href=ejemplo1.jsp?p=3>3</a> <a href=ejemplo1.jsp?p=4>4</a> El ejercicio corriendo es:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

51

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

52

4.2. 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 tamao de la paginacin es de 4. Es decir que vamos a mostrar cuatro resultados por pagina. El calculo del numero de paginas a mostrar al usuario sera igual a la division entre el numero total de registros y el tamao de la paginacin. En este caso 29/4 El resultado es 7.25 Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

53

Si la divisin es exacta, entonces dicho resultado es igual al numero de paginas a mostrar, en caso que no sea exacto, entonces al resultado se le suma uno y se obtiene el nmero de paginas a mostrar. Para comprender mejor este concepto veamos pues a nivel de cdigo la implementacin de lo que se dice: <% int tamano_paginacion = 4; int numero_registros = 29; String valor = request.getParameter("p"); int paginas_usuario = 0; out.println("Soy la pagina "+valor); out.println("<br>"); int auxiliar = (int)(numero_registros/tamano_paginacion); if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar; } else{ paginas_usuario = auxiliar+1; } out.println("El numero de paginas a mostrar es "+paginas_usuario); %>

4.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, pero con valores de parmetros diferentes. Veamos: <% int tamano_paginacion = 4; int numero_registros = 29; String valor = request.getParameter("p"); int paginas_usuario = 0; out.println("Soy la pagina "+valor); out.println("<br>"); int auxiliar = (int)(numero_registros/tamano_paginacion); if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar; } else{ paginas_usuario = auxiliar+1; } out.println("El numero de paginas a mostrar es "+paginas_usuario+"<br>"); for(int i=1;i<=paginas_usuario;i++){ out.println("<a href=ejemplo1.jsp?p="+i+">"+i+"</a>"); } Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva %>

54

4.4. COLOCAR HIPERENLACE ANTERIOR


Es necesario validar que si estamos en la primera pagina, no debe hacer enlace anterior. Si estamos en la ultima pagina, no hay hiperenlace siguiente. Si estamos en la segunda pagina o en una pagina posterior a esta, el enlace anterior debe ser igual al valor de la pagina actual menos uno. A nivel de cdigo, la situacin es la siguiente: <% int tamano_paginacion = 4; int numero_registros = 29; String valor = request.getParameter("p"); int actual = Integer.parseInt(valor); int anterior = -1; int paginas_usuario = 0; out.println("Soy la pagina "+valor); out.println("<br>"); int auxiliar = (int)(numero_registros/tamano_paginacion); if((auxiliar * tamano_paginacion)== numero_registros){ paginas_usuario = auxiliar; } else{ paginas_usuario = auxiliar+1; } out.println("El numero de paginas a mostrar es "+paginas_usuario+"<br>"); if(actual >1){ anterior = actual-1; out.println("<a href=ejemplo1.jsp?p="+anterior+">anterior</a>"); } for(int i=1;i<=paginas_usuario;i++){ out.println("<a href=ejemplo1.jsp?p="+i+">"+i+"</a>"); } %> Y en trminos de interfaz de usuario, tenemos los siguientes resultados:

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. Tambin observamos que

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Si el enlace esta en la pagina uno, el enlace anterior no existe.

56

4.5. COLOCAR HIPERENLACE SIGUIENTE


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

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

57

Podemos apreciar que si estamos en la ltima pgina, no vemos el enlace siguiente, pero si estamos en la pagina

Dos, aparece el enlace siguiente con valor de tres.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

58

4.6. DEPENDIENDO LA PAGINA ACTUAL, 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 Cul es la fmula? La frmula para el calculo del registro inicial es: (Pagina actual * tamao paginacin) (tamao paginacin -1) Rompiendo parntesis, tenemos limite_inferior = actual*tamano_paginacion - tamano_paginacion+1; Y para el registro final tenemos en forma anlioga: limite_superior = actual*tamano_paginacion; A nivel de cdigo tenemos pues las siguientes mejoras: <% int tamano_paginacion = 4; int numero_registros = 29; String valor = request.getParameter("p"); int actual = Integer.parseInt(valor); int anterior = -1; int siguiente = -1; int paginas_usuario = 0; out.println("Soy la pagina "+valor); out.println("<br>"); int auxiliar = (int)(numero_registros/tamano_paginacion); int limite_inferior = 0; int limite_superior = 0;

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

59

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Para la segunda pgina los resultados son:

60

Para la tercera pgina son:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Para la cuarta pgina son:

61

Para la quinta pgina:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Para la sexta pgina:

62

Para la sptima pgina:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Para la octava pgina:

63

4.7. CORREGIR EL NUMERO DE REGISTROS QUE APARECEN EN LA ULTIMA PAGINA


Es necesario hacer esta correccin, debido a que la divisin no siempre es exacta y se hace necesario validar en realidad cuantos registros de la ltima pgina se van a mostrar. Con todo lo anterior se hace necesario hacer algunos ajustes, tal como se muestra en el siguiente cdigo fuente: <% int tamano_paginacion = 4; int numero_registros = 29; String valor = request.getParameter("p"); int actual = Integer.parseInt(valor); int anterior = -1; int siguiente = -1; int paginas_usuario = 0; out.println("Soy la pagina "+valor); out.println("<br>"); int auxiliar = (int)(numero_registros/tamano_paginacion); int limite_inferior = 0; int limite_superior = 0; int exacta = 0;

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

64

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

65

Con lo cual se comprueba que realmente la paginacin funciona.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

66

4.8. ARMAR LA CADENA DE CONSULTA Y ENSAMBLAR LA APLICACION


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

Autor: Luis Felipe Wanumen Silva } out.println("<br>"); limite_inferior = actual*tamano_paginacion - tamano_paginacion+1; limite_superior = actual*tamano_paginacion; if(actual==paginas_usuario){ if(exacta!=0) limite_superior = numero_registros; } try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:conector_access","",""); sentencia_preparada = con.prepareStatement("select * from estudiante where codigo>=? and codigo<=?"); sentencia_preparada.setInt(1, limite_inferior); sentencia_preparada.setInt(2, limite_superior); resultado = sentencia_preparada.executeQuery(); out.println("<br>"+"<table border= 5>"); while(resultado.next()){ out.println("<tr>"); out.println(" <td>"); out.println(""+resultado.getInt("codigo")); out.println(" </td>"); out.println(" <td>"); out.println(""+resultado.getString("nombre")); out.println(" </td>"); out.println("</tr>"); } out.println("</table>"); } catch(Exception e){ out.println("Se presentaron errores de BD"); } %>

67

4.9. HACER QUE EL NUMERO DE REGISTROS SEA DINAMICO


El cdigo fuente final es el siguiente: <%@ page session="true"%> <%@ page import="java.sql.*"%> <% String valor = request.getParameter("p"); Enciclopedia Conociendo Curso de Jsp y Servlets

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

68

Curso de Jsp y Servlets

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

69

Y su ejecucin se puede ver a continuacin:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

70

En donde se puede apreciar que funciona toda la aplicacin correctamente.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

71

5. ETIQUETAS JSP
Las etiquetas jsp permiten que una aplicacin java con paginas .jsp invoquen etiquetas al estilo html, pero que dichas etiquetas por algn mecanismo interno del servidor web se procesen al estilo java por medio de la ejecucin de unos programas que extienden de la clase TagSupport

5.1. PRIMER EJERCICIO DE ETIQUETAS JSP


Supongamos que vamos a crear una etiqueta JSP llamada TagMio1, lo primero que tenemos que hacer es crear una definicin de la etiqueta en un archivo llamado etiquetillas.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. El cdigo de nuestra definicin de la etiqueta se muestra a continuacin: etiquetillas.tld <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.2</jspversion> <shortname>capitulo6</shortname> <info> Librera de Etiquetas </info> <tag> <name>TagMio1</name> <tagclass>carpeta.TagMio1</tagclass> <bodycontent>empty</bodycontent> <info>Etiqueta simple de saludo</info> <!-- 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 lgicamente tendr un parmetro llamado nombre. El archivo anterior tambin esta indicando Enciclopedia Conociendo Curso de Jsp y Servlets

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

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

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

73

Ahora bien para lograr que esta etiqueta sea til se necesita invocarla desde una pagina .jsp, a continuacin se muestra el cdigo fuente del archivo TagMio1.jspque invoca la etiqueta creada anteriormente: TagMio1.jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas.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, tambien observe que el parmetro nombre es invocado pasandole el valor de Luis Felipe y la otra vez no es invocado, con lo cual el programa se invoca y ejecuta dos veces.

5.2. ERROR COMN CON EL USO DE TAGS


Supongamos que tenemos un archivo de librera de etiquetas como el siguiente: Etiquetillas.tld <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.2</jspversion> <shortname>capitulo6</shortname> <info> Librera de Etiquetas correspondiente al captulo 6 </info> <tag> <name>TagMio1</name> <tagclass>carpeta.TagMio1</tagclass> <bodycontent>empty</bodycontent> <info>Etiqueta simple de saludo</info> <!-- nombre presonalizado --> <attribute> <name>nombre</name> Enciclopedia Conociendo Curso de Jsp y Servlets

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. El problema viene si se hace una pagina .jsp que intente ejecutar el siguiente cdigo: TagMio2.jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas.tld" prefix="etiquete" %> <html> <body> <etiquete:TagMio2 nombre="estudiante"/> </body> </html> Se produce un error similar al siguiente:

Y esto se debe a que el Tag TagMio2.java no existe y as se creara seguira producindose el error bsicamente debido a que el sistema no lo tiene referenciado en el archivo tipo .tld. Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

75

5.3. 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 a continuacin: TagMio2.jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas.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

Autor: Luis Felipe Wanumen Silva

76

Para lograr este efecto se requiere crear nuevamente el archivo descriptor de etiquetas, en este caso vamos a crear un archivo llamado etiquetillas que contendr el siguiente cdigo: Etiquetillas.tld <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.2</jspversion> <shortname>capitulo6</shortname> <info> Librera de Etiquetas correspondiente al captulo 6 </info> <tag> <name>TagMio2</name> <tagclass>carpeta.TagMio2</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>nombre</name> </attribute> </tag> </taglib> De tal suerte que podremos crear el archivo TagMio2.java con el siguiente cdigo: TagMio2.java

package carpeta; import java.sql.*;

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

77

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

Autor: Luis Felipe Wanumen Silva

78

return( SKIP_BODY ); } public void release() { super.release(); } }


En donde se supone que para logar la correcta ejecucin del Tag, 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. Para el caso de nuestro ejercicio hemos creado el origen de datos y hemos colocado el archivo tipo .tld en el lugar correcto tal como muestra la siguiente figura:

De tal suerte que la invocacin del archivo TagMio2.java ubicado como muestra la siguiente figura:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

79

Podr ser invocado desde una pagina TagMio2.jsp usando el codigo fuente mostrado a continuacin: TagMio2.jsp <%@ taglib uri="/WEB-INF/tlds/etiquetillas.tld" prefix="etiquete" %> <html> <body> <etiquete:TagMio2 nombre="estudiante"/> </body> </html> Y produciendo unos resultados similares a los siguientes:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

80

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

81

6. FORMA DE HACER TAGS CON NETBEANS 6.5.1


6.1. CREAR LA LIBRERA DE ETIQUETAS

TAG.tld <?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <short-name>tag</short-name> <uri>/WEB-INF/tlds/TAG</uri> <tag-file> <name>TARARCHIVO</name> <path>/WEB-INF/tags/TARARCHIVO.tag</path> </tag-file> </taglib>

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

82

6.2. CREAMOS LA ETIQUETA PROPIAMENTE DICHA

TAGARCHIVO.tag <%@tag description="put the tag description here" pageEncoding="UTF-8"%> <jsp:useBean id="Uno" class="tag.NewBean"/> <jsp:useBean id="Dos" class="tag.Bean1"/> <%-- The list of normal or fragment attributes can be specified here: --%> <%@attribute name="message"%> <%-- any content can be specified here e.g.: --%> <h2>${message}</h2> <% Dos.setCodigo(message); out.println(Dos.getNombre()); %>

6.3. CREAMOS EL BEAN


package tag; /** * Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva * @author microsoft */ import java.sql.*; public class Bean1 { private String nombre; Connection objCon; PreparedStatement objSen; ResultSet objRes; int codigo; String res=""; public void setNombre(String valor){ this.nombre = valor; } public void setCodigo(String valor){ codigo = Integer.parseInt(valor); } public String getNombre(){ try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); objCon = DriverManager.getConnection("jdbc:odbc:luchodb","sa",""); objSen = objCon.prepareStatement("select nombre from usuario1 where codigo = ?"); objSen.setInt(1,this.codigo); objRes = objSen.executeQuery(); while(objRes.next()){ res = res + objRes.getString("nombre"); } } catch(Exception e){ res = e.toString(); } return this.res; } }

83

6.4. DESDE UNA JSP USAMOS EL TAG


jsp2.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib uri="/WEB-INF/tlds/TAG.tld" prefix="etiquete" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva </head> <body> <h1>Hello World!</h1> <etiquete:TARARCHIVO message="2" /> </body> </html>

84

6.5. CREAMOS LA BASE DE DATOS


Create table usuario( Codigo int, Nombre varchar(50) )

6.6. INGRESAMOS ALGUNOS DATOS

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

85

Insert into usuario values(1,Hugo) Insert into usuario values(2,Paco) Insert into usuario values(3,Luis)

6.7. EJECUTAMOS LA APLICACION

6.8. TALLER PROPUESTO SOBRE TAGS JSP


1. Usted decide que motor quiere trabajar. 2. Crear otra etiqueta que una vez ejecutada la anterior permita seleccionar el nombre de la base de datos. 3. Crear otra etiqueta que permita seleccionar los nombres de las tablas de las anteriores bases de datos.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

86

7. CREANDO SENCILLA APLICACIN WEB NETBEANS 3 CAPAS


Lo ideal es hacer aplicaciones de mas de 3 capas hoy en da, pero dado que se trata de mostrar la funcionalidad y de despegar en estas cosas de las aplicaciones web con NetBeans, se trabajara una capa de presentacin mediante una pagina registro.JSP, una capa de controlador que controlara los eventos y se llamara Registro.java y una capa que estar muy ligada al modelo implementada con el archivo ConexionBd.java con lo cual se cumplir a grandes rangos con el modelo arquitectnico MVC (Modelo Vista Controlador). El siguiente taller usa Beans normales (chiches), es decir no usa Beans Empresariales o los llamados EJB (que son lo mas decentes para estos casos), 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 presentacin grafica.

7.1. PASO 1: CREAR LA BASE DE DATOS


Crear la base de datos. Para el caso de nuestro ejercicio Web, podemos usar cualquier motor de base de datos. En nuestro caso podemos usar Access o el que tengamos a mano. Veamos con Access: Creamos una base de datos llamada base.mdb tal como muestra la siguiente figura:

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

88

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

89

7.2. PASO 2: CREAR EL ORIGEN DE DATOS


Ejecutamos el comando odbcad32 tal como muestra la siguiente figura:

Abrimos la pestaa DSN de sistema

Enciclopedia Conociendo

Curso de Jsp y Servlets

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.3. PASO 3: CREACION DE UN PROYECTO WEB CON NETBEANS


En nuestro caso estamos usando el NetBeans IDE 6.0 tal como muestra la figura:

Enciclopedia Conociendo

Curso de Jsp y Servlets

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 especficamente Web Application

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

95

En nuestro ejercicio el proyecto lo llamamos: Udistrital y lo creamos con la especificacin J2EE 1.3

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

96

En nuestro caso no vamos a usar ningun Framework es decir que no seleccionamos Framework alguno:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

97

7.4. PASO 4: CREACION DEL PAQUETE QUE TENDRA LA LOGICA Y EL ACCESO A DATOS
Al interior de un proyecto web NetBeans se tienen varias carpetas, y especficamente vamos a crear un paquete al interior de la carpeta Source Packages

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

98

Una de las cosas mas tiles es empaquetar las clases y por eso vamos a crear un paquete nuevo llamado MiPaqueteChileno

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

99

De tal manera que el paquete por defecto que se tiene en la carpeta Source Packages queda reemplazado por el paquete llamado MiPaqueteChileno

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

100

Creamos ahora una clase

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

101

Llamada Registro

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

102

Al interior del paquete llamado MiPaqueteChileno que controlara los eventos de ingresar, es decir que dentro del modelo vista controlador tendr la funcin de controlador. Y tambin 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 pequeos detalles relacionados con la conexin a la base de datos.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

103

7.5. PASO 5: CREACION DE LA VISTA


Por ultimo, al interior de la carpeta Web Pages

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

104

crearemos una pagina llamada registro.jsp

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

105

Observe amigo lector / estudiante que NetBeans le coloca la extensin .jsp al archivo.

7.6. PASO 6: INGRESANDO CODIGO EN EL MODELO


Nuestra clase del modelo llamada ConexionBd.java presenta un cdigo similar al siguiente: package MiPaqueteChileno; import java.sql.*; public class ConexionBd { public String error=""; public Connection con=null; private Statement stt; private ResultSet rSet; public boolean conectaBd(){ boolean resp=false; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); this.con=DriverManager.getConnection("jdbc:odbc:origen","",""); System.out.print("se conecto a la bd"); resp=true; Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva } catch(Exception e){ System.out.println("No se puede realizar la conexin"); System.out.println(e); } return resp; } public ConexionBd() { super(); } public int Inserta (String sentencia){ int dat=0; if(conectaBd()){ try{ this.stt=this.con.createStatement(); dat=this.stt.executeUpdate(sentencia); this.stt.close(); this.con.close(); } catch(Exception e){ this.error="no se puedo realizar el insert a la bd"; } } // Cierra if return dat; } // Cierra Inserta public static void main(String[] args) { // TODO Auto-generated method stub ConexionBd c = new ConexionBd(); c.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. Es importante notar que este Bean tiene el metodo main() y esto es valido debido a que este Bean no es un Bean Empresarial. (Algunos autores ni siquiera consideran que el anterior programa sea un Bean) Lo interesante del asunto es que la insercin de datos es manejada por la clase ConeccionBd() pero el lanzamiento de dicha insercin es manejada solamente desde una clase controladora llamada Registro.java Antes de explicar detenidamente la clase Registro.java mencionaremos que el metodo Inserta() es invocado desde afuera de la clase ConectaBd y se valida que su ejecucin 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. Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

107

7.7. PASO 7: INGRESANDO CODIGO EN EL CONTROLADOR


El controlador tiene un cdigo fuente similar al siguiente: package MiPaqueteChileno; public class Registro { private String nombre; private String codigo; ConexionBd conecta=new ConexionBd(); public Registro() { super(); } public void setCodigo(String Codigo){ codigo=Codigo; } public void setNombre(String Nombre){ nombre=Nombre; } public String getCodigo(){ return codigo; } public String getNombre(){ return nombre; } public String AgregaRegistro(){ String cadena = ""; try{ cadena = "Vamos a insertar"; String sql = "INSERT into estudiante"+ "(nombre)"+ "values ('"+this.getNombre()+"')"; int datos=this.conecta.Inserta(sql); cadena = "Ya insertamos"+sql; } catch(Exception e){ cadena = "No pudo insertar"; } return cadena; } } En donde es el encargado principalmente de armar la cadena de conexin e invocar el mtodo de insercin de la clase ConexionBd.java. En nuestro caso este controlador tiene los metodos getXxx() y setXxx() que corresponden con cada uno de los atributos de la tabla estudiante. Es importante que el Enciclopedia Conociendo Curso de Jsp y Servlets

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

Autor: Luis Felipe Wanumen Silva

109

7.8. PASO 8: INGRESANDO CODIGO EN LA VISTA


A continuacin ingresamos el siguiente cdigo en la pagina registro.jsp <%-Document : Regio Created on : 18/03/2009, 12:31:28 PM Author : Luis Felipe Wanumen --%> <%@ page language="java" import="java.util.* , java.sql.*, MiPaqueteChileno.Registro" pageEncoding="ISO-8859-1"%> <jsp:useBean id="registro" class=" MiPaqueteChileno.Registro" scope="page"> <jsp:setProperty name="registro" property="*"></jsp:setProperty> </jsp:useBean> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <body> <% if (request.getParameter("codigo")==null && request.getParameter("nombre")==null && request.getParameter("password")== null) { %> <form name="registro" method="POST" action="registro.jsp"> <p>Nombre</p><input type="text" name="nombre" /><br /> <p>Codigo</p><input type="text" name="codigo" /><br /> <p>Contrasea</p><input type="password" name="contrasenia"/><br /> <p><button type="submit">Enviar</button></p> </form> <% }else{ String resultado = "NADA"; try{ resultado = registro.AgregaRegistro(); out.println(resultado); } catch(Exception e){ out.println("No se pudo agregar"); } }%> </body> </html>

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Con la directiva <%@ page language="java" import="java.util.* %>

110

Se incorporan libreras y no es posible usar este tipo de inclusiones para incluir otros archivos que cambian o sean dinmicos. Cuando la pagina JSP recibe valores para las variables codigo, 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.jsp"> <p>Nombre</p><input type="text" name="nombre" /><br /> <p>Codigo</p><input type="text" name="codigo" /><br /> <p>Contrasea</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.Registro" scope="page"> <jsp:setProperty name="registro" property="*"></jsp:setProperty> </jsp:useBean> Observe amigo lector que la incorporacin de Bean en una JSP se puede hacer mediante etiquetas useBean En las etiquetas useBean se presentan algunos parmetros 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. Scope: Duracin de la referencia a este Bean. Otros tipos son: sesion, page, request y application, en nuestro caso estamos diciendo que la referencia a este Bean se pierde cuando se pasa a otra pagina jsp. La pregunta que se estara haciendo en este momento el amigo lector / estudiante es: en qu momento se estn pasando las variables al Bean?. La respuesta es bien sencilla: Al poner property="*" estamos diciendo que las variables en la clase se llaman igual que la interfaz y son pasadas en forma transparente a travs de los mtodos get y set al Bean.

7.9. 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, debido a que el hace todo este trabajo para el programador y por ello lo unico que se hara en NetBeans 6.0 es ejecutar:

El se demora un tiempo mientras sube un servidor

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

112

7.10. PASO 10: EJECUCION DE LA APLICACIN


Ejecutamos un navegador web y colocamos la siguiente direccion en la barra de direcciones: http://localhost:8080/Udistrital/registro.jsp En donde aparecer una pagina similar a la siguiente:

Al hacer click sobre enviar se obtiene un resultado similar al siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

Autor: Luis Felipe Wanumen Silva

114

8. MANIPULACION DE COOKIES Y SESIONES


8.1. CREACION DE UNA COOKIE DESDE UN SERVLET
El siguiente ejemplo muestra como crear cookies desde un servlet, 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. 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. El ejemplo completo es el siguiente: import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out; resp.setContentType("text/html"); out = resp.getWriter(); out.println("<h1>Mostrando Cookies</h1>"); Cookie c1 = new Cookie("Nombre1","Luis"); Cookie c2 = new Cookie("Nombre2","Felipe"); Cookie c3 = new Cookie("Apellido1","Wanumen"); Cookie c4 = new Cookie("Apellido2","Silva"); resp.addCookie(c1); resp.addCookie(c2); resp.addCookie(c3); resp.addCookie(c4); Cookie[] cookies = req.getCookies(); for (int i = 0; i < cookies.length; i++) { Cookie c = cookies[i]; Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva String name = c.getName(); String value = c.getValue(); out.println(name + " = " + value);

115

} } }

8.2. 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, pero es importante notar que para lograr que esta creacin funcione se requiere la habilitacion de las sesiones en la pagina jsp y esto se logra mediante la instruccin: <%@page session="true"%> A continuacin se muestra el contenido de archivo sesion1.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","Luis Wanumen"); %> Al ejecutar la pagina anterior obtenemos un resultado similar al siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

116

Como quien dice, no hay resultados visibles, ya que se crea la session pero no se esta mostrando, para mostrar el contenido de la session basta con hacer una pagina jsp que invoque el metodo getAttribute() del objeto session, dicha pagina se muestra a continuacin: <%-Colocar valores en las sesiones --%> <%@page session="true"%> <% Object objetoRecibido = session.getAttribute("Nombre"); String cadena = (String)objetoRecibido; out.println(cadena); %> Al ejecutar la pagina anterior, obviamente habiendo ejecutado primero la pagina sesion1.jsp obtenemos el siguiente resultado:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

117

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

118

9. ELABORACION DE UN CHAT POR PASOS

9.1. PRIMEROS PASOS


Usamos en primera medida el paquete java.net que nos permite manejar conexiones con equipos, y en fin, nos permite el manejo de URL, ubicaciones, y estados de conexiones. Recordemos que la sentencia: try{ Sentencia,,,,,, Sentencia,,,,,, Sentencia,,,,,, Sentencia,,,,,, Sentencia,,,,,, } catch(Exception e ){ } Lo que hace es intentar ejecutar las sentencias que se encuentran dentro del try, de tal forma que si alguna de las sentencias no se puede ejecutar, inmediatamente se ejecutan las sentencias que estan en el el bloque match(Exception e). 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.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

119

9.2. UN EJEMPLO DE UN CLIENTE Y UN SERVIDOR


El siguiente es un ejemplo de una aplicacin cliente y una aplicacin servidora. 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 opcin Arrancar el Servidor, el sistema crear un ServerSocket que estar escuchando por el puerto 210

ssock = new ServerSocket(210);


En el momento que un cliente se conecte, el servidor podr ejecutar la siguiente lnea:

Socket ap_cliente1 = ssock.accept();


Con lo cual crea un Socket que atender la peticin y en seguida lee los datos que el cliente le enve y los muestra por consola, usando las siguientes instrucciones:

InputStream recibir = ap_cliente1.getInputStream(); while(true){ int c = recibir.read(); if(c==-1) break; System.out.println((char)c); }


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

Autor: Luis Felipe Wanumen Silva

120

String salida = "Hola"; byte[] bytes_enviados = salida.getBytes(); cliente = new Socket("xp",210); OutputStream envia = cliente.getOutputStream(); envia.write(bytes_enviados); System.out.println(new String(bytes_enviados));
Por ultimo las instrucciones del cliente se pueden colocar en una interfaz grfica similar a la siguiente:

De tal forma que cuando el usuario haga clic en la opcin Enviar, el sistema envie Hola al servidor. Ahora bien, con el nimo de lograr la mayor comprensin del tema por parte del amigo lector / estudiante, a continuacin se muestra el cdigo de la aplicacin que reside en el lado del servidor: Clase3.java

public class Clase3 { public static void main(String[] args) { // Create application frame. Clase3Frame frame = new Clase3Frame(); // Show frame. frame.show(); } }
Clase3Frame.java

import java.net.*;
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

121

import import import import public

java.io.*; javax.swing.*; java.awt.event.*; java.awt.*; class Clase3Frame extends JFrame {

/** * The constructor. */ ServerSocket ssock; public void arrancar() throws Exception { ssock = new ServerSocket(210); System.out.println("El servidor esta escuchando"); } public void aceptar() throws Exception{ Socket ap_cliente1 = ssock.accept(); System.out.println("Ha llegado un cliente"); InputStream recibir = ap_cliente1.getInputStream(); while(true){ int c = recibir.read(); if(c==-1) break; System.out.println((char)c); } } public Clase3Frame() { JMenuBar menuBar = new JMenuBar(); JMenu menuRedes = new JMenu(); JMenuItem menuRedesArrancar = new JMenuItem(); JMenuItem menuRedesExit = new JMenuItem(); menuRedes.setText("Redes"); menuRedesArrancar.setText("Arranque el servidor");
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

122

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

Autor: Luis Felipe Wanumen Silva

123

setSize(new Dimension(400, 400)); // Add window listener. this.addWindowListener ( new WindowAdapter() { public void windowClosing(WindowEvent e) { Clase3Frame.this.windowClosed() ; } } ); } /** * Shutdown procedure when run as an application. */ protected void windowClosed() { // TODO: Check if it is safe to close the application // Exit application. System.exit(0); } }
y el cdigo de la aplicacin que reside en el lado del cliente es: Clase4.java

public class Clase4 { public static void main(String[] args) { Clase4Frame frame = new Clase4Frame(); frame.show(); } }
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Clase4Frame.java

124

import import import import import

java.awt.*; java.awt.event.*; javax.swing.*; java.net.*; java.io.*;

public class Clase4Frame extends JFrame { Socket cliente; public void crear_cliente_y_envia() throws Exception{ String salida = "Hola"; byte[] bytes_enviados = salida.getBytes(); cliente = new Socket("xp",210); OutputStream envia = cliente.getOutputStream(); envia.write(bytes_enviados); System.out.println(new String(bytes_enviados)); } public Clase4Frame() { JMenuBar menuBar = new JMenuBar(); JMenu menuRedes = new JMenu(); JMenuItem menuRedesEnviar = new JMenuItem(); JMenuItem menuRedesExit = new JMenuItem(); menuRedes.setText("Redes"); menuRedesEnviar.setText("Enviar"); menuRedesExit.setText("Salir"); menuRedesEnviar.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) { try{
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

125

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

Autor: Luis Felipe Wanumen Silva

126

System.exit(0); } }
Cuando el Servidor detecta que ha llegado un cliente, lo que hace es atenderlo y recibe lo que ste le est enviando. Para el caso especfico de nuestro ejemplo, se tiene un resultado en trminos de ejecucin similar al siguiente:

que se presenta cuando se ejecuta la aplicacin cliente y se le da clic en el botn Enviar. Como el amigo lector / estudiante pudo observar, el anterior cdigo en esencia no es largo, lo que sucede es que el hecho de haberlo colocado en una interfaz agradable al usuario hace que sean necesarias la incorporacin de varias lneas, pero esto en ltimas es puro maquillaje de interfaz grfica. Lo que si debe ser claro para el lector es que el cdigo anterior se hizo en varios archivos para lograr que se tengan buenos hbitos de programacin y se trate de trabajar en forma modular y no como hacen muchas personas: todo el cdigo en un solo archivo. Espero que el ejercicio halla sido de agrado para el lector.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

127

9.3. EL METODO ACCEPT DE SERVERSOCKET


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

Autor: Luis Felipe Wanumen Silva

128

El programa en el lado del cliente es:

import java.net.*; public class Cliente { public Cliente(){ try{ Socket objetoServidor = new Socket("localhost",80); System.out.println("Pude crear el objeto cliente"); } catch(Exception e){ System.out.println("No pude crear el objeto cliente"); } } // Cierra public Servidor() public static void main(String[] args) { System.out.println("Hola Soy el CLIENTE"); Cliente principal = new Cliente(); } }

9.4. SEGUNDA MEJORA AL PROGRAMA ANTERIOR


El programa anterior solamente permitia que un servidor aceptara conexiones de varios cliente, pero no permitia que el cliente enviara informacin o que el servidor le enviara al cliente, en fin, no permitia enviar informacin de un lado hacia el otro. Para permitir el envio de informacin desde un equipo hasta otro se usa el paquete java.io.*; (Obviamente se sigue usando java.net para la conexion) La siguiente tabla resume los metodos que se aadieron al programa cliente y al programa servidor: PROGRAMA Servidor.java Cliente.java METODO AADIDO readUTF() writeUTF() CLASE QUE SE USA ObjectInputStream ObjectOutputStream

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

129

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

Autor: Luis Felipe Wanumen Silva

130

carritoSalida.writeUTF("Yo me llamo cumbia yo soy la reina..."); System.out.println("Le envie al servidor la cancion YO ME LLAMO CUMBIA"); } catch(Exception e){ System.out.println("Errores en el cliente"); } } // Cierra public Servidor() public static void main(String[] args) { System.out.println("Hola Soy el CLIENTE"); Cliente principal = new Cliente(); } }

9.5.

MEJORANDO EL PROGRAMA ANTERIOR COLOCANDOLE UNAS BELLAS INTERFACES GRAFICAS

El programa del cliente anterior lo queremos mejorar usando una interfaz de usuario mas agradable, el objetivo es mostrar una interfaz similar a la siguiente:

Para ello mejoramos el programa con las instrucciones siguientes: import java.net.*; // Para las conexiones import java.io.*; // Para flujos y archivos import java.awt.*; // Para botones, cajas, etc. public class Cliente extends Frame{ Panel panelcillo = new Panel(); TextField cajilla = new TextField(" Enciclopedia Conociendo "); Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Button botoncillo = new Button("Enviar"); public Cliente(){ add(panelcillo); panelcillo.add(cajilla); panelcillo.add(botoncillo); try{ Socket objetoCliente = new Socket("localhost",85); System.out.println("Pude crear el objeto cliente");

131

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

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva EventoEnviar objetoEvento = new EventoEnviar(); // Las clases en java que implementan ActionListener son // clases de tipo evento. Cuando se activa el evento // se ejecuta el metodo actionPerformed. public class EventoEnviar implements ActionListener{ public void actionPerformed(ActionEvent ev){ try{ Socket objetoCliente = new Socket("localhost",85); System.out.println("Pude crear el objeto cliente");

132

// Esto crea un flujo de salida basado en la conexion // que tiene el objeto objetoCliente. OutputStream salida = objetoCliente.getOutputStream(); DataOutputStream carritoSalida = new DataOutputStream(salida); carritoSalida.writeUTF(cajilla.getText()); System.out.println("Le envie al servidor la cancion YO ME LLAMO CUMBIA"); } catch(Exception e){ System.out.println("Errores en el cliente"); } } // Cierra public void actionPerformed } // Cierra ActionListener public Cliente(){ add(panelcillo); panelcillo.add(cajilla); panelcillo.add(botoncillo); // 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. botoncillo.addActionListener(objetoEvento);

} // Cierra public Servidor() public static void main(String[] args) { System.out.println("Hola Soy el CLIENTE"); Cliente principal = new Cliente(); principal.setSize(800,600); principal.setVisible(true); } }

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

133

9.6. EL SERVIDOR CREA AADE 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. Esto se logra por medio de una clase nueva llamada LISTACLIENTES, la cual contiene una subclase llamada NODOCLIENTE, la cual contendra la informacin necesaria de un solo cliente.

En terminos graficos la situacin es la siguiente:

apCabeza Cuando no ha llegado cliente alguno.

NULL

En el momento en el que llega un cliente la situacin debe ser la siguiente:

apCabeza

NODOCLIENTE

NULL

En el momento en el que se conecte un tercer cliente la situacin es la siguiente: apCabeza

NODOCLIENTE

NODOCLIENTE

NULL

La anterior diagramacin es bastante compleja de implementar sin otro apuntador, con lo cual la situacin mas facil de implementar es de la siguiente manera: apCabeza NULL apFINAL Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

134

Para el primer cliente la situacin es la siguiente; apCabeza apFinal

NODOCLIENTE sig

NULL

Para el caso del segundo cliente: apCabeza apFinal

NODOCLIENTE

NODOCLIENTE

NULL

Para el caso del tercer cliente:

apCabeza

apFinal

NODOCLIENTE

NODOCLIENTE

NODOCLIENTE

NULL

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

135

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

136

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva CLIENTE principal = new CLIENTE(); } }

137

Hasta ahora cada vez que un cliente se conecta, en el lado del servidor se aade un nodo a la lista, el cual se encarga de atender a dicho cliente. Viene la parte mas dura que es lo que el servidor recibio del cliente, debe enviarlo a todos los clientes. lo mejor que se puede sin usar hilos es lo siguiente: import java.net.ServerSocket; import java.net.Socket; public class SERVIDOR { LISTACLIENTES objListaClientes; public SERVIDOR(){ objListaClientes = new LISTACLIENTES(); try{ ServerSocket objServidor = new ServerSocket(85); while(true){ System.out.println("Esperando a un cliente"); Socket refClientecillo = objServidor.accept(); System.out.println("Ya llego este cliente"); objListaClientes.adicionarCliente(refClientecillo); objListaClientes.devolverListaClientes(); } // Cierra while } catch(Exception e){ System.out.println("Algo raro ocurrre en el servidor"); } } public static void main(String[] args) { // TODO, add your application code System.out.println("Hello World!"); SERVIDOR principal = new SERVIDOR(); } }

9.7. QUE ES UN HILO


Es un subproceso que tiene caracteristicas como se puede suspender, reactivar, dormir y eliminar definitivamente el subproceso.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

138

9.8 CHAT PUBLICO USANDO HILOS


El ejercicio completo es el siguiente: import java.net.ServerSocket; import java.net.Socket; import java.awt.*; public class SERVIDOR { LISTACLIENTES objListaClientes;

public SERVIDOR(){ objListaClientes = new LISTACLIENTES(); try{ ServerSocket objServidor = new ServerSocket(85); while(true){ System.out.println("Esperando a un cliente"); Socket refClientecillo = objServidor.accept(); System.out.println("Ya llego este cliente"); objListaClientes.adicionarCliente(refClientecillo); objListaClientes.devolverListaClientes(); } // Cierra while } catch(Exception e){ System.out.println("Algo raro ocurrre en el servidor"); } } public static void main(String[] args) { // TODO, add your application code System.out.println("Hello World!"); SERVIDOR principal = new SERVIDOR(); } } import java.net.Socket; import java.io.*; public class LISTACLIENTES{ public class SubProceso extends Thread{ String lectura; InputStream entrada; DataInputStream entra; public SubProceso(Socket r){ Enciclopedia Conociendo Curso de Jsp y Servlets

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

139

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva nuevosubproceso.start(); } // Cierra try catch(Exception e){ System.out.println("Error leyendo datos del cliente"); } } // Cierra if(apCabeza==NULL) else{ NODOCLIENTE nuevoCliente = new NODOCLIENTE(); // RefCliente es el que realmente atiende al cliente. nuevoCliente.RefCliente = ref; try{ SubProceso nuevosubproceso = new SubProceso(ref); nuevosubproceso.start(); } // Cierra try catch(Exception e){ System.out.println("Error leyendo datos del cliente"); } apFinal.sig = nuevoCliente; // Verde apFinal = nuevoCliente; // Rojo } } // Cierra public adicionarCliente public void devolverListaClientes(){ System.out.println("Estamos en la funcion devolverListaClientes"); NODOCLIENTE apRecorrer; apRecorrer = apCabeza; // Recorre la lista de clientes. while(apRecorrer!=null){ System.out.println(apRecorrer.RefCliente.toString()); // Si no se ejecuta esto, se queda // en un ciclo infinito. apRecorrer = apRecorrer.sig; } // Cierra while } // Cierra public void devolverListaClientes()

140

public void enviarAClientes(String mensaje){ System.out.println("Estamos en la funcion devolverListaClientes"); NODOCLIENTE apRecorrer; apRecorrer = apCabeza; // Recorre la lista de clientes. while(apRecorrer!=null){ try{ OutputStream salida = apRecorrer.RefCliente.getOutputStream(); DataOutputStream sale = new DataOutputStream(salida); sale.writeUTF(mensaje); } catch(Exception e){ System.out.println("Error enviando a todos los clientes"); } // Si no se ejecuta esto, se queda // en un ciclo infinito. Enciclopedia Conociendo Curso de Jsp y Servlets

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

141

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

142

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

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

143

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

144

10. 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 programacin. Es importante recordar que en algunas metodologas se es mas riguroso en el modelamiento que en otras, por ejemplo en RUP hay mas rigurosidad en el modelamiento, en tanto que en RUP hay menos rigurosidad, debido bsicamente que se presume mas experiencia de los desarrolladores, pero de todas formas en ambas se requiere modelamiento.

10.1. 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, a saber una coneccion puede estar suspendida, activa, desactiva o en cualquier otro estado, 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. Para hacer metodologicos y mas claros, se presenta a continuacin un modelamiento de un envio de informacin de un cliente a un servidor y en ella se usa un diagrama de estados para modelar el estado de las conecciones. Obviamente el ejemplo no es lo mas completo, porque si asi fuera se extenderia tanto como un documento de soporte a una aplicacin y esto se escapa del presente material, pero si da una introduccin de la importante del diagrama de estados en el modelamiento de aplicaciones con redes y concretamente con sockets TCP

10.1.1. DESCRIPCION
El ejemplo que se muestra a continuacin realmente solamente implementa en un solo sentido el flujo de informacin, es decir los clientes se conectan e intentan enviar flujos de informacin a los servidores, y los servidores solamente reciben la informacin y la manipulan. La otra parte en donde el servidor enva informacin al cliente no se ha tenido en cuenta.

10.1.2. EL LADO DEL SERVIDOR ES:

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 aplicacin 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. 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, caso en el cual no hay que volver al estado de iniciado ni ninguno de los anterior, sino que se puede seguir en dicho estado a menos que se caiga la coneccion y se pasaria al estado de desactivado. Mi nuevo estado es denegado

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

146

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

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

147

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

148

10.1.3. EL LADO DEL CLIENTE ES:


SocketCliente_conectado

SocketClien te_aceptado

SocketCliente_ enviandoDatos

SocketCliente_esperandoC onfirmacionRecibidoServidor

SocketCliente_env iandoFlujodeDatos

SocketCliente_fueraDeContexto SocketClient e_denegado

La aplicacin del lado del cliente esta compuesta por dos archivos MyApp.java y Cliente.java Archivo MyApp.java import java.awt.*; import java.awt.event.*; public class MyApp extends Frame { TextField texto = new TextField(" "); Cliente cliente = new Cliente(); // Evento objEvento = new Evento(); Button boton1 = new Button("Enviar"); Panel panel1 = new Panel();

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

149

Curso de Jsp y Servlets

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

150

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

151

El primer estado es un estado desactivo el del sobket que envia, debido a que no se ha creado. Pero tan pronto se crea el socket, el programa observa si se ha recibido aceptacin por parte del servidor y en este caso pasa al estado de aceptado. Despus 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. Una vez se ha estado en este estado y se ha logrado satisfactoriamente la creacin 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. Observese la continuidad del estado enviandoDatos, este estado no permite devolverse hacia estados predecesores y el unico estado que puede ocurrir despus de este es el mismo o en su defecto y por error en las comunicaciones el estado de desactivo.

10.2. IMPORTANCIA DEL DIAGRAMA DE CLASES EN EL MODELAMIENTO DE UN PROGRAMA DE UN PIRATA

10.2.1. PLANTEAMIENTO DEL ENUNCIADO


Un pirata ebrio se tambalea al subir por una rampa del muelle a su barco. La rampa tiene cinco pasos de ancho y 15 de largo. Comenzamos a observar al pirata cuando est en el extremo de la rampa que se apoya sobre el muelle. Si da ms de dos pasos hacia la izquierda o la derecha, caer en el agua y se ahogar, pero si da ms de 15 pasos hacia delante estar a salvo a bordo de su barco.

10.2. ESTABLECIMIENTO DE FRASES IMPORTANTES.


Un pirata ebrio se tambalea Un pirata sube por una rampa La rampa tiene cinco pasos de ancho y 15 de largo. 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. Cuando el pirata se cae, se ahoga Si el pirata da mas de 15 pasos hacia delante estar a salvo. Cuando est a salvo no se ahoga El pirata en el barco estar a salvo.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

152

10.2.2. 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) : 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, int) : void informar_caer_al_mar: void()

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

153

10.2.3. PROGRAMA EN JAVA

import java.awt.*; import java.awt.event.*; import java.applet.*; public class MyApp extends Applet { GridLayout grilla = new GridLayout(15,5,1,1); BorderLayout borde = new BorderLayout(4,4); Panel paneles[][] = new Panel[5][15]; Graphics gp[][] = new Graphics[5][15]; int actual_x, actual_y; Panel superior = new Panel(); Panel arriba = new Panel(); Panel inferior = new Panel(); TextArea ta = new TextArea(5,30); TextField t1 = new TextField("EL PIRATA PESA"); pirata IngSistemas = new pirata(); rampa Rampa = new rampa(); mar Mar = new mar(); boolean salvado = false; barco Barco = new barco(); muelle Muelle = new muelle(); public void paint(Graphics g) { for(int x = 0; x<5; x++){ for(int y = 0; y<15; y++){ gp[x][y] = paneles[x][y].getGraphics(); if(x == actual_x && y == actual_y){ paneles[x][y].setBackground(Color.red); } else{ paneles[x][y].setBackground(Color.white); } // Cierra else } // cierra for interno } // cierra for externo } // cierra paint() public class mar{

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

154

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

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

155

public class muelle{ int peso_actual = 70; String peso_cadena = ""; public void soportar_peso(int valor){ peso_actual = valor; } // Cierra void soportar_peso public void informar_peso(){ peso_cadena = t1.getText().trim(); peso_cadena = peso_cadena + " "; peso_cadena = peso_cadena + peso_actual; peso_cadena = peso_cadena + "KILOS "; t1.setText(peso_cadena); }// int informar_peso } // Cierra class muelle public class rampa{ int pos_x=0; int pos_y=0; String mensaje = "EL MUELLE HABLA; \n"; public void validar_salida(int x, int y){ pos_x = x; pos_y = y; if(pos_y<0){ mensaje = mensaje + "Fuera ta.setText(mensaje); tirar_al_mar(); } if(pos_x<0){ mensaje = mensaje + "Fuera ta.setText(mensaje); tirar_al_mar(); } if(pos_x>=5){ mensaje = mensaje + "Fuera ta.setText(mensaje); tirar_al_mar(); } if(pos_y>=15){ mensaje = mensaje + "NO LO ta.setText(mensaje); Barco.salvar_pirata(); } del rango y";

del rango x";

del rango x";

DEJE CAER";

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

156

} // Cierra void validar_salida() public void tirar_al_mar(){ Mar.ahogar(IngSistemas); } // Cierra void tirar_al_mar() } // Cierra class rampa public class pirata{ int pos_x; int pos_y; int peso = 75; // Kilos boolean estado_vida = true; public void moverse(int i, int j){ if(estado_vida){ pos_x = i; pos_y = j; Rampa.validar_salida(pos_x, pos_y); } // Cierra if } // Cierra moverse public void dejarse_ahogar(){ estado_vida = false; } //Cierra void dejarse_ahogar } // Cierra clase pirata public boolean keyDown(Event evt, int key){ if(IngSistemas.estado_vida && salvado==false){ switch(key){ case Event.RIGHT: actual_x++; IngSistemas.moverse(actual_x, actual_y); repaint(); break; case Event.LEFT: actual_x--; IngSistemas.moverse(actual_x, actual_y); repaint(); break; case Event.UP: actual_y--; IngSistemas.moverse(actual_x, actual_y); repaint(); break;

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

157

} return true; } // Cierra if externo return false; } // Cierra boolean // Cierra clase MyApp

case Event.DOWN: actual_y++; IngSistemas.moverse(actual_x, actual_y); repaint(); break;

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

158

10.2.4. EJECUCIN DEL PROGRAMA:


El programa anterior muestra una grilla en donde se encuentra una celda que tiene un color rojo a diferencia de las dems celdas. Esto para el caso del programa que estamos explicando indica que el pirata se encuentra en dicha posicin.

Ahora bien, el usuario, puede desplazarse mediante las teclas de direccin del teclado y de esta manera podr mover el pirata. (que en este caso es la posicin roja). Si el usuario no lo deja desbordarse por alguna posicin de la derecha o de la izquierda y llega a la posicin de debajo de la figura, se obtiene un resultado similar al 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, aparecer una pantalla similar a la siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

160

Con lo cual se indica que efectivamente se ha caido el pirata al mar y por supuesto se ha ahogado.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

161

10.3. IMPORTANCIA DEL DIAGRAMA DE CLASES EN EL MODELAMIENTO DE UN PROGRAMA DE UN AVION

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

MyApp tablero : canvitas = new avioncito Curso de Jsp y Servlets : avion = new MyApp() main()

Autor: Luis Felipe Wanumen Silva

162

10.3.2. EXPLICACIN DE LA IMPLEMENTACIN


La implementacin del ejercicio anterior se hizo basndose 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. En ltimas sta tcnica ayuda a un buen mantenimiento de los aplicativos y aunque a nivel de mquina no siempre resulta ser la mejor opcin, por lo menos si asegura ser la mejor opcin cuando se requieran hacer modificaciones al respecto. A continuacin se muestran pues los contenidos de cada uno de los archivos que llevan a solucionar el problema del avin. Veamos pues:

avion.java

import java.awt.*; import java.awt.event.*; import java.applet.*; public class avion{ Graphics h; int x = 150; int y = 400; rectangulo cuerpo = new rectangulo(); rectangulo cola = new rectangulo(); triangulo ala_superior = new triangulo(); triangulo ala_inferior = new triangulo(); triangulo punta = new triangulo(); int matriz[][] = new int[17][4]; int colita[][]; int cuerpito[][]; int puntica[][];

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

163

int alita_arriba[][]; int alita_abajo[][] = new int[3][4]; int trompta[][] = new int[3][4]; public avion(){ // Por medio de punta se establece // el tamao del avion punta.alto = 40; }// Cierra public avion public void alejarse(){ if(punta.alto>10){ punta.alto = punta.alto - 1; }// Cierra ir } // Cierra void alejarse public void ascender(){ if(y>20){ y = y - 5; }// Cierra ir } // Cierra void alejarse public int[][] devolver_grafica(){ // punta.alto = 20; punta.posx = x; punta.posy = y; punta.ajustarse("punta"); cuerpo.alto = punta.alto; cuerpo.ancho = cuerpo.alto*6; cuerpo.posx = punta.posx1-cuerpo.ancho; cuerpo.posy = punta.posy - (int)punta.alto/2; cola.posicionar(cuerpo); ala_superior.ajustarse("ala_superior", cuerpo); ala_inferior.ajustarse("ala_inferior", cuerpo); colita = cola.devolver_grafica(); puntica = punta.devolver_grafica(); cuerpito = cuerpo.devolver_grafica(); alita_arriba = ala_superior.devolver_grafica(); alita_abajo = ala_inferior.devolver_grafica(); for(int i = 0; i<4; i++){ for(int j = 0; j<4; j++){

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

164

matriz[i][j] = colita[i][j]; } // Cierra for interno for(int k = 0; k<4; k++){ matriz[i+4][k] = cuerpito[i][k]; } // Cierra for interno for(int m = 0; m<3; m++){ matriz[m+8][i] = puntica[m][i]; } // Cierra for interno for(int n = 0; n<3; n++){ matriz[n+11][i] = alita_arriba[n][i]; } // Cierra for interno for(int p = 0; p<3; p++){ matriz[p+14][i] = alita_abajo[p][i]; } // Cierra for interno } // Cierra for externo return matriz; } // Cierra devolver_grafica public void moverse(){ x = x+8; }// Cierra void moverse } // Cierra class avion

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

165

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

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

166

MyApp.java import java.awt.*; import java.awt.event.*; public class MyApp extends Frame { canvitas tablero = new canvitas(); avion avioncito = new avion(); int apariciones = 500; public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); add(tablero); tablero.pintar(avioncito); } public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(960,600); f.show(); } }

rectangulo.java

import java.awt.*; import java.applet.*; public class rectangulo{ Graphics h; int posx, posy, ancho, alto; int rectangulillo[][] = new int[4][4]; public rectangulo(){

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

167

} // Cierra public rectangulo public int[][] devolver_grafica(){ rectangulillo[0][0] = posx; rectangulillo[0][1] = posy; rectangulillo[0][2] = posx+ancho; 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; posy; posx; posy+alto; posx+ancho; posy; posx+ancho; posy+alto;

rectangulillo[3][0] = posx; rectangulillo[3][1] = posy+alto; rectangulillo[3][2] = posx+ancho; rectangulillo[3][3] = posy+alto; return rectangulillo; } // Cierra int[][] devolver_grafica public int posicion_derecha(){ return posx+ ancho; } // Cierra int posicion_derecha public int posicion_superior(){ return posy; } // Cierra int posicion_superior public int posicion_inferior(){ return posy+alto; } // Cierra int posicion_inferior public void posicionar(rectangulo rect){ ancho = (int)rect.ancho/5; alto = rect.alto*3; posx = rect.posx -ancho; posy = rect.posy - (rect.alto); } // Cierra mover_derecha

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

168

public void actualizar_rectangulo(int x, int y, int ancho, int alto){ posx = x; posy = y; this.ancho = ancho; this.alto = alto; } // Cierra public rectangulo public void alargar(int valor){ ancho = ancho + valor; } // Cierra alargar public void adelgazar(int valor){ alto = alto - valor; } // Cierra adelgargar } // Cierra class rectangulo

triangulo.java

import java.applet.*; public class triangulo{ int posx; int posy; int posx1; int posy1; int posx2; int posy2; int pos[][] = new int[3][4]; int alto; public int[][] devolver_grafica(){

Enciclopedia Conociendo

Curso de Jsp y Servlets

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; posy; posx1; posy1; posx; posy; posx2; posy2; posx1; posy1; posx2; posy2;

return pos; } // Cierra int[][] devolver_grafica

public void ajustarse(String tipo){ if(tipo.equals("punta")){ posx1 = posx - (int)alto; posy1 = posy - (int)alto/2; posx2 = posx - (int)alto; posy2 = posy + (int)alto/2; System.out.println("posx = "+ posx ); System.out.println("posy = "+ posy ); System.out.println("posx1 = "+ posx1 ); System.out.println("posy1 = "+ posy1 ); System.out.println("posx2 = "+ posx2 ); System.out.println("posy2 = "+ posy2 ); } }// Cierra if tipo == "punta" public void ajustarse(String tipo, rectangulo body){ if(tipo.equals("ala_superior")){ posy = body.posy - body.alto*2; posx = body.posx + (int )body.ancho/3; posx1 = body.posx + (int)body.ancho/3 + (int)body.ancho/6; posy1 = body.posy; posx2 = body.posx + (int)body.ancho/3 + (int)body.ancho/3; posy2 = body.posy; }// Cierra if tipo == "ala_superior" if(tipo.equals("ala_inferior")){

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

170

posy = body.posy + body.alto + body.alto*2; posx = body.posx + (int )body.ancho/3; posx1 = body.posx + (int)body.ancho/3 + (int)body.ancho/6; posy1 = body.posy + body.alto; posx2 = body.posx + (int)body.ancho/3 + (int)body.ancho/3; posy2 = body.posy + body.alto; System.out.println("ESTOY EN EL FI"); System.out.println("posx = "+ posx); System.out.println("posy = "+ posy); System.out.println("posx1 = "+ posx1); System.out.println("posy1 = "+ posy1); System.out.println("posx2 = "+ posx2); System.out.println("posy2 = "+ posy2); }// Cierra if tipo == "ala_superior" } // Cierra void ajustarse public triangulo(){ } // Cierra triangulo } // Cierra class triangulo

10.3.3. EJECUCIN DEL PROGRAMA

Inicialmente el programa aparece el avin de la siguiente manera:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

171

Y a medida que pasa el tiempo se va elevando el avin, tal como se muestra en la siguiente grfica:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

172

Finalmente el avin llega a un punto en el que alcanza la altura mxima y contina 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 enva correo de una direccin de correo interna y valida en la intranet hacia otra direccin 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 direccin de internet. Fijmonos que no requiere la contrasea o clave del correo electrnico 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 Sesin 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 lneas. Normalmente * usted nunca necesitara 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 envo de correo electrnico, pero este envo tambin se podra hacer usando sockets con el costo de tener que conocer a profundidad el protocolo SMTP. Un servidor de correo electrnico por lo general devuelve el cdigo 220 que significa que el servicio de correo est arriba. El cdigo 220 se puede consultar en el RFC siguiente: http://www.rfc-editor.org/rfc/rfc821.txt A continuacin hacemos un programa que nicamente hace una conexin 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 habra respondido con el cdigo 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 funcin 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 enve al servidor de correo quien envia el correo, a quien se le envia y el mensaje, despus de lo cual se termina el envio con un punto tal como se muestra a continuacin:
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

Autor: Luis Felipe Wanumen Silva

178

salida.println( "Mensaje de prueba "+timeStamp ); salida.println( "." ); System.out.println(entrada.readLine()); } catch(Exception e){ } } public static void main(String[] args) { Main programa = new Main(); } }

Es importante tener en cuenta que este ejercicio se puede modificar para que enve archivos adjuntos, y muchas otras cosas mas.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

179

12. ENVIO DE ARCHIVOS POR FTP


12.1. CONECTARSE A SERVIDOR FTP
El siguiente ejemplo muestra como conectarse a un servidor FTP, 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.
import import import import import import java.io.DataInput.*; java.io.DataInputStream.*; java.io.*; java.io.IOException; sun.net.TelnetInputStream; sun.net.ftp.*;

public class MyApp { public static void main(String[] args) { String server ="gemini.udistrital.edu.co"; String user = "lwanumen"; String passwd ="1234"; FtpClient client =new FtpClient(); try { client.openServer(server); client.login(user, passwd); client.binary(); client.cd("LUCHIN"); } catch (IOException e) { e.printStackTrace(); } try { TelnetInputStream in = client.get("ftp1.txt"); FileOutputStream sale =new FileOutputStream("d:\\a.txt"); int t; int i; byte []h=new byte[100]; //while(t=in.read()) //System.out.println(in.); i=in.read(h); sale.write(h); //DataInputStream t=3Dnew h.toString(); Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva System.out.println("valor=3D"+h); } catch (IOException e) { e.printStackTrace(); } } // main } // Cierra FTP

180

Para ejecutar los ejemplos siguientes se puede descargar un jar llamado simpleftp.jar que se puede descargar de la siguiente direccin electrnica: http://www.jibble.org/files/simpleftp.jar

12.2. ENVIAR ARCHIVOS A SERVIDOR FTP


import import import import java.awt.*; java.awt.event.*; org.jibble.simpleftp.*; java.io.*;

public class MyApp extends Frame { public MyApp() { this.addWindowListener (new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } }); try { SimpleFTP ftp = new SimpleFTP(); // Nos conectamos a servidor FTP por puerto 21 ftp.connect("ftp.udistrital.edu.co", 21, "lwanumen", "1234"); // Establecemos el modo binario ftp.bin(); // nos pasamos al directorio llamado "javaweb" // que se encuentra en el servidor FTP. ftp.cwd("javaweb");

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva // Subimos el archivo ftp.stor(new File("hojadevida.txt")); ftp.stor(new File("fotojojavida.png")); // Nos desconectamos del servidor FTP. ftp.disconnect(); } catch (IOException e) { } } // Cierra public MyApp public static void main(String args[]) { System.out.println("Starting App"); MyApp f = new MyApp(); f.setSize(100,100); f.show(); } }

181

12.3. CONECCION SERVIDOR FTP USANDO SOCKETS


Es importante que el estudiante conozca los elementos de una coneccion a bajo nivel, 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.io.BufferedInputStream; java.io.BufferedOutputStream; java.io.BufferedReader; java.io.BufferedWriter; java.io.File; java.io.FileInputStream; java.io.IOException; java.io.InputStream; java.io.InputStreamReader; java.io.OutputStreamWriter; java.net.Socket; java.util.StringTokenizer;

public class MyApp{ private BufferedReader lector = null; private BufferedWriter escritor = null; Socket socket = null; public MyApp(){ try{ // CREAR EL CLIENTE socket = new Socket("gemini.udistrital.edu.co", 21); // CREAR EL FLUJO DE ENTRADA Y DE SALIDA lector = new BufferedReader(new Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva InputStreamReader(socket.getInputStream())); escritor = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // LEER DEL SERVIDOR String line = lector.readLine(); System.out.println(line); // // // if VERIFICAR LA RESPUESTA DEL SERVIDOR VERIFICAR QUE EL SERVIDOR ESTE ARRIBA Y PREPARADO PARA ACEPTAR USUARIOS (!line.startsWith("220 ")){ throw new IOException("recibido respuesta No conocida");

182

} else{ System.out.println("220 Servicio preparado nuevo usuario"); } // ENVIARLE EL NOMBRE DE USUARIO escritor.write("USER lwanumen\n"); escritor.flush(); // CAPTURAR LA RESPUESTA DEL SERVIDOR FRENTE A LA PETICION // DE NOMBRE DE USUARIO line = lector.readLine(); // VERIFICAR QUE LA RESPUESTA DEL SERVIDOR SEA CORRECTA // Y QUE HALLA DICHO QUE EL USUARIO EXISTE if (!line.startsWith("331 ")){ throw new IOException("El usuario no existe"); } else{ System.out.println("331 Usuario OK, necesita contrasea"); } // ENVIARLE EL PASSWORD DEL USUARIO escritor.write("PASS LUISLUIS\n"); escritor.flush(); // CAPTURAR LA RESPUESTA DEL SERVIDOR FRENTE A LA PETICION // DE ENVIO DEL PASSWORD line = lector.readLine(); // VERIFICAR QUE LA RESPUESTA DEL SERVIDOR SEA CORRECTA // Y QUE HALLA DICHO QUE EL PASSWORD ES CORRECTO if (!line.startsWith("230 ")){ throw new IOException("El password es incorrecto"); } else{ System.out.println("Usuario conectado, contine"); } // SOLICITAMOS AL SERVIDOR EL NOMBRE DEL DIRECTORIO Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva // DE TRABAJO escritor.write("PWD \n"); escritor.flush(); // CAPTURAR LA RESPUESTA DEL SERVIDOR FRENTE A LA PETICION // DE CONOCER EL NOMBRE DEL DIRECTORIO line = lector.readLine(); // // // if

183

} else{ System.out.println("Ruta NO creada"); }

VERIFICAR QUE LA RESPUESTA DEL SERVIDOR SEA CORRECTA Y QUE HALLA DICHO QUE SE PUDO ESTABLECER UN NOMBRE DE DIRECTORIO ACTUAL (line.startsWith("257 ")) { System.out.println("Ruta creada"); int firstQuote = line.indexOf('\"'); int secondQuote = line.indexOf('\"', firstQuote + 1); if (secondQuote > 0) { String dir = line.substring(firstQuote + 1, secondQuote); System.out.println("El directorio de trabajo es "+dir); }

// SOLICITAMOS AL SERVIDOR QUE CAMBIE AL DIRECTORIO // DE TRABAJO LUCHIN escritor.write("CWD LUCHIN\n"); escritor.flush(); // CAPTURAR LA RESPUESTA DEL SERVIDOR FRENTE A LA PETICION // DE CAMBIAR AL DIRECTORIO LUCHIN line = lector.readLine(); // VERIFICAR QUE LA RESPUESTA DEL SERVIDOR SEA CORRECTA // Y QUE HALLA DICHO QUE SE PUDO CAMBIAR AL DIRECTORIO // LUCHIN if (!line.startsWith("250 ")){ throw new IOException("La accin sobre fichero NO BIEN"); } else{ System.out.println("La accin sobre fichero SI BIEN"); } } catch(Exception e){ System.out.println(e.toString()); } } // Cierra MyApp public static void main(String args[]) MyApp f = new MyApp(); } Enciclopedia Conociendo {

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva }

184

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

185

13. TRABAJANDO CON RMI

13.1. DESCRIPCION DE EJERCICIO

13.2. PRIMERO CREAMOS Y COMPILAMOS LA CLASE INTERFACE


Esta clase es la que indica que mtodos van a estar disponibles para el cliente, es decir que mtodos puede invocar el cliente. import java.rmi.*; public interface archivoI extends Remote{ String Dev_datos(String cliente) throws dRemoteException; } Al compilarla debe salir una pantalla similar a la siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

186

13.3. 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. En pocas palabras cuando el cliente solicite algo al servidor, debe primero solicitar que el servidor le cree una instancia archivoO para que esta instancia lo atienda por medio de su metodo Dev_datos(). import java.rmi.*; import java.rmi.server.*; public class archivoO extends UnicastRemoteObject implements archivoI{ public archivoO() throws RemoteException{ super(); } public String Dev_datos(String cliente) throws RemoteException{ return "Hola como estas"; } } Al compilarlo nos debe aparecer una pantalla similar a la siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

187

13.4. CREAMOS LA APLICACIN DEL LADO DEL SERVIDOR


import java.rmi.*; import java.rmi.server.*; public class archivoS{ public static void main(String args[]){ try{ if(System.getSecurityManager()==null){ System.setSecurityManager(new RMISecurityManager()); } archivoO objetoRemoto = new archivoO(); Naming.rebind("remotinalias",objetoRemoto); System.out.println("Objeto remoto preparado para usarse por parte del cliente"); } catch(Exception e){ } } // Cierra public static void main } // Cierra public class archivoO Compilamos la aplicacin del lado del servidor

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

188

13.5. REGISTRAR EL OBJETO REMOTO


rmic archivoO

13.6. SUBIR EL SERVIDOR RMI


Con la instruccin start rmiregistry

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

189

13.7. COLOCAMOS LA APLICACIN QUE HICIMOS EN EL SERVIDOR RMI


Start Djava.rmi.server.hostname=athlon.paralela.local Djava.security.policy=java.policy archivoS Start java Djava.security.policy=java.policy archivoS Tambien se puede con los commandos: java -Djava.rmi.server.hostname=127.0.0.1 -Djava.security.policy=java.policy archivoS start java archivoS

13.8. INVOCACION DEL CLIENTE


try{ archivoI ob = (archivoI)Naming.lookup( direccion+" remotinalias " ); obj.Dev_datos() } Catch(Exception e){ }

13.9. SCRIPT PARA EJECUTAR EL CLIENTE


cls path = c:\Archivos de Programa\Java\jdk1.6.0\bin javac Cliente.java java -Djava.security.policy=java.policy Cliente Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

190

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

191

14. BEAN Y JAVA BEAN

14.1. ARQUITECTURA DE LOS JAVA BEAN


En EJB 2.X los EJB tenan que estar en un contenedor de Beans.

EJB 1 VIVO CONTENEDOR DE BEANS EJB2.X EJB 2 VIVO

En EJB 2.X si un EJB se saca de un contenedor de Beans, no se pueden ejecutar.

CONTENEDOR DE BEANS EJB2.X

EJB 1

MUERT O

EJB 2

MUERT O

Un Session Bean es un objeto que se instancia durante una sesin. Cada instancia es visible tan solo para un cliente. Para otro cliente es visible otra instancia de dicho Session Bean.

EJB SESSION

Instancia 1

CLIENTE1

CONTENEDOR DE BEANS EJB2.X Instancia 2 Instancia 3

CLIENTE2

CLIENTE3

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

192

Un Session Bean esta en un contexto

EJB SESSION

Instancia 1 Instancia 2 Instancia 3

CLIENTE1

CONTEXTO

CLIENTE2

CLIENTE3

Hay instancias locales y remotas de un Session Bean

Instancia Local 1
EJB SESSION

Instancia Remota 1 Instancia Local 2

CONTEXTO Instancia Remota 2 Instancia Local 3 Instancia Remota 3

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

193

Cuando el cliente accede desde el mismo contexto accede a la instancia local, tal como se muestra en el siguiente grafico:

Instancia Local 1
EJB SESSION

Cliente1 Local

Instancia Remota 1 Instancia Local 2


Cliente2 Local

CONTEXTO Instancia Remota 2 Instancia Local 3


Cliente3 Local

Instancia Remota 3 Y cuando el cliente accede desde un contexto diferente accede a la instancia remota del EJB de Session.

Instancia Local 1
EJB SESSION

Instancia Remota 1 Instancia Local 2

Cliente1 Remoto

CONTEXTO Instancia Remota 2 Instancia Local 3 Instancia Remota 3

Cliente2 Remoto

Cliente3 Remoto

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

194

Los Session Bean se pueden clasificar en Session Bean Stateless y Session Bean Statefull. Los Stateless no garantizan el almacenamiento del estado, tal como se muestra en la siguiente figura:
1 Cliente accede varias veces a la misma instancia Cliente 1 Local EJBSession.var = 20 x = EJBSession.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.getVar()

Estado 3 Instancia Local 1 Int var = 0

Cliente 1 Local x = EJBSession.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. Este comportamiento se debe a que el EJB de Session es concretamente un EJB de Session stateless y no almacena el estado. Cuando se trata de Bean tipo statefull, el estado se almacena tal como muestra el diagrama siguiente:

1 Cliente accede varias veces a la misma instancia Cliente 1 Local EJBSession.var = 20 x = 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 = 20

Cliente 1 Local x = EJBSession.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, caso en el cual dichas modificaciones sern visibles en proximas consultas del EJB de Session statefull. En EJB3.0 no hay que crear descriptores de despliegue No hay que crear varios metodos callbacks que muchas veces no se usan. No hay que manejar multiples excepciones que ha veces son innecesarias. Se pude tener un EJB desde afuera del contenedor EJB Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Con EJB3.0 se trabaja programacin orientada a atributos.

195

14.2. BEAN TIPO MESSAGE CON JAVA


En este capitulo pretendemos crear un Bean tipo Message con Netbeans

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

196

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

197

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

198

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

199

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

200

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

201

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

202

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

203

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

Autor: Luis Felipe Wanumen Silva } Le modificamos la parte del return y nos queda algo similar al siguiente:

204

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package paquete1; import javax.ejb.Stateless; /** * * @author Luis Felipe Wanumen */ @Stateless public class NewSessionBean implements NewSessionRemote { public String getMessage() { return "Hola Bean de Mensajeria"; } // Add business logic below. (Right-click in editor and choose // "Insert Code > Add Business Method" or "Web Service > Add Operation") } NeBeans automticamente crea la interfaz del Bean remoto similar a la siguiente: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package paquete1; import javax.ejb.Remote; /** * * @author Luis Felipe Wanumen */ @Remote public interface NewSessionRemote { String getMessage(); } Despus podemos crear un Servlet

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

205

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

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

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

Autor: Luis Felipe Wanumen Silva

208

14.3. CREACION DE UN BEAN DE ENTIDAD CON NETBEANS Y ORACLE 10G EXPRESS


CREACION DE LA BASE DE DATOS

Vamos a la opcin SQL:

Enciclopedia Conociendo

Curso de Jsp y Servlets

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


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


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 continuacin se dice que se va a crear una nueva conexin:

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 identificacin del servicio es: XE

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

223

El nombre de usuario es: SYSTEM y el password es 123456 (en nuestro caso, obviamente esto depende de la instalacin).

Enciclopedia Conociendo

Curso de Jsp y Servlets

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, segn 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 incorporacin 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

Autor: Luis Felipe Wanumen Silva

228

Aparece un warning que indica que el proyecto no tiene una unidad de persistencia.

Aparece una lista de proveedores de persistencia que pueden permitir la conexin con la base de datos

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

Autor: Luis Felipe Wanumen Silva * and open the template in the editor. */ package paquete1; import java.io.Serializable; import java.math.BigDecimal; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table;

232

/** * * @author Luis Felipe Wanumen */ @Entity @Table(name = "USUARIO", catalog = "", schema = "SYSTEM") @NamedQueries({@NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"), @NamedQuery(name = "Usuario.findByCodigo", query = "SELECT u FROM Usuario u WHERE u.codigo = :codigo"), @NamedQuery(name = "Usuario.findByNombre", query = "SELECT u FROM Usuario u WHERE u.nombre = :nombre")}) public class Usuario implements Serializable { private static final long serialVersionUID = 1L; @Id @Basic(optional = false) @Column(name = "CODIGO", nullable = false, precision = 22, scale = 0) private BigDecimal codigo; @Column(name = "NOMBRE", length = 50) private String nombre; public Usuario() { } public Usuario(BigDecimal codigo) { this.codigo = codigo; } public BigDecimal getCodigo() { return codigo; } public void setCodigo(BigDecimal codigo) { this.codigo = codigo; } public String getNombre() { return nombre; }

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

233

public void setNombre(String nombre) { this.nombre = nombre; } @Override public int hashCode() { int hash = 0; hash += (codigo != null ? codigo.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Usuario)) { return false; } Usuario other = (Usuario) object; if ((this.codigo == null && other.codigo != null) || (this.codigo != null && ! this.codigo.equals(other.codigo))) { return false; } return true; } @Override public String toString() { return "paquete1.Usuario[codigo=" + codigo + "]"; } }

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

Autor: Luis Felipe Wanumen Silva

235

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

236

La configuracin del equipo Servidor en el que se mont el servicio web, es la sigueinte:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

237

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

238

15.3. INSTALACION DEL SOFTWARE EN EL LADO DEL SERVIDOR


Nos ubicamos dentro de una consola en la carpeta de instalacin del AXIS y dentro del directorio de publicacin, tal como se muestra a continuacin:

Ejecutamos la instruccin:

java org.apache.axis.transport.http.SimpleAxisServer p 8080

Enciclopedia Conociendo

Curso de Jsp y Servlets

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 algn servidor por el mismo puerto el anterior pantallazo no se presenta y en cambio se podra 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 continuacin:

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

En cuyo caso se podra 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 estndar como lo es el 8080.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

243

En el lado del servidor y despus 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 mquina, tal como se muestra a continuacin:

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

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

Tal como se muestra a continuacin:

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 continuacin:
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 administracin, la cual se muestra a continuacin:

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 enva por dicho puerto y cada vez que el servidor o un cliente hagan una transferencia de informacin por dicho puerto, saldr en la herramienta el contenido de lo que se enva y de lo que se recibe.

La herramienta tambin permite hacer una simulacin 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 simulacin.

Tambin 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, en el anterior caso lo hicimos con localhost, pero tambin lo pudimos haber hecho con felipe, tal como se muestra a continuacin:

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

Autor: Luis Felipe Wanumen Silva

258

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

259

Vemos que all se muestran problemas de configuracin que es necesario ajustarlos antes de continuar con el ejercicio, debido a que el servidor si no funciona correctamente, la aplicacin por tanto no se ver y se tuvieron que instalar otras versiones de AXIS, que fueran compatibles, tambin suceda esto porque haba un archivo de configuracin que estaba daado y cada vez que se instalaba el AXIS, se copiaba, pero en s el archivo estaba daado, dicho archivo conflictivo fue:

mail.jar
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

260

Despus de probar que ste era el archivo que estaba daado, proced a bajar de otro sitio el AXIS, y salo un pantallazo similar al siguiente:

El cual para ser didcticos se muestra a continuacin:

<wsdl:definitions targetNamespace="http://xml.apache.org/axis/wsdd/" xmlns:apachesoap="http://xml.apache.org/xml-soap"


Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

261

xmlns:impl="http://xml.apache.org/axis/wsdd/" xmlns:intf="http://xml.apache.org/axis/wsdd/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> Error!Referencia de hipervnculo no vlida. <!-WSDL created by Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT) --> Error!Referencia de hipervnculo no vlida. <wsdl:types> Error!Referencia de hipervnculo no vlida. <schema targetNamespace="http://xml.apache.org/axis/wsdd/" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="AdminService" type="xsd:anyType" /> <element name="AdminServiceReturn" type="xsd:anyType" /> </schema> </wsdl:types> Error!Referencia de hipervnculo no vlida. <wsdl:message name="AdminServiceRequest"> <wsdl:part element="impl:AdminService" name="part" /> </wsdl:message>

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

262

Error!Referencia de hipervnculo no vlida. <wsdl:message name="AdminServiceResponse"> <wsdl:part element="impl:AdminServiceReturn" name="AdminServiceReturn" /> </wsdl:message> Error!Referencia de hipervnculo no vlida. <wsdl:portType name="Admin"> Error!Referencia de hipervnculo no vlida. <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 hipervnculo no vlida. <wsdl:binding name="AdminServiceSoapBinding" type="impl:Admin"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> Error!Referencia de hipervnculo no vlida. <wsdl:operation name="AdminService"> <wsdlsoap:operation soapAction="" />

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

263

Error!Referencia de hipervnculo no vlida. <wsdl:input name="AdminServiceRequest"> <wsdlsoap:body use="literal" /> </wsdl:input> Error!Referencia de hipervnculo no vlida. <wsdl:output name="AdminServiceResponse"> <wsdlsoap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> Error!Referencia de hipervnculo no vlida. <wsdl:service name="AdminService"> Error!Referencia de hipervnculo no vlida. <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

264

15.6. MONTAJE DE UN EJERCICIO SENCILLO


El siguiente es el cdigo 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 extensin del archivo es jws.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

266

15.7. PROBANDO EL LADO DEL CLIENTE

Fisicamente el cliente se prob en una mquina conectada a "Felipe", la cual es una mquina con la siguiente configuracin de red:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

267

Dicha mquina se llama Esmeralda y antes de probar el aplicativo, primero se prob que tuviera conexin con el servidor, lo cual se hizo de la siguiente manera:

Una vez ya se sabe que se tiene conexin fisica, se procede a crear el archivo siguiente en un entorno de desarrollo:

import org.apache.axis.client.Call; import org.apache.axis.client.Service;


Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

268

import org.apache.axis.encoding.XMLType; import org.apache.axis.utils.Options; import javax.xml.rpc.ParameterMode;

public class HolaMundoClient { public static void main(String [] args) throws Exception {

Options options = new Options(args);

String endpoint = "http://felipe:" + options.getPort() + "/axis/HolaMundo.jws";

Service service = new Service(); Call call = (Call) service.createCall();

call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName( "hola" ); call.addParameter( "nombre", XMLType.XSD_STRING, ParameterMode.IN ); call.setReturnType( XMLType.XSD_STRING );

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

269

String ret = (String) call.invoke( new Object [] { "Pepe" }); System.out.println(ret); } }

Y antes de ejecutar el servidor, se verifica si el servidor de servicios osea el web service funciona correctmente, 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

Autor: Luis Felipe Wanumen Silva

270

En este caso usamos "realJ" para compilar el archivo:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

271

Y adicionalmente se hicieron las referencias respectivas para incluir los paquetes necesarios para que el servicio web funcionara:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

272

El resto de referencias, se muestran a continuacin:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

273

Y con el nimo de hacer la vida bastante fcil, se us "realJ" para la creacin de un archivo con extensin ".bat" que permitiera la ejecucin de dicho programa:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

274

Esta opcin solicita un nombre para un archivo bat, en este caso:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

275

El nombre del archivo bat, se llama:

"HolaMundoClient", el cual se muestra a continuacin:

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


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

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

278

Y para comprobar que la cuestin anda bien, tambin se ejecut desde la propia herramienta de desarrollo, en este caso desde "realJ", dando el resultado mostrado a continuacin:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

279

15.8. MANUAL DE INSTALACIN:

Copie los archivos:

HolaMundoClient.bat HolaMundoClient.class HolaMundoClient.java HolaMundoClient.jpr MyApp.java

En una carpeta denominada Cliente, tal como se muestra a continuacin:

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 ejecucin 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 continuacin:

Tambin se debe verificar que el cliente tenga una mquina 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 continuacin:

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. CARACTERSTICAS TCNICAS DONDE EJECUTO EL CLIENTE


El equipo cliente en el que se ha probado el servicio web, tiene la siguiente configuracin:

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 ms 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 grficamente 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 aplicacin que deseamos hacerles las pruebas unitarias

Los casos de prueba pueden agruparse segn su funcionalidad en suites de prueba (test suite), lo cual grficamente puede verse como se muestra a continuacin:

Suites de prueba segn funcionalidad 1

Suites de prueba segn funcionalidad 2

Suites de prueba segn 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

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 segn funcionalidad A

Suites de prueba segn funcionalidad B

Suites de prueba segn funcionalidad 1

Suites de prueba segn funcionalidad 2

Suites de prueba segn 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. Obviamente esto permite acelerar el proceso de testeo de aplicaciones, debido a que permite aplicar todo un subrbol o un rbol a un conjunto de clases.

16.2. CONSTRUCCION DE LA CLASE QUE VAMOS A PROBAR


Vamos a construir una clase denominada Lista que va a contener elementos de tipo Nodo, los cuales tienen la estructura determinada por la siguiente clase: Nodo.java public class Nodo{ Nodo siguiente; int valor; public Nodo(){ siguiente = null; } } // Cierra class Nodo Y ahora si la clase Lista propiamente dicha que contiene el siguiente cdigo: Lista.java import java.awt.*; import java.awt.event.*; Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

290

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

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

291

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

292

Realmente el objetivo de la creacin de la clase anterior es tener una clase que permita adicionar elementos a la lista, teniendo en cuenta que el comienzo de la lista esta referenciado por una variable llamada cabeza. La insercin de elementos en la lista se hace con el mtodo ingresarNodo(int). Dicho mtodo verifica que no existan elementos en la lista mediante la invocacin del mtodo boolean buscarNodo(int valor), el cual retorna true cuando existe en la lista un Nodo cuyo valor es igual al solicitado, el mtodo retorna false en caso que no exista coincidencia alguna. La lista permite el ingreso de elementos en forma ordenada y ascendente segn el valor contenido en la variable valor de cada Nodo. El amigo lector / estudiante se estar preguntando: Por qu incluir mas mtodos si solamente se va a probar el mtodo ingresarNodo(int)?. La respuesta es bien sencilla: Se requieren otros mtodos para que Junit logre probar correctamente el mtodo ingresarNodo(int) y tambin se requieren otros mtodos para que en si el mtodo funcione. Detalladamente podemos decir que el mtodo String getListado() se coloco como un ejercicio suelto porque ni es necesario para que funcione Junit, ni es necesario para que funcione la insercin. De otra parte el mtodo boolean buscarNodo(int valor) es necesario para que funcione el mtodo ingresarNodo(int). El constructor de la clase Lista es necesario simplemente para garantizar que cuando se cree una lista, es porque existe por lo menos un primer elemento cabeza que se debe almacenar en mencionada lista. Finalmente decimos que la clase Lista tiene un mtodo llamado boolean comparar(Lista objeto) y este mtodo es necesario para que funcione Junit, debido a que es con la invocacin de este mtodo que vamos a comparar dos listas, una que se construye manualmente y otra que se construye invocando el mtodo ingresarNodo(int) de la clase Lista. Esta ultima parte se explicara con detalle cuando se este explicando el testeo de la aplicacin.

16.3. CONSTRUCCION DE CASO DE PRUEBA PARA CLASE LISTA


Ha llegado el momento de crear nuestro caso de prueba para la clase que anteriormente denominbamos Lista, para ello comenzamos diciendo que debemos usar el paquete framework como se muestra a continuacin: import junit.framework.*; Tambin es importante mencionar que nuestra clase de prueba debe extender de la clase TestCase tal como se muestra a continuacin: public class ListaTest extends TestCase{ } Otra cuestin importante de mencionar es que el constructor de la clase ListaTest debe recibir un String como parmetro, tal como se muestra a continuacin: public ListaTest(String nombre){ super(nombre); } // Cierra constructor ListaTest()

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

293

Ahora creamos un mtodo llamado testIngresarNodo() con el que probaremos el mtodo ingresarNodo(int) de la clase Lista. Veamos entonces detenidamente como es que funciona el mtodo para el testeo. Creamos manualmente 5 nodos con el estereotipo static: final static Nodo nodo1Lista2 = new Nodo(); final static Nodo nodo2Lista2 = new Nodo(); final static Nodo nodo3Lista2 = new Nodo(); final static Nodo nodo4Lista2 = new Nodo(); final static Nodo nodo5Lista2 = new Nodo(); Les asignamos unos valores: nodo1Lista2.valor nodo2Lista2.valor nodo3Lista2.valor nodo4Lista2.valor nodo5Lista2.valor = = = = = 1; 5; 2; 3; 4;

Los ingresamos a la lista usando el metodo ingresarNodo(int): Lista listaPROBANO = new Lista(nodo1Lista2); listaPROBANO.ingresarNodo(nodo1Lista2.valor); listaPROBANO.ingresarNodo(nodo2Lista2.valor); listaPROBANO.ingresarNodo(nodo3Lista2.valor); listaPROBANO.ingresarNodo(nodo4Lista2.valor); listaPROBANO.ingresarNodo(nodo5Lista2.valor); Se supone que si el mtodo funciona como debe funcionar correctamente la lista tendra los siguientes nodos: 1 2 3 4 5 listaPROBANO

Recordemos que esto debera 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. Ahora bien, vamos a proceder a realizar una lista que con seguridad sabemos que forma tiene, debido a que se ha hecho en forma manual: Lista listaBIEN = new Lista(nodo1Lista1); 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(); Nodo(); Nodo(); Nodo(); Nodo();

Y la enlazamos manualmente tal como se muestra a continuacin: nodo1Lista1.siguiente = nodo2Lista1; nodo2Lista1.siguiente = nodo3Lista1; nodo3Lista1.siguiente = nodo4Lista1;

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva nodo4Lista1.siguiente = nodo5Lista1; Obviamente tenemos grficamente una lista similar a la siguiente: 1 2 3 4 5 listaBIEN

294

Las comparamos e informamos a Junit el resultado de dicha comparacin invocando el mtodo assertTrue(boolean x). Junit se encargara automticamente de verificar que el mtodo funcione como queremos que funcione. Observemos tambin que con esta forma de hacer pruebas uno puede definir manualmente los objetos que producen los mtodos que se van a probar y luego al ser comparados con los verdaderos objetos que retorna la ejecucin de estos mtodos podremos saber si realmente funcionan nuestros mtodos como lo esperbamos. Veamos pues el cdigo completo de nuestra clase de testeo: ListaTest.java import junit.framework.*; 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(); Nodo(); Nodo(); Nodo(); Nodo(); Nodo(); Nodo(); Nodo(); Nodo();

public void testIngresarNodos(){ nodo1Lista1.siguiente nodo2Lista1.siguiente nodo3Lista1.siguiente nodo4Lista1.siguiente nodo1Lista1.valor nodo2Lista1.valor nodo3Lista1.valor nodo4Lista1.valor nodo5Lista1.valor nodo1Lista2.valor nodo2Lista2.valor nodo3Lista2.valor nodo4Lista2.valor Enciclopedia Conociendo = = = = = = = = = 1; 2; 3; 4; 5; 1; 5; 2; 3; Curso de Jsp y Servlets = = = = nodo2Lista1; nodo3Lista1; nodo4Lista1; nodo5Lista1;

Autor: Luis Felipe Wanumen Silva nodo5Lista2.valor = 4; Lista listaBIEN = new Lista(nodo1Lista1); Lista listaPROBANO = new Lista(nodo1Lista2); listaPROBANO.ingresarNodo(nodo1Lista2.valor); listaPROBANO.ingresarNodo(nodo2Lista2.valor); listaPROBANO.ingresarNodo(nodo3Lista2.valor); listaPROBANO.ingresarNodo(nodo4Lista2.valor); listaPROBANO.ingresarNodo(nodo5Lista2.valor); assertTrue(listaBIEN.comparar(listaPROBANO)); } // Cierra void testIngresarNodos() public ListaTest(String nombre){ super(nombre); } // Cierra constructor ListaTest() } // Cierra class ListaTest

295

16.4. ELABORACION DEL PROGRAMA QUE EJECUTA LA PRUEBA


Ya hemos creado la clase que vamos a probar, tambin hemos creado la clase que hace la prueba y nos vamos a disponer a realizar un programa principal que dispare la ejecucin del framework junit, dicho programa es el siguiente: MyApp.java import java.awt.*; import java.awt.event.*; public class MyApp{ public static void main (String[] args) { String[] nombresTest = {ListaTest.class.getName()}; junit.swingui.TestRunner.main(nombresTest); } } // 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.

16.5. EJECUCION DEL TESTRUNNER


Al ejecutar el anterior programa tenemos un resultado similar al siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

Autor: Luis Felipe Wanumen Silva

297

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

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

298

Curso de Jsp y Servlets

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

299

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

300

Los otros errores que se muestran en la caja de abajo, se muestran a continuacin:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

301

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

302

17. INTRODUCCION A LAS APLICACIONES MOVILES


17.1. PINTAR MEDIA PANTALLA CON UN LIENZO
Importante decir que las aplicaciones principales que se pueden hacer en dispositivos ligeros se llaman MIDLET, y se podra decir que los MIDLETs son aplicaciones que corren en dichos dispositivos. Ahora bien, en un MIDLET se deben encontrar obligatoriamente los mtodos public void startApp() public void pauseApp() public void destroyApp(boolean unconditional) los cuales estn 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 bsico: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Celular1 extends MIDlet { public Celular1() { // constructor } public void startApp() { Canvas canvas = new MiTablero(); Display display = Display.getDisplay(this); display.setCurrent(canvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } class MiTablero extends Canvas { public void paint(Graphics g){ // Establece color a AZUL g.setColor(0, 0, 255); g.fillRect(0, 0, (int)(getWidth()/2), getHeight()); g.drawString("Pantallazo 1", 0, 0, g.TOP | g.LEFT); } } Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva }

303

En el cual la clase que extiende de MIDLET se llama Celular1 y contiene los tres mtodos que gestionan el estado del MIDLET, pero el nico mtodo de estos tres que tiene cdigo es el startApp() el cual coloca un lienzo e la pantalla del dispositivo ligero. La forma de colocar elementos en un dispositivo ligero esta dada por los siguientes pasos: Se obtiene una referencia al dispositivo de pantalla fsico. Se crean los objetos que se quieren colocar en la pantalla. Usando la referencia al dispositivo ligero se colocan los objetos previamente creados.

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 fsico. Se crean los objetos que se quieren colocar en la pantalla. Usando la referencia al dispositivo ligero se colocan los objetos previamente creados. CODIGO Canvas canvas = new MiTablero(); Display display Display.getDisplay(this); display.setCurrent(canvas); =

Hay que tener en cuenta que el MIDLET del que estamos hablando tambin define otro mtodo que se llama Celular1(), pero este mtodo no hace labor alguna, razn por la cual en este momento tan solo nos limitaremos a decir que es el mtodo constructor del MIDLET. Finalmente el MIDLET que estamos estudiando tiene una clase interna que tiene el siguiente cdigo: class MiTablero extends Canvas { public void paint(Graphics g){ // Establece color a AZUL g.setColor(0, 0, 255); g.fillRect(0, 0, (int)(getWidth()/2), getHeight()); g.drawString("Pantallazo 1", 0, 0, g.TOP | g.LEFT); } } Esta clase es similar a un applet y para los amigos familiarizados con Java, diremos que se comporta como un applet y por tanto tiene los mtodos normales de un applet. Es como hacer un applet y colocarlo como un lienzo en la pantalla del dispositivo ligero. Esto es una idea intuitiva que ayuda a comprender el funcionamiento de los lienzos en Java. En este caso este lienzo define el modo grafico en color azul, de tal forma que las siguientes cosas que pinte se pintaran de color azul, a continuacin se hace un rectngulo rellenado de color azul, 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 ejecucin del programa anterior produce unos resultados grficos 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?, la respuesta es: porque esta del mismo color del fondo, con lo cual se hace necesario hacer la modificacin que a continuacin se muestra: public void paint(Graphics g){ // Establece color a AZUL Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva g.setColor(0, 0, 255); g.fillRect(0, 0, (int)(getWidth()/2), getHeight()); g.setColor(0, 255, 255); g.drawString("Pantallazo 1", 0, 0, g.TOP | g.LEFT); } Con lo cual se tiene un resultado grafico similar al siguiente:

305

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

306

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

307

17.2. COLOCAR DOS LIENZOS


En forma anloga al ejercicio, solamente tendramos que hacer aadir 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.microedition.midlet.*; import javax.microedition.lcdui.*; public class Celular1 extends MIDlet { public Celular1() { // constructor } public void startApp() { Canvas pizarra1 = new Tablero1(); Canvas pizarra2 = new Tablero2(); Display display = Display.getDisplay(this); display.setCurrent(pizarra1); display.setCurrent(pizarra2); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } class Tablero1 extends Canvas{ public void paint(Graphics g){ // Establece color a AZUL g.setColor(0, 0, 255); g.fillRect(0, 0, (int)(getWidth()/2), getHeight()); // Establece color azul verdoso g.setColor(0, 255, 255); g.drawString("Pantallazo 1", 0, 0, g.TOP | g.LEFT); } // Cierra void paint() } // Cierra class Tablero1 class Tablero2 extends Canvas{ public void paint(Graphics g){ // Establece color a VERDE g.setColor(0, 255, 0); g.fillRect((int)(getWidth()/2), 0,getWidth() , getHeight()); // Establece color azul verdoso g.setColor(255, 0, 0);
g.drawString("Pantallazo 1", (int)(getWidth()/2), 0, g.TOP | g.LEFT);

} // Cierra void paint() } // Cierra class Tablero1 } // Cierra class Celular1

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva El cual grficamente puede ser visualizado de la siguiente manera:

308

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

309

17.3. PINTAR LA BANDERA DE COLOMBIA


Una de las figuras que ms fcil se pueden pintar en los dispositivos ligeros son las banderas que no tienen figuras raras, sino solamente rectngulos, es por esta razn, que a continuacin se muestra un programa que pinta la bandera de Colombia (el pas de donde es el autor del documento): import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Celular1 extends MIDlet { public Celular1() { // constructor } public void startApp() { Canvas pizarra1 = new Tablero1(); Canvas pizarra2 = new Tablero2(); Canvas pizarra3 = new Tablero3(); Display display = Display.getDisplay(this); display.setCurrent(pizarra1); display.setCurrent(pizarra2); display.setCurrent(pizarra3); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } class Tablero1 extends Canvas{ public void paint(Graphics g){ // Establece color a AMARILLO g.setColor(255,255,0); g.fillRect(0, 0, getWidth(), (int)(getHeight()/2)); } // Cierra void paint() } // Cierra class Tablero1 class Tablero2 extends Canvas{ public void paint(Graphics g){ // Establece color a AZUL g.setColor(0, 0, 255); g.fillRect(0, (int)(2*getHeight()/4),getWidth() , (int) (getHeight()/4)); } // Cierra void paint() } // Cierra class Tablero2 class Tablero3 extends Canvas{ public void paint(Graphics g){ // Establece color a ROJO g.setColor(255, 0, 0); g.fillRect(0, (int)(3*getHeight()/4),getWidth() , (int) (getHeight()/4)); } // Cierra void paint() Enciclopedia Conociendo Curso de Jsp y Servlets

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

Autor: Luis Felipe Wanumen Silva

312

17.4. COLOCAR UNA FORMA EN LA PANTALLA


En los dispositivos ligeros tambin se pueden colocar formas, que equivalen a las ventanas Windows (por hacer una comparacin). En esta ocasin vamos a colocar una forma al interior de una aplicacin J2ME. Veamos pues, detenidamente el siguiente cdigo: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Celular1 extends MIDlet{ Display display; Form forma; public Celular1() { // constructor forma = new Form("Primer forma"); } // Cierra public Celular1 public void startApp() { display = Display.getDisplay(this); display.setCurrent(forma); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } // Cierra class Celular1 La visualizacin de esta aplicacin en el emulador de Nokia produce un resultado similar al siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

313

De tal forma que cuando seleccionamos la aplicacin el dispositivo nos muestra la forma que hemos tal como se muestra a continuacin:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

314

Observe amigo lector / estudiante que si no hubiera sido por la instruccin siguiente: display.setCurrent(forma);

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

315

no se habra podido producir este efecto y tan solo se hubiera visto el nombre de la aplicacin, pero no se habra podido ver el efecto descrito en este ultimo pantallaza.

17.5. AADIR UN STRING A UNA FORMA


Continuando con el ejemplo anterior, podemos usar el cdigo del ejercicio anterior para aadir un StringItem a la forma creada en mencionado ejercicio. Con lo cual podemos obtener un cdigo fuente similar al siguiente: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Celular1 extends MIDlet{ Display display; Form forma; StringItem cadena1; public Celular1() { // constructor forma = new Form("Primer forma"); cadena1 = new StringItem("","Cad1"); forma.append(cadena1); } // Cierra public Celular1 public void startApp() { display = Display.getDisplay(this); display.setCurrent(forma); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } // Cierra class Celular1 Y grficamente los resultados se pueden observar a continuacin:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

316

Observe amigo lector / estudiante que el objeto StringItem no se puede modificar.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

317

17.6. UN PRIMER MENU CON EVENTOS


En esta seccin nos proponemos realizar un primer men, en el cual tengamos las opciones siguientes: UNO DOS TRES De tal manera que cuando el usuario seleccione la opcin UNO, se le asigne el valor 1 al StringItem que hemos definido en la seccion anterior. Para llevar a cabo esta tarea se deben adicionar a la forma tres elementos de tipo Command, tal como se muestra a continuacin: forma.addCommand(uno); forma.addCommand(dos); forma.addCommand(tres); en donde uno, dos y tres son comandos que fueron definidos tal como se muestra a continuacin: uno = new Command("UNO",Command.SCREEN,1); dos = new Command("DOS",Command.SCREEN,2); tres = new Command("TRES",Command.SCREEN,3); Es importante notar que hasta ahora se han definido las opciones del men, pero no se han asociado eventos a cada una de estas opciones. Para llevar a cabo la asociacin de eventos a los anteriores comandos, se ejecutan las siguientes instrucciones: forma.addCommand(uno); forma.addCommand(dos); forma.addCommand(tres); Con lo cual los comandos estn asociados a la forma, pero a parte de esta asociacin se hace necesario que la forma tenga un oyente que este pendiente cuando se active cualquier evento sobre la forma y evalu en el mtodo commandAction que tipo de evento de los anteriormente creados fue el que ocurri. Esto se hace con la instruccin: forma.setCommandListener(this); en donde el objeto que implementa el mtodo commandAction en este caso es el mismo MIDLET actual: public void commandAction(Command c,Displayable d){ y el mtodo commandAction tiene el siguiente cdigo fuente: public void commandAction(Command c,Displayable d){ if(c==uno){ cadena1.setText("1"); } if(c==dos){ Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva cadena1.setText("2"); } if(c==tres){ cadena1.setText("3"); } } // Cierra void commandAction()

318

Ahora bien, con el nimo de ser lo ms didcticos posibles, a continuacin se muestra el MIDLET que contiene el cdigo completo del ejercicio que nos proponemos en esta seccin: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Celular1 extends MIDlet implements CommandListener{ Display display; Form forma; StringItem cadena1; Command uno; Command dos; Command tres; // javax.microedition.lcdui.Command // javax.microedition.lcdui.Displayable public void commandAction(Command c,Displayable d){ if(c==uno){ cadena1.setText("1"); } if(c==dos){ cadena1.setText("2"); } if(c==tres){ cadena1.setText("3"); } } // Cierra void commandAction() public Celular1() { // constructor forma = new Form("Primer forma"); cadena1 = new StringItem("","Soy un ITEM"); uno = new Command("UNO",Command.SCREEN,1); dos = new Command("DOS",Command.SCREEN,2); tres = new Command("TRES",Command.SCREEN,3); forma.addCommand(uno); forma.addCommand(dos); forma.addCommand(tres); forma.setCommandListener(this); forma.append(cadena1); } // Cierra public Celular1 public void startApp() { display = Display.getDisplay(this); display.setCurrent(forma); } Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

319

public void pauseApp() { } public void destroyApp(boolean unconditional) { } } // Cierra class Celular1 La ejecucin 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 botn 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 botn 1 para ejecutar la instruccin: cadena1.setText("1"); Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

322

y en forma anloga si se presiona el botn 2 se ejecuta la instruccin: cadena1.setText("2"); y finalmente si se presiona el botn 3 se ejecuta la instruccin: cadena1.setText("3"); Para este caso, hemos presionado el botn 2, con lo cual obtenemos el resultado:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

323

Es bueno tener en cuenta que esto se puede tambin hacer presionando el botn del centro llamado select cuando la opcin del men correspondiente esta seleccionada, es decir para este caso cuando este seleccionada la opcin 2:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

324

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

325

18. EJEMPLO DE SERVICIO WEB MOVIL


Para crear una aplicacin mvil podemos descargar un emulador de aplicaciones mviles que nos permita compilar las aplicaciones que hagamos y visualiar sus resultados desde el computador.

18.1. CONECTARSE A UN SERVIDOR WEB DESDE UN MOVIL


La siguiente aplicacin nos permite conectarse con un servlet y trae los resultados del servlet al telfono mvil. Veamos:
import import import import javax.microedition.midlet.*; javax.microedition.lcdui.*; javax.microedition.io.*; java.io.*;

public class Tecno extends MIDlet implements CommandListener{ private TextField caja1; private TextField caja2; private Form formulario; private Command comandoBuscar = new Command("Busca", Command.OK, 1); private String direccion = "http://localhost:1900/examples/servlet/MyApp?codigo="; public class Hilo extends Thread{ public void run(){ try{ StringBuffer objetoBuffer = new StringBuffer(); InputStream objetoEntrada = null; HttpConnection objetoConector = null; String codi; codi = caja1.getString(); objetoConector = (HttpConnection)Connector.open(direccion+codi); objetoEntrada = objetoConector.openInputStream(); int caracter=0; while((caracter= objetoEntrada.read())!=-1){ objetoBuffer.append((char)caracter); } caja2.setString(objetoBuffer.toString());

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

326

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

327

19. EJEMPLO DE SERVICIO WEB MOVIL


En el siguiente ejercicio se darn los pautas necesarias para crear paso por paso un servicio web mvil.

19.1. CREACION DE LA APLICACIN MOVIL

Primero consiga el emulador mostrado en la siguiente figura:

Despus cree un archivo con el nombre dos.java, el cual contenga el siguiente cdigo: import javax.microedition.lcdui.*; import javax.microedition.midlet.MIDlet; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Form; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.io.*; import javax.microedition.io.*;

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

328

import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import org.ksoap.*; import org.ksoap.transport.HttpTransport; import org.kxml.*; import org.kxml.parser.*;

public class dos extends MIDlet implements CommandListener { Form mainForm; private Alert response; static final String serviceNamespace = "http://localhost:8080/axis/servicio.jws:http://DefaultNamespace:http://localhost:8080/ axis/servicio.jws"; static final String serviceUrl = "http://localhost:8080/axis/servicio.jws?wsdl"; static final String methodName = "saludar"; private Display display; static final String soapAction = " "; // Display display; static final String entrada = "saludarRequest"; // private SoapObject request; private ClassMap classMap; private HttpTransport transport; private SoapObject request; // private ClassMap classMap; Hilo objeto = new Hilo(); public class Hilo extends Thread{ public Hilo(){ } public void run(){ response = new Alert( "Weather Status", null, null, AlertType.INFO); response.setTimeout( Alert.FOREVER );

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

329

transport = new HttpTransport(serviceUrl, soapAction + "#" + methodName ); transport.debug = true; classMap = new ClassMap(); classMap.prefixMap = new PrefixMap( classMap.prefixMap, entrada, serviceNamespace ); transport.setClassMap( classMap ); request = new SoapObject( serviceNamespace, methodName ); request.addProperty( "nombrecin", "LUCHIN" ); try{ Object result = transport.call( request ); String resultado = (String)result; response.setString( resultado ); display.setCurrent( response ); } catch(Exception e){ }

} } public dos() { mainForm = new Form("Text Field"); display = Display.getDisplay( this ); try{ objeto.start(); } catch(Exception e){ } } protected void startApp() { display.setCurrent(mainForm); } public void commandAction(Command c, Displayable s) { }
Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

330

protected void destroyApp(boolean unconditional) { } protected void pauseApp() { } }

19.2. MONTAJE EN EL SERVIDOR DE SERVICIOS WEB

Despues dentro de la carpeta AXIS del servidor de servicios web cree un archivo llamado servicio.jws que contenga el siguiente cdigo: public class servicio{ public String saludar(String nombrecin){ String interno; interno = "Buenas noches "+nombrecin; return interno; } } Es bueno observar que si se entra a la siguiente direccin en el navegador, http://localhost:8080/axis/servicio.jws se tiene siguiente resultado:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

331

Y si se hace click en el enlace para ver el WSDL obtenemos:


<?xml version="1.0" encoding="UTF-8" ?> - <wsdl:definitions targetNamespace="http://localhost:8080/axis/servicio.jws" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/axis/servicio.jws" xmlns:intf="http://localhost:8080/axis/servicio.jws" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <!-WSDL created by Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT) --> - <wsdl:message name="saludarResponse"> <wsdl:part name="saludarReturn" type="xsd:string" /> </wsdl:message> - <wsdl:message name="saludarRequest"> <wsdl:part name="nombrecin" type="xsd:string" /> </wsdl:message> - <wsdl:portType name="servicio"> - <wsdl:operation name="saludar" parameterOrder="nombrecin"> <wsdl:input message="impl:saludarRequest" name="saludarRequest" /> <wsdl:output message="impl:saludarResponse" name="saludarResponse" /> </wsdl:operation> </wsdl:portType> - <wsdl:binding name="servicioSoapBinding" type="impl:servicio"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> - <wsdl:operation name="saludar"> Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

332

<wsdlsoap:operation soapAction="" /> - <wsdl:input name="saludarRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded" /> </wsdl:input> - <wsdl:output name="saludarResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/servicio.jws" use="encoded" /> </wsdl:output> </wsdl:operation> </wsdl:binding> - <wsdl:service name="servicioService"> - <wsdl:port binding="impl:servicioSoapBinding" name="servicio"> <wsdlsoap:address location="http://localhost:8080/axis/servicio.jws" /> </wsdl:port> </wsdl:service> </wsdl:definitions>

Que no es mas que el archivo WSDL que describe el servicio web.

19.3. EJECUCION DEL SERVICIO


Al ejecutar el servicio obtenemos una pantalla similar a la siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

333

Y el cargar el aplicativo obtenemos:

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, con lo cual obtenemos lo siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

335

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

336

20. TECNOLOGIA BLUETOOTH

20.1. MOSTRANDO ESTADO DE UN DISPOSITIVO BLUETOOTH


A continuacin se muestra el cdigo 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 enva el primer cliente que se conecta. Veamos pues todo el cdigo fuente: Bluetooth1.java
import import import import import import javax.microedition.lcdui.Display; javax.microedition.lcdui.Form; javax.microedition.lcdui.TextField; javax.microedition.midlet.MIDlet; javax.bluetooth.LocalDevice; javax.bluetooth.DiscoveryAgent;

import javax.bluetooth.UUID; import javax.microedition.io.StreamConnectionNotifier; import javax.microedition.io.Connector; import javax.microedition.io.StreamConnection; import java.io.IOException; import java.io.OutputStream; import java.io.DataOutputStream; public class Bluetooth1 extends MIDlet{ public static Display objetoDisplay; public static Form objetoForma; private LocalDevice localDevice; private TextField caja1; private TextField caja2; private TextField caja3; private TextField caja4; private TextField caja5; private TextField caja6; Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

337

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

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

338

} // Cierra try externo catch(Exception e){ Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva caja6.setString("Algo pasa"); } } // Cierra void startApp public class Hilo extends Thread{ public void run(){ while(true){ try{ caja6.setString("Esperando cliente"); coneccion = notificador.acceptAndOpen(); caja6.setString("Llego un cliente"); // Cuando llega el cliente le // enviamos un saludo out = coneccion.openOutputStream(); DataOutputStream salida = new DataOutputStream(out); salida.writeUTF("Buenas"); salida.flush(); } // Cierra try externo catch(IOException e){ caja6.setString("No llega cliente alguno"); } // Cierra catch interno } // Cierra while } // Cierra run() } // Cierra class Hilo }

339

El siguiente es un ejemplo sencillo de comunicacin entre celulares usando la tecnologa bluetooth, en nuestro ejercicio veremos que lo mas sencillo es la implementacin del Servidor Bluetooth debido a que el servidor atiene a clientes y no tiene que buscar servicios en los clientes, en cambio el cliente tiene que buscar dispositivos servidores e intentar conectarse con los servicios que estan en dichos dispositivos.

20.2. CREACION DEL SERVIDOR BLUETOOTH


El proceso de inicio del servidor bluetooth debe hacerse en un hilo aparte del MIDlet. El servidor lo que debe hacer es buscar su propio dispositivo bluetooth y si lo puede encontrar muestra un letrero: LocalDevice localDevice = LocalDevice.getLocalDevice(); if(!localDevice.setDiscoverable(DiscoveryAgent.GIAC)) { Display.getDisplay(this).setCurrent(new Alert("Existe servicio B")); } Se crea un buffer que tiene la direccin del dispositivo bluetooth conformada por el protocolo btspp, un identificador del servicio, un identificador del servicio: Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

340

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

Enciclopedia Conociendo

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

341

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva System.out.println(s); } catch(IOException e) { e.printStackTrace(); } finally { try { if(in != null) in.close(); if(out != null) out.close(); if(connection != null) connection.close(); } catch(IOException e) { } }// Cierra finally } // Cierra while } catch(IOException e) { e.printStackTrace(); Display.getDisplay(this).setCurrent(new Alert("Error: "+e)); } // Cierra catch } // Cierra run } // Cierra class ServidorB

342

20.3. CREACION DEL CLIENTE BLUETOOTH


En la anterior seccion se ha creado un servidor Bluetooth, en esta seccion se creara un cliente Bluetooth que se comunique con dicho servidor. El cliente inicia en forma similar al servidor buscando su propio dispositivo bluetooth: localDevice = LocalDevice.getLocalDevice(); localDevice.setDiscoverable(DiscoveryAgent.GIAC); discoveryAgent = localDevice.getDiscoveryAgent(); 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 invocacin del metodo startInquiry() discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this); Con la ejecucion de la anterior instruccion automticamente 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

Autor: Luis Felipe Wanumen Silva

343

de los anteriores metodos un programador le puede colocar codigo que quiera a cada uno de ellos, sin embargo para que tenga sentido una aplicacin bluetooth es bueno colocar codigo en el metodo deviceDiscovered el cua se invoca cuando un dispositivo bluetooth es encontrado, en nuestro caso colocamos codigo en dicho metodo que se encargue de obtener la direccion remota de dicho dispositivo: String address = remoteDevice.getBluetoothAddress(); String friendlyName = null; try { friendlyName = remoteDevice.getFriendlyName(true); } catch(IOException e) { } y luego de invocar el metodo searchServices aplicado sobre el agente de descubrimiento discoveryAgent, de tal forma que automticamente 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.searchServices(ATRIBUTOS,SERVICIOS, remoteDevice, this); System.out.println("Comenzada busqueda de serivicios en: "+device+"; "+transId); busquedas.addElement(new Integer(transId)); El otro metodo que vamos a desarrollar es el metodo servicesDiscovered que es invocado automticamente por bluetooth cuando se encuentran servicios, obviamente debido a que en algun momento se invoco el metodo searchServices sobre un agente para lograr que este automticamente ejecute el metodo servicesDiscovered. 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 manipulacin 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. Nuestro metodo servicesDiscovered tiene el siguiente codigo: public void servicesDiscovered(int transID,ServiceRecord[] servRecord) { ServiceRecord service = null; for(int i=0; i<servRecord.length; i++){ service = servRecord[i]; String url = service.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); StreamConnection connection = null; DataInputStream in = null; DataOutputStream out = null; Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva try { connection =(StreamConnection) Connector.open(url); in = connection.openDataInputStream(); out = connection.openDataOutputStream(); out.writeUTF("saludos desde el cliente!"); out.flush(); String s = in.readUTF(); texto.setString(s); Display.getDisplay(this).setCurrent(texto); } catch(IOException e) { e.printStackTrace(); } finally { try { if(in != null) in.close(); if(out != null) out.close(); if(connection != null) connection.close(); } 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, int respCode) { } // Cierra void serviceSearchCompleted public void inquiryCompleted(int discType) { } // Cierra inquiryCompleted Para no ir tan lejos, a continuacin se muestra el codigo completo de nuestro ciente Bluetooth:

344

import javax.microedition.midlet.MIDlet; import javax.microedition.lcdui.*; import javax.bluetooth.*; import java.io.*; import java.util.*; import javax.microedition.io.*; public class ClienteB extends MIDlet implements CommandListener, DiscoveryListener { public static final UUID SERVICIO_CHAT = new UUID(0x2343); public static final UUID[] SERVICIOS = new UUID[]{ SERVICIO_CHAT }; public static final int[] ATRIBUTOS = null; Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva private private private private private private Command comenzar; TextBox texto; Form principal; Form busqueda; Vector busquedas; DiscoveryAgent discoveryAgent;

345

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

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

346

Curso de Jsp y Servlets

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

347

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

348

21. SEGURIDAD EN JAVA


21.1. 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. Con este ejercicio se intentara mostrar que Java es tan flexible que cuando este tipo de funcionalidades de acceder a un archivo se deseen, se pueden usar algunos mecanismos para lograr que dicho applet quede firmado, despus de lo cual el navegador enviara un mensaje de confirmacin, de tal suerte que si el cliente acepta dicho mensaje se ejecutaran las operaciones en el applet que normalmente no se podan hacer. A continuacin vamos a mostrar un programa tipo Applet que intenta mostrar el contenido de un archivo llamado a.txt: MyApp.java import java.awt.*; import java.applet.*; import java.io.*; public class MyApp extends Applet { TextArea ta = new TextArea(); FileReader archi; public void init(){ add(ta); try{ String leido = ""; BufferedReader bufer; archi = new FileReader(new String("a.txt")); bufer = new BufferedReader(archi); String res = ""; while((res=bufer.readLine())!=null){ leido=leido+res+"\n"; } ta.setText(leido); } catch(Exception e){ ta.setText(e.toString()); } } }

Enciclopedia Conociendo

Curso de Jsp y Servlets

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 ejecucin 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, la forma es generar un certificado para el applet y por ultimo firmar el applet. Para generar el certificado usamos la instruccin: C:\Progra~1\Java\jdk1.6.0\bin\keytool -genkey -alias aliacin -validity 120 v En donde aliacin es el nombre del alias del certificado y 120 significa el numero de dias que sera valido dicho certificado. Nos pregunta la contrasea del almacen de claves:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

350

En este caso colocamos la palabra clave, con lo cual observamos que se produce el siguiente error:

Dado que la contrasea es demasiado corta. Esto simplemente se mostro con el fin de ir comprobando que realmente la clave no puede ser tan corta. Vamos pues a colocar la clave 123456:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

351

Vemos pues que se nos solicita volver a digitar la clave, procedemos pues a volverla a digitar. A continuacin nos pregunta nuestro nombre y nuestro apellido colocaremos pues Luis Wanumen tal como se muestra a continuacin:

Seguidamente colocaremos el nombre de nuestra unidad de organizacin, en este caso colocaremos la palabra Universidad tal como se muestra en el siguiente grafico:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

352

En el nombre de la organizacin 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

Autor: Luis Felipe Wanumen Silva

353

A la pregunta estado o provincia, 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 informacin se nos solicita confirmar todos estos datos, esta parte es importante pues nos sirve para hacer una ultima verificacin de la informacin que usamos en la creacin del certificado. Observemos por simple curiosidad que pasaria si le colocasemos la palabra yes:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

354

Vemos que vuelve a solicitar los datos, esto sucede porque la configuracin de la maquina virtual esta en espaol con lo cual debemos contestar en espaol tal como se muestra a continuacin:

En este punto es importante notar que el par de claves se generan usando el algoritmo DSA de 1.024 bits. Se solicita entonces la contrasea clave para aliacin, 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, tal como corrobora el pantallaza siguiente:

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

355

Ahora llego el momento de asociar el applet con el certificado que acabamos de expedir. A este proceso se le conoce con el nombre de firmar el applet, pero hacer que dicha firma quede asociada al mencionado certificado se logra si se conoce la contrasea del almacen de claves. El proceso de firmado del applet comienza con el siguiente comando: C:\Progra~1\Java\jdk1.6.0\bin\jarsigner MyApp.jar aliacin verbose En donde nos solicita la clave del almacen de claves identificado con el alias aliacin, tal como se muestra a continuacin:

En nuestro caso colocamos la clave 23456

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Y a pesar de haberle colocado bien la clave, nos genera el siguiente error:

356

El error se presente debido a que se tiene que modificar el archivo MyApp.jar y esta siendo usado por el navegador. Incluso para garantizar que funcione a veces se hace necesario cerrar el navegador para que no exista aplicacin alguna que este asociada al 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, se puede ejecutar desde el navegador, tal como se muestra en la siguiente figura: Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

357

Vemos pues que al momento de cargar el applet aparece un aviso de advertencia que se puede ver en mas detalle como se muestra a continuacin:

Servidor InputStream entrada ObjectInputStream carritoEntrada carritoEntrada. readUTF

Cliente OutputStream salida ObjectOutputStream carritoSalida carritoSalida. writeUTF

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

358

Esto demuestra que la firma digital ha sido creada, pero lo que aparece no es un error, 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 ejecucin de la accion de ver el contenido de un archivo. En este momento y antes de continuar vamos a crear un archivo llamado a.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 Esto se logra sealando en la opcion mencionada tal como muestra la figura anterior. De otra parte ahora hacemos clic sobre el boton con el rotulo Ejecutar. En este momento el navegador puede demorarse un poco debido a que esta validando las acciones que realiza el applet.

359

Ahora bien, a continuacin se muestra el resultado de la ejecucin del applet.

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

360

Bueno, realmente la primera vez que se ejecuto esto no funciono y lo que pasaba era que tocaba pasar los archivos .class a otra carpeta para que el navegador no los tomara y asegurarnos que tomar nicamente el jar que haba sido firmado. La verdad esto no tiene mucha lgica 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

Autor: Luis Felipe Wanumen Silva

361

22. PROGRAMACION CON GOOGLE


22.1. DEFINICION DE APIS DE GOOGLE:
Las apis de google son mtodos que ofrece google para que los desarrolladores de aplicaciones puedan invocarlos desde sus propias aplicaciones.

22.2. REQUERIMIENTOS
Un entorno de desarrollo que soporte servicios web Kit para desarrolladores que proporciona google. Una clave para las APIs de google.

22.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.4. OBTENER LA CLAVE DEL API DE GOOGLE MAPS


La clave del API de Google Maps se puede obtener en http://code.google.com/intl/es-CO/apis/maps/signup.html Cuando se entra al sitio anterior, se solicita una direccion URL, en este caso se aconseja digitar http://localhost Enciclopedia Conociendo Curso de Jsp y Servlets

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.5. 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, una de ellas es: http://www.geonames.org Para el caso especifico de la ciudad de Bogot la capital de Colombia tenemos los siguientes datos: Descripcin: capital of a political entity population 7,102,602 Latitud: N 4 36' 0'' Longitud: W 74 5' 0''

22.6. ALGUNAS COSAS CURIOSAS DE GOOGLE


Algunos dicen que google esta desarrollando sistemas operativos como: Goobuntu Google Media Server para dispositivos de salon. Google Phone es Android Open Handset Alliance Investigar si esto es verdad

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

363

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

364

23. INVESTIGACIONES PROPUESTAS PARA LOS ESTUDIANTES DE JAVA AVANZADO

23.1. PROPUESTA DE PARCIAL PRIMERO

EL PARCIAL ES UN SOFTWARE DOCUMENTADO, PERO EN REALIDAD ESTO ES UN REQUISITO PARA ENTRAR AL PARCIAL, YA QUE EL PROGRAMA ES SIMPLEMENTE ESO, UN PROGRAMA. El parcial es la sustentacin del programa. DESCRIPCION DEL PROGRAMA El programa debe manejar un servidor que sea capaz de pedir solicitudes de varios clientes, 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. El servidor valida al usuario basado en el nombre de usuario que halla llegado. Si dos usuarios tienen el mismo nombre, el servidor no admite en el foro al segundo cliente que tenga un nombre repetido. Un usuario puede cambiar su nombre de usuario y este cambio debe reflejarse en cada uno de los demas clientes. El motor de BD cualquiera. Interfaz com Swing, Awt, Web o como quiera La condicion Lenguaje JAVA. Puede funcionar en Windows o en Linux. Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Sustentacin en grupos, pero nota individual. Grupos MAXIMO 3 Fecha 12 de marzo. Celular 315 832 72 69

365

23.2. UNA PRIMERA PROPUESTA


Este lunes en Ocho 28 Mayo LUNES Por correo luchofelipe2000@yahoo.com

Minimo Hojas(200) Maximo Hojas (Todas las que quiera) 15 Dias

Documento Investigativo (Entregar Digitalizado)

ANDREA SANCHEZ, 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

366

Desventajas de hacer una web semantica con Protege. Ejemplos buenos bajados de Internet. Documentos de Soporte. Aportes

CAMILO ANDRES CHAVEZ LAURA VELASCO Y ANGELA VARGAS Que se esta haciendo actualmente para ponerle seguridad a los servicios Web.

ANDREA CASTRO ANDRIANA VALDERRAMA Y JORGE VASQUEZ Orquestacion de servicios web

NIDIA TORRES XENIA CASTILLO JOSE VICENTE ARANGO Grilla Computacional

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

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.3. PROPUESTAS PARA EL SEMESTRE 2007 III


Existen algunas propuestas que estoy pensando como son: Manejar Protege para comprender como crear ontologas con protege. Una vez creada la ontologa, 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. Obviamente esto se debe hacer si se tiene un modelo definido sobre un problema que se quiera trabajar y modelado correctamente con UML. Hacer aplicaciones inalmbricas, mviles preferiblemente con Java, pero los que quieran que lo hagan con .NET.

23.4. PROPUESTAS PARA EL SEMESTRE 2008 I


Existen algunas propuestas que estoy pensando como son: Hacer una aplicacin cliente que envie y visualice los correos de un servidor de correo. Hacer una aplicacin cliente que envie y muestre los archivos de un servidor Ftp. Hacer un chat entre dos celulares. Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

369

Hacer un chat con tecnologa RMI que tenga en cuenta los mensajes perdidos cuando cualquier cliente se desconecte. OTRAS PROPUESTAS. Hacer programas que creen archivos XML usando DOM, permitiendo anadir, buscar y ordenar elementos del archivo XML. Hacer programas que creen archivos XML usando SAX, permitiendo anadir, buscar y ordenar elementos del archivo XML. Hacer programas que creen archivos XML usando JDOM, permitiendo anadir, buscar y ordenar elementos del archivo XML.

23.5. PROPUESTAS PARA EL PRIMER SEMESTRE 2010 I


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

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

Enciclopedia Conociendo

Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

371

24. BIBLIOGRAFA E INFOGRAFA


24.1. BIBLIOGRAFIA FACIL DE CONSEGUIR EN COLOMBIA SOBRE JAVA
J2ME Java 2 Micro Edition Agustin Froufe Quintas Alfa Omega Rama Hackers. Secretos y soluciones para la seguridad de Redes Stuart McClure Joel Scambray George Kurtz Mc Graw Hill 19 Puntos criticos sobre seguridad de software. Fallas mas comunes en programacion como corregirlas Michael Howard, 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. Manual de Usuario y tutorial Agustin Froufe Quintas AlfaOmega @RA-MA. Tercera Edicion. 2003 Manual de Referencia JSP Mc Graw-Hill Osborne Media Phil Hanna. XML Al descubierto Vision Experta Potente Software Prentice Hall Michael Morrison et al. Java 2 Caracteristicas Avanzadas Abarca J2SE versiones. Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva Sun Microsystem Cay s. Hortstmann / Gary Cornell Prentice Hall Seguridad en Java Edicion Especial Jamie Jaworski Paul J.Perrone. Prentice Hall. Como programar en Java Deitel y Deitel Prentice Hall JavaServer Pages Manual de Usuario y Tutorial Agustin Froufe AlfaOmega @RA-MA. 2002 Desarrollo de Juegos con J2ME AlfaOmega @RA-MA. Manuel J. Prieto. Manual de Usuario. J2EE Keogh Mc Graw Hill

372

24.2. REFERENCIAS DE JAVA


En esta seccin se incluyen referencias de utilidad sobre el lenguaje de programacin Java.
1. "Java 1.2 and JavaScript for C and C++ Programmers" , Michael C. Daconta, Al Saganich, Eric Monk, Martin Snyder, Wiley, 1998. Este libro est dirigido a programadores que conocen C y C++ y desean utilizar Java rpidamente, basando la presentacin de Java en conociemientos de C. Buena referencia para CORBA, RMI, java.net y JDBC "Core Java 1.1" , Cay S. Horstmann y Gary Cornell (book/CD-ROM), Java series, Sun Microsystems Press, Prentice-Hall, 1998. Los primeros captulos constituyen una buena introduccin a Java. Muy recomendables son los captulos de Hilos de Control, Streams y Networking "Java in a Nutshell: A Desktop Quick Reference for Java Programmers" , David Flanagan, O'Reilly, 2a. Edicin, 1997. Referencia muy completa y breve de Java 1.1 "Java Threads" , Scott Oaks, Henry Wong, O'Reilly, 1997. Referencia detallada de hilos de control en Java "Database Programming with JDBC and Java" , George Reese, O'Reilly, 1997. Referencia detallada sobre el uso de Java para accesar Bases de Datos Relacionales, cubre SQL, JDBC y RMI Curso de Jsp y Servlets

2.

3. 4. 5.

Enciclopedia Conociendo

Autor: Luis Felipe Wanumen Silva 6.

373

"Java Network Programming" , Elliotte Rusty Harold, O'Reilly, 1997. Referencia detallada sobre programacin en redes, muy recomendables los captulos de Sockets, URLs y Manejadores de Contenido

24.3. REFERENCIAS DE JAVA-CORBA-RMI


1. 2. 3. "Java Programming with Corba" , Andreas Vogel y Keith Duddy, Wiley, 2nd edition, 1998. Una gua completa para elaborar aplicaciones en Java usando CORBA. "Client-Server programming with Java and Corba" , Robert Orfali, Dan Harkey, Jeri Edwards, Wiley, 1998. Discute cmo implementar sistemas cliente-servidor combinando Java y CORBA Plasil,F., Stal,M., "An architectural view of distributed objects and components in CORBA, Java RMI and COM/DCOM" , Software Concepts & Tools (vol. 19, no. 1), Springer 1998. Se comparan sistemas de objetos distribuidos CORBA, RMI y Microsoft COM/DCOM Jim Waldo, "Remote procedure calls and Java Remote method invocation" IEEE Concurrency, julio-septiembre 1998, 5-7. Compara sistemas de objetos distribuidos tipo CORBA con RMI "Corba: fundamentals and programming" , Jon Siegel, Wiley,1996. Discute mtodos de anlisis y diseo, compara implementaciones disponibles y contiene ejemplos detallados "Java RMI" , Troy Bryan Downing, IDG Books, 1998. Explora la arquitectura, especificacin y uso del modlo RMI/OS. Contiene ejemplos de aplicaciones distribuidas

4. 5. 6.

Enciclopedia Conociendo

Curso de Jsp y Servlets

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

Autor: Luis Felipe Wanumen Silva

376

TABLA DE CONTENIDO
1. CONCEPTOS BASICOS DE SERVLETS............................................................................................2 1.1. LOS COMPONENTES NECESARIOS..........................................................................................2 2. SERVLETS SENCILLOS CON CONEXIN A BASES DE DATOS.................................................3 2.1. SERVLET QUE MUESTRA DATOS DE UNA TABLA..............................................................3 2.2. SERVLET QUE INSERTA DATOS EN BASE DE DATOS........................................................5 2.3. PAGINACION CON SERVLETS................................................................................................12 2.4. BUSCAR UN REGISTRO EN SQL SERVER 2000 Y USANDO SERVLETS..........................20 2.5. PAGINACION CON SIGUIENTE Y ANTERIOR......................................................................26 2.6. SELECCIN DE DATOS DE ORACLE 10G..............................................................................33 3. CONCEPTOS BASICOS DE JSP........................................................................................................37 3.1. CICLO DE VIDA DE PAGINA JSP.............................................................................................37 3.2. ES POSIBLE QUE PAGINAS JSP CONTENGAN CODIGO NO JSP.......................................37 3.3. COMENTARIOS EN PAGINAS JSP...........................................................................................38 3.4. DECLARANDO VARIABLES EN JSP Y USO DE EXPRESIONES........................................38 3.5. UNA FORMA DE IMPRIMIR ELEMENTOS EN JSP...............................................................39 3.6. LA DIRECTIVA INCLUDE.........................................................................................................41 3.7. CUIDADOS CON LA DIRECTIVA INCLUDE..........................................................................42 3.8. LA DIRECTIVA PAGE IMPORT................................................................................................45 3.9. UN TIP SOBRE LAS IMPORTACIONES...................................................................................47 3.10. UN TIP SOBRE LAS DECLARACIONES................................................................................48 4. PAGINACIN DE RESULTADOS CON JSP....................................................................................50 4.1. RECONOCER QUE PARAMETRO SE ENVIA EN PAGINAS RECURSIVAS.......................50 4.2. RECONOCER CUANTAS PAGINAS SON NECESARIAS .....................................................52 4.3. IMPRIMIR LOS HIPERENLACES NECESARIOS DE ACUERDO CON EL NUMERO DE PAGINAS DE USUARIO....................................................................................................................53 4.4. COLOCAR HIPERENLACE ANTERIOR...................................................................................54 4.5. COLOCAR HIPERENLACE SIGUIENTE..................................................................................56 4.6. DEPENDIENDO LA PAGINA ACTUAL, SE DEBE CALCULAR EL RANGO DE REGISTROS A MOSTRAR................................................................................................................58 4.7. CORREGIR EL NUMERO DE REGISTROS QUE APARECEN EN LA ULTIMA PAGINA. 63 4.8. ARMAR LA CADENA DE CONSULTA Y ENSAMBLAR LA APLICACION.......................66 4.9. HACER QUE EL NUMERO DE REGISTROS SEA DINAMICO.............................................67 5. ETIQUETAS JSP.................................................................................................................................71 5.1. PRIMER EJERCICIO DE ETIQUETAS JSP...............................................................................71 5.2. ERROR COMN CON EL USO DE TAGS................................................................................73 5.3. UN TAG QUE CONSULTA DATOS...........................................................................................75 6. FORMA DE HACER TAGS CON NETBEANS 6.5.1........................................................................81 6.1. CREAR LA LIBRERA DE ETIQUETAS...................................................................................81 6.2. CREAMOS LA ETIQUETA PROPIAMENTE DICHA..............................................................82 6.3. CREAMOS EL BEAN..................................................................................................................82 6.4. DESDE UNA JSP USAMOS EL TAG.........................................................................................83 6.5. CREAMOS LA BASE DE DATOS..............................................................................................84 6.6. INGRESAMOS ALGUNOS DATOS...........................................................................................84 6.7. EJECUTAMOS LA APLICACION..............................................................................................85 6.8. TALLER PROPUESTO SOBRE TAGS JSP................................................................................85 7. CREANDO SENCILLA APLICACIN WEB NETBEANS 3 CAPAS.............................................86 7.1. PASO 1: CREAR LA BASE DE DATOS.....................................................................................86 Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

377

7.2. PASO 2: CREAR EL ORIGEN DE DATOS...............................................................................89 7.3. PASO 3: CREACION DE UN PROYECTO WEB CON NETBEANS.......................................92 7.4. PASO 4: CREACION DEL PAQUETE QUE TENDRA LA LOGICA Y EL ACCESO A DATOS.................................................................................................................................................97 7.5. PASO 5: CREACION DE LA VISTA........................................................................................103 7.6. PASO 6: INGRESANDO CODIGO EN EL MODELO.............................................................105 7.7. PASO 7: INGRESANDO CODIGO EN EL CONTROLADOR................................................107 7.8. PASO 8: INGRESANDO CODIGO EN LA VISTA..................................................................109 7.9. PASO 9: ENSAMBLE Y DESPLIEGUE DE LA APLICACION..............................................110 7.10. PASO 10: EJECUCION DE LA APLICACIN......................................................................112 8. MANIPULACION DE COOKIES Y SESIONES.............................................................................114 8.1. CREACION DE UNA COOKIE DESDE UN SERVLET..........................................................114 8.2. CREACION DE UNA SESSION DESDE UNA JSP.................................................................115 9. ELABORACION DE UN CHAT POR PASOS.................................................................................118 9.1. PRIMEROS PASOS....................................................................................................................118 9.2. UN EJEMPLO DE UN CLIENTE Y UN SERVIDOR...............................................................119 9.3. EL METODO ACCEPT DE SERVERSOCKET........................................................................127 9.4. SEGUNDA MEJORA AL PROGRAMA ANTERIOR..............................................................128 9.5. MEJORANDO EL PROGRAMA ANTERIOR COLOCANDOLE UNAS BELLAS INTERFACES GRAFICAS...............................................................................................................130 9.6. EL SERVIDOR CREA AADE A LA LISTA CADA VEZ QUE LLEGA UN CLIENTE.....133 9.7. QUE ES UN HILO......................................................................................................................137 9.8 CHAT PUBLICO USANDO HILOS...........................................................................................138 10. PROGRAMA SIN MODELAR NO ES PROGRAMAR.................................................................144 10.1. IMPORTANCIA DEL DIAGRAMA DE ESTADOS EN UN ENVIO DE INFORMACION MINICHAT........................................................................................................................................144 10.1.1. DESCRIPCION......................................................................................................................144 10.1.2. EL LADO DEL SERVIDOR ES:...........................................................................................144 10.1.3. EL LADO DEL CLIENTE ES:..............................................................................................148 10.2. IMPORTANCIA DEL DIAGRAMA DE CLASES EN EL MODELAMIENTO DE UN PROGRAMA DE UN PIRATA.........................................................................................................151 10.2.1. PLANTEAMIENTO DEL ENUNCIADO.............................................................................151 10.2. ESTABLECIMIENTO DE FRASES IMPORTANTES...........................................................151 10.2.2. ESTABLECIMIENDO DE CLASES.....................................................................................152 10.2.3. PROGRAMA EN JAVA........................................................................................................153 10.2.4. EJECUCIN DEL PROGRAMA:.........................................................................................158 10.3. IMPORTANCIA DEL DIAGRAMA DE CLASES EN EL MODELAMIENTO DE UN PROGRAMA DE UN AVION...........................................................................................................161 10.3.1. DIAGRAMA DE CLASE......................................................................................................161 10.3.2. EXPLICACIN DE LA IMPLEMENTACIN....................................................................162 10.3.3. EJECUCIN DEL PROGRAMA..........................................................................................170 11. ENVIO Y RECEPCION DE CORREO ELECTRONICO...............................................................173 11.1. ENVIO DE CORREO DESDE UNA INTRANET...................................................................173 11.2. ENVIO DE CORREO CON ARCHIVO ADJUNTO...............................................................174 11.3. CONECTAR A SERVIDOR DE CORREO USANDO SOCKETS ........................................176 11.4. ENVIANDO MENSAJES DE CORREO USANDO SOCKETS.............................................177 12. ENVIO DE ARCHIVOS POR FTP..................................................................................................179 12.1. CONECTARSE A SERVIDOR FTP........................................................................................179 12.2. ENVIAR ARCHIVOS A SERVIDOR FTP..............................................................................180 12.3. CONECCION SERVIDOR FTP USANDO SOCKETS...........................................................181 13. TRABAJANDO CON RMI..............................................................................................................185 13.1. DESCRIPCION DE EJERCICIO..............................................................................................185 13.2. PRIMERO CREAMOS Y COMPILAMOS LA CLASE INTERFACE ..................................185 Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

378

13.3. CREAMOS Y COMPILAMOS EL OBJETO REMOTO QUE SE VA A COMPARTIR.......186 13.4. CREAMOS LA APLICACIN DEL LADO DEL SERVIDOR..............................................187 13.5. REGISTRAR EL OBJETO REMOTO......................................................................................188 13.6. SUBIR EL SERVIDOR RMI....................................................................................................188 13.7. COLOCAMOS LA APLICACIN QUE HICIMOS EN EL SERVIDOR RMI......................189 13.8. INVOCACION DEL CLIENTE................................................................................................189 13.9. SCRIPT PARA EJECUTAR EL CLIENTE..............................................................................189 14. BEAN Y JAVA BEAN.....................................................................................................................191 14.1. ARQUITECTURA DE LOS JAVA BEAN..............................................................................191 14.2. BEAN TIPO MESSAGE CON JAVA......................................................................................195 14.3. CREACION DE UN BEAN DE ENTIDAD CON NETBEANS Y ORACLE 10G EXPRESS ............................................................................................................................................................208 15. EJERCICIO DE WEB SERVICE.....................................................................................................234 15.1. CONSEGUIR EL SOFTWARE ANTES DE TRABAJAR......................................................234 15.2. CONFIGURACION PREVIA DEL SERVIDOR.....................................................................235 15.3. INSTALACION DEL SOFTWARE EN EL LADO DEL SERVIDOR...................................238 15.4. PROBAMOS LA CONFIGURACION DEL LADO DEL SERVIDOR..................................248 15.5. ALGUNOS PROBLEMAS QUE SE PRESENTARON FUERON:.........................................258 15.6. MONTAJE DE UN EJERCICIO SENCILLO..........................................................................264 15.7. PROBANDO EL LADO DEL CLIENTE.................................................................................266 15.8. MANUAL DE INSTALACIN:...............................................................................................279 15.9. CARACTERSTICAS TCNICAS DONDE EJECUTO EL CLIENTE..................................287 16. FRAMEWORKS PARA REALIZAR PRUEBAS...........................................................................288 16.1. FUNCIONAMIENTO DE JUNIT.............................................................................................288 16.2. CONSTRUCCION DE LA CLASE QUE VAMOS A PROBAR............................................289 16.3. CONSTRUCCION DE CASO DE PRUEBA PARA CLASE LISTA......................................292 16.4. ELABORACION DEL PROGRAMA QUE EJECUTA LA PRUEBA....................................295 16.5. EJECUCION DEL TESTRUNNER..........................................................................................295 17. INTRODUCCION A LAS APLICACIONES MOVILES...............................................................302 17.1. PINTAR MEDIA PANTALLA CON UN LIENZO.................................................................302 17.2. COLOCAR DOS LIENZOS......................................................................................................307 17.3. PINTAR LA BANDERA DE COLOMBIA..............................................................................309 17.4. COLOCAR UNA FORMA EN LA PANTALLA.....................................................................312 17.5. AADIR UN STRING A UNA FORMA.................................................................................315 17.6. UN PRIMER MENU CON EVENTOS....................................................................................317 18. EJEMPLO DE SERVICIO WEB MOVIL.......................................................................................325 18.1. CONECTARSE A UN SERVIDOR WEB DESDE UN MOVIL.............................................325 19. EJEMPLO DE SERVICIO WEB MOVIL.......................................................................................327 19.1. CREACION DE LA APLICACIN MOVIL...........................................................................327 19.2. MONTAJE EN EL SERVIDOR DE SERVICIOS WEB.........................................................330 19.3. EJECUCION DEL SERVICIO.................................................................................................332 20. TECNOLOGIA BLUETOOTH........................................................................................................336 20.1. MOSTRANDO ESTADO DE UN DISPOSITIVO BLUETOOTH..........................................336 20.2. CREACION DEL SERVIDOR BLUETOOTH .......................................................................339 20.3. CREACION DEL CLIENTE BLUETOOTH ...........................................................................342 21. SEGURIDAD EN JAVA..................................................................................................................348 21.1. APPLET QUE LEE UN ARCHIVO LOCAL...........................................................................348 22. PROGRAMACION CON GOOGLE...............................................................................................361 22.1. DEFINICION DE APIS DE GOOGLE: ...................................................................................361 22.2. REQUERIMIENTOS................................................................................................................361 22.3. ALGUNAS APIS DE GOOGLE...............................................................................................361 22.4. OBTENER LA CLAVE DEL API DE GOOGLE MAPS........................................................361 22.5. COLOCAR LA ALTITUD Y LA LATITUD...........................................................................362 Enciclopedia Conociendo Curso de Jsp y Servlets

Autor: Luis Felipe Wanumen Silva

379

22.6. ALGUNAS COSAS CURIOSAS DE GOOGLE......................................................................362 23. INVESTIGACIONES PROPUESTAS PARA LOS ESTUDIANTES DE JAVA AVANZADO...364 23.1. PROPUESTA DE PARCIAL PRIMERO.................................................................................364 23.2. UNA PRIMERA PROPUESTA................................................................................................365 23.3. PROPUESTAS PARA EL SEMESTRE 2007 III.....................................................................368 23.4. PROPUESTAS PARA EL SEMESTRE 2008 I........................................................................368 23.5. PROPUESTAS PARA EL PRIMER SEMESTRE 2010 I........................................................369 24. BIBLIOGRAFA E INFOGRAFA..................................................................................................371 24.1. BIBLIOGRAFIA FACIL DE CONSEGUIR EN COLOMBIA SOBRE JAVA.......................371 24.2. REFERENCIAS DE JAVA.......................................................................................................372 24.3. REFERENCIAS DE JAVA-CORBA-RMI...............................................................................373 TABLA DE CONTENIDO....................................................................................................................376

Enciclopedia Conociendo

Curso de Jsp y Servlets

Você também pode gostar