Curso De Programación En Java - SolucionJava

Transcription

Nivel avanzadoManual del alumno(Versión 6, JDK 1.6.0)SolucionJava.comReproducción prohibidaVersión 2.0 Copyright Cédric Simon, 2009Ing. Cedric Simon – Tel: 2268 0974 – Cel: 8888 2387 – Email: c e d r i c @ s o l u c i o n j a v a . c o m – Web: www.solucionjava.comCurso de programaciónen Java

Curso de programación en JavaPagina 2 / 151 Índice1 Índice.22 Introducción al curso.32.1 Objetivo de este curso.32.2 Manual del alumno.32.3 Ejercicios prácticos.32.4 Requisitos para atender a este curso.32.5 Soporte despues del curso.33 Conexión a base de datos.43.1 Objetivo del capitulo.43.2 Driver ODBC.43.3 Driver JDBC.43.4 Conexión.43.5 Ejecución de instrucciones SQL.53.6 Paquete SolucionJava.64 Reciclaje de memoria.75 Clases interesantes.85.1 Clase StringBuilder.85.2 Clase ArrayList.86 Streaming.97 Variables de sistema.118 Compresión y empaquetado de aplicación.129 Threads.1310 Ejercicios.1411 Esquema de la base de datos.15 Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 3 / 152 Introducción al curso2.1 Objetivo de este cursoEn este curso vamos a ver unas opciones avanzadas del lenguaje Java. Esta base les va a servir por cualquier tipo deaplicación que desea realizar: aplicación independiente, applet, pagina web en Java 2.2 Manual del alumnoEste manual del alumno es una ayuda para el alumno, para tenga un recuerdo del curso. Este manual contiene unresumen de las materias que se van a estudiar durante el curso, pero el alumno debería de tomar notas personalespara completas este manual.2.3 Ejercicios prácticosPara captar mejor la teoría, se harán muchos ejercicios con los alumnos, para probar la teoría y verificar laintegración de la materia.También, el alumno podrá copiar sus códigos en un disquete al fin del curso para llevarse, con fin de seguir la prácticaen su hogar.2.4 Requisitos para atender a este cursoSe requiere un conocimiento de base del lenguaje Java, y la programación orientado a objeto. también se neceista unconocimiento de base del lenguaje SQL.Si el alumno tiene dificultades en un u otro capitulo, el debe sentirse libre de pedir explicaciones adicionales alprofesor.2.5 Soporte despues del cursoSi tienes preguntas sobre la materia del curso en tus ejercicios prácticos, puedes escribir tus preguntas acedric@solucionjava.com.Para informaciones sobre otros cursos, visita el sitio web www.solucionjava.com. Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 4 / 153 Conexión a base de datosCuando se desarrolla una aplicación, muchas veces se necesita conectar a una base de datos. Java permite conectarsea las mayorías de las base de datos, por tanto que existe un driver ODBC o mejor, JDBC.3.1 Objetivo del capituloAl fin de este capitulo, el alumno será capaz de crear una conexión a una base de datos y ejecutar instrucciones en labase de datos. Este capitulo no es una iniciación al SQL ni al manejo de base de datos.3.2 Driver ODBCUn driver ODBC (Open Database Connectivity) permite utilizar un driver “genérico” para conectarse a une base dedatos. Así Java se conecta al driver ODBC, y el driver ODBC se conecta a la base de datos. Es el medio más fácil deconectarse a una base de datos, pero es mucho menos eficiente que un driver JDBC.3.3 Driver JDBCUn driver ODBC (Java Database Connector) es un driver diseñado para conectarse a una base de datos. Este driveres específico a una base de datos (y a veces a una cierta versión de una base de datos).El driver JDBC se conecta directamente a la base de datos, y como él esta diseñado para esta base de datos, tienenormalmente muchas más opciones, y menos restricciones, que el ODBC.3.4 ConexiónBásicamente, hay primero que cargar el driver JDBC, luego hay que conectarse a la base de datos, y si logras eso,puedes ejecutar tus consultas SQL.Ejemplo:import java.sql.DriverManager;import java.sql.SQLException;public class TestDb {public static void main(String[] args) {java.sql.Connection con null;try {try {System.out.println("Buscando el driver JDBC.");Class.forName("com.mysql.jdbc.Driver"// "org.postgresql.Driver"// "oracle.jdbc.driver.OracleDriver"// "com.microsoft.sqlserver.jdbc.SQLServerDriver"// tem.out.println(".Encontró el driver JDBC");} catch (Exception e) {System.out.println("No pudo encontrar el driver JDBC !!!!");e.printStackTrace(System.out);return;}try {System.out.println("Connectando a la base de datos.");con t/curso?user curso&password 123"// ","123"// 123"// "jdbc:sqlserver://192.168.0.100:1433/database curso/user curso/password 123"// do a la base de datos");} catch (Exception e) {System.out.println("No pudo conectarse a la base de datos !!!!");e.printStackTrace(System.out);return;} Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 5 / 15} finally {System.out.println("Cerrando la conexion a la base de datos.");try {if (con ! null)con.close();} catch (SQLException e) }3.5 Ejecución de instrucciones SQLPara poder ejecutar instrucciones SQL en la base de datos, hay que ser conectado a la a base de datos.Una vez conectado, hay que crear la instrucción, ejecutarla, y eventualmente recoger el resultado.Dependiendo de si la instrucción debería de regresar datos, o no, se va utilizar una lista de resultados (ResultSet) osolamente ejecutar la instrucción.De Java se pueden también llamar a procedimientos y funciones de la base de datos.Para evitar problemas con juegos de carácter o caracteres especiales, es mejor utilizar CallableStatement yPreparedStatement.Ejemplo:import java.sql.*;public class TestSql {public static void main(String[] args) {Connection con null;PreparedStatement ps null;Statement s null;ResultSet rs null;try {try {System.out.println("Buscando el driver JDBC.");Class.forName("com.mysql.jdbc.Driver"// "org.postgresql.Driver"// "oracle.jdbc.driver.OracleDriver"// "com.microsoft.sqlserver.jdbc.SQLServerDriver"// tem.out.println(".Encontró el driver JDBC");} catch (Exception e) {System.out.println("No pudo encontrar el driver JDBC !!!!");e.printStackTrace(System.out);return;}try {System.out.println("Connectando a la base de datos.");con t/curso?user curso&password 123"// ","123"// 123"// "jdbc:sqlserver://192.168.0.100:1433/database curso/user curso/password 123"// do a la base de datos");} catch (Exception e) {System.out.println("No pudo conectarse a la base de datos !!!!");e.printStackTrace(System.out);return;}try {System.out.println("Lista de empleados con salario inferior a 30,000");s con.createStatement();rs s.executeQuery("select concat(first name,' ',last name) as full name fromemployee where salary 30000");// "select first name ' ' last name as full name from employee where salary 30000");while (rs.next()) {System.out.println(rs.getString("full name")); Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 6 / 15}} catch (java.sql.SQLException e) {System.out.println("Unable to step thru results of query");showSQLException(e);return;}try {System.out.println(" ");System.out.println("Lista de empleados con salario entre 30,000 y 40,000");ps con.prepareStatement("select concat(first name,' ',last name) as full name fromemployee where salary between ? and ?");// "select first name ' ' last name as full name from employee where salary between ?and ?");ps.setInt(1, 30000);ps.setInt(2, 40000);rs ps.executeQuery();while (rs.next()) {System.out.println(rs.getString("full name"));}} catch (java.sql.SQLException e) {System.out.println("Unable to submit a static SQL query.");showSQLException(e);return;}} finally {System.out.println("Cerrando la conexion a la base de datos.");try {if (rs ! null) {rs.close();}} catch (java.sql.SQLException e) {showSQLException(e);}try {if (ps ! null) {ps.close();}} catch (java.sql.SQLException e) {showSQLException(e);}try {if (con ! null) {con.close();}} catch (java.sql.SQLException e) }private static void showSQLException(java.sql.SQLException e) {java.sql.SQLException next e;while (next ! null) println("Error Code: " next.getErrorCode());System.out.println("SQL State: " next.getSQLState());next next.getNextException();}}3.6 Marco de trabajo de SolucionJavaEl marco de trabajo de SolucionJava trae una clase que facilita la conexión a la base de datos.Para usarla, crea una clase que extiende com.solucionjava.db.ConnectDB y sobreescribe el metodoinitConnectionVariables().Ver la documentacion Java del API para mas información.Todos los archivos relacionados al marco de trabajo de SolucionJava.com se pueden descargar desdehttp://solucionjava.sourceforge.net . Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 7 / 154 Reciclaje de memoriaJava tiene un manejo interno de la memoria, y periódicamente, recicla la memoria que no es más utilizada,destruyendo los objetos sin referencia en la memoria. Este acción se llama “garbage collección”.Como Java puede consumir bastante memoria, es importante de no crear objetos que no son necesarios, y de liberarobjetos que no son más necesarios.Un método (System.gc();) permite también de preguntar a Java de empezar el reciclaje de la memoria, pero no es poreso que el reciclaje será total ni siempre inmediato. Llamar a la recolección de basura tiene también un costo a nivelde performancias (probar con ejemplo aquí abajo).Para que un objeto sea candidato al reciclaje, el no debe estar ligado a nada utlizado. Para estar seguro que su objetosera candidato, es mejor meterlo a nulo (null) de manera explicita.Si la recolección 'forzada' de memoria puede ayudar en casos de progaramas usando muchas memorias, esa manerasolo retardara un poco el problema, pero no lo resolver. Hay que investigar la fuente del uso de memoria y corregirlo,mejor que utilizar la recolección forzada de memoria.Para investigar la fuente del problema, es posible de conocer la memoria del JVM que queda disponible utilizando elmetodo freememory() del objeto Runtime. Ver en la documentación de Java para mas detalles.Ejemplo (probar con System.gc() y sin):public class TestMemory {public static void main(String[] args) {String test "";Runtime rt Runtime.getRuntime();for (int i 0;i 1000;i ) {System.out.println("Memoria total: " rt.totalMemory() " - Memoria libre: " rt.freeMemory());test ();}}} Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 8 / 155 Clases interesantes5.1 Clase StringBuilderLa clase StringBuilder permite de ahorar memoria en caso de una cadena de caracteres que mucho cambia en eltiempo (concatenacion, reemplazo,.)La clase String crea un nuevo objeto a cada modificación del objeto, StringBuilder no.StringBuilder tiene menos metodos que String, pero tiene las principales. Ver la documentación de Java para masinformación.5.2 Clase ArrayListLa clase ArrayList, del paquete java.util permite construir arreglos de tamaño dinamico, y de poder ordenar susvalores. Los arreglos normales en Java tienen un tamaño definido al inicializar el arreglo, y no se puede cambiar sincrear otro objeto. ArrayList permite manejar estos arreglos por los cuales el tamaño es dinamico. Hay que notar queun arreglo normal Java es mucho mas rápido de recorrer que un ArrayList, pero el ArrayList tiene su uso cuando nose conoce el tamaño maximum al inicializar el arreglo.Ver la documentación de Java para mas información. Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 9 / 156 StreamingEl “streaming” permite de crear un flujo de datos. Esto permite leer y/o archivos (textos, sonidos, imágenes,.). Estambién posible sacar el nombre, tamaño,. de un archivo.El streaming es por ejemplo necesario para insertar o leer objetos muy grande en la base de datos (BLOB, CLOB,.),o mostrar una imagen en JSP. Con el flujo se pueden manejar cualquier tipo de archivo binario.Los streams pueden manejar entrada como salida de flujos.Ejemplo 1: Listar archivosimport java.io.*;public class TestArchivo{public static String leer(){InputStreamReader isr new InputStreamReader(System.in);BufferedReader br new BufferedReader(isr);try{return br.readLine();}catch(Exception e){}return "";}public static void main (String[] args){System.out.println("Indique nombre de subdirectorio");System.out.println("Trayectoria absoluta, por ej: C:\\java");String nomdir leer();File arch new File(nomdir);if (arch.exists())if (arch.isDirectory()){System.out.println("Contenido de " nomdir);String arr[] arch.list();for(int j 0; j arr.length; j ){File otro new File(nomdir "\\" arr[j]);if (otro.isDirectory())System.out.println(arr[j] " DIR .println(nomdir " no es un directorio");elseSystem.out.println("No existe");}}Ejemplo 2: Leer archivo via LConnection;public class LeerURL {public LeerURL() {// TODO Auto-generated constructor stub}public static void main(String[] args) {if (args[0] null)System.out.println("Se espera un parametro al llamar al metodod main!");URL miURL null;try {miURL new URL("http://192.168.0.10/" args[0]);URLConnection yc miURL.openConnection();BufferedReader in new BufferedReader(new InputStreamReader(yc.getInputStream()));String inputLine;System.out.println(" h1 Leyendo archivo /h1 hr ");// Leer archivowhile ((inputLine in.readLine()) ! null) Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en Java{Pagina 10 / 15try {System.out.println(inputLine);int lineSize atch (Exception e1) {in.close();in r leyendo el archivo. " e1);break;}} // se();in null;}}catch(java.io.FileNotFoundException e1){System.out.println(" hr h1 font color red El archivo http://192.168.0.10/'" args[0]);}catch (Exception e) {System.out.println("Error: " e);}} Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 11 / 157 Variables de sistemaEn Java, es posible de recuperar ciertas variables de sistema. Ciertas variables estan constantes por un sistemooperativo dado, otras se pueden definir o modificar al enceder la JVM utilizando la opcion -D nombre valor anager;class SystemProp {public static void main(String[] args) {try {String msg "Propriedades del sistema\n";msg msg "Version de Java: " System.getProperty("java.vm.version") "\n";msg msg "Vendor: " System.getProperty("java.vm.vendor") " - Web:" System.getProperty("java.vendor.url") "\n\n";msg msg "Version de Windows: " System.getProperty("os.name") " " System.getProperty("os.version") " " System.getProperty("sun.os.patch.level") "\n";msg msg "OS architectura: " System.getProperty("os.arch") "\n\n";GraphicsEnvironment env msg msg "Resolución de pantalla: " (int) env.getMaximumWindowBounds().getMaxX() " x " (int) env.getMaximumWindowBounds().getMaxY() "\n";GraphicsDevice device env.getDefaultScreenDevice();int bytes device.getAvailableAcceleratedMemory();int mbytes bytes /1048576;msg msg "Memoria grafica: " mbytes " MB\n\n";msg msg "Look & Feel disponibles:\n ";UIManager.LookAndFeelInfo[] info UIManager.getInstalledLookAndFeels();for (int i 0; i info.length; i ) {// Get the name of the look and feel that is suitable for display to the userString humanReadableName info[i].getName();String className info[i].getClassName();msg msg "" humanReadableName " - " className "\n";}msg msg "\n";msg msg "Archivo del programa: " System.getProperty("user.dir") "\n\n";msg msg "CPU: " System.getProperty("sun.cpu.isalist") "\n\n";msg msg "Usuario: " System.getProperty("user.name") "\n";msg msg "Idioma: " System.getProperty("user.language") "\n";msg msg "Encoding: " System.getProperty("sun.jnu.encoding") "\n\n";msg msg "Tempdir: " System.getProperty("java.io.tmpdir") "\n";msg msg "Java CLASS path: " System.getProperty("java.class.path") "\n\n";msg msg "Java path: " System.getProperty("sun.boot.class.path") "\n\n";msg msg "Java LIB path: " System.getProperty("java.ext.dirs") "\n\n";msg msg "Windows path: " System.getProperty("java.library.path") "\n\n";System.out.println(msg);} catch (Exception ex) {System.out.println("Error in SystemProp() constructor" ex.getMessage());}}} Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 12 / 158 Compresión y empaquetado de aplicaciónPara reducir el tamaño de una aplicación asi como juntar todos los archivos juntos, se puede crear un archivo Jar quesera leido y descromprimido por Java.El uso de un manifest permite indicar a Java cual es la clase que hay que utilizar para iniciar la aplicación, yeventualmente indicar cuales otros paquetes JAR (drivers,.) hay que incluir en el classpath.Los códigos Java estan casi siempre disptribuidos en archivos Jar (drivers, aplicaciones,.). El archivo Jar puedecontener otros archivos que los archivos Java, como imagenes, textos, sonidos,.Existen progarmas (como por ejemplo Jsmooth) que esconden un archivo en un archivo EXE para correr bajoWindows como una aplicación usual de windows.Para iniciar la aplicación, se utiliza la option -jar de Java. Ejemplo: java-jar miArchivo.jarEjemplo de manifest.txt:Manifest-Version: 1.0Main-Class: prueba.MainCreated-By: Cedric Simon – www.SolutionJava.comClass-Path: mysql-connector-java-5.1.5-bin.jarEjemplo:jar -cmf manifest.txt prueba.jar prueba/*.* dbaccess/*.*Este va a crear un archivo prueba.jar continiendo los archivos de la carpeta corriente mas los de las carpetas (paquetes) pruebay dbaccess. El manifest.txt indica que la clase de arraque (que contiene el metodo main) es la clase Main del paquete prueba, yhay que incluir el archivo mysql-connector-java-5.1.5-bin.jar (como mencionado aquí, se encuentra en la misma carpeta queprueba.jar) en el classpath. Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 13 / 159 ThreadsLas “threads” son hilos de ejecución. Java por defecto trabaja con solo un hilo de ejecución, pero se puede crear varioshilos de ejecución para ejecutar varias tareas el mismo tiempo.Los threads o hilos de ejecución permiten organizar los recursos del ordenador de forma quepueda haber varios programas actuando en paralelo. Un hilo de ejecución puede realizar cualquier tarea que puedarealizar un programa normal y corriente. Bastará con indicar lo que tiene que hacer en el método run(), que es el quedefine la actividad principal de las threads.Los threads pueden ser daemon o no daemon. Son daemon aquellos hilos que realizan enbackground (en un segundo plano) servicios generales, esto es, tareas que no forman parte de la esencia del programay que se están ejecutando mientras no finalice la aplicación. Un thread daemon podría ser por ejemplo aquél que estácomprobando permanentemente si el usuario pulsa un botón. Un programa de Java finaliza cuando sólo quedancorriendo threads de tipo daemon. Por defecto, y si no se indica lo contrario, los threads son del tipo no daemon.Java proporciona métodos para manejar cada hilo de ejecución. Estos métodos permiten entre otros de parar,cancelar, reanudar hilos de ejecución, así como definir prioridades entre hilos. Ejemplos de métodos : wait(), sleep(),notify(), suspend(), resume(), stop(),.Ejemplo de Thread:public class SimpleThread extends Thread {// constructorpublic SimpleThread (String str) {super(str);}// redefinición del método run()public void run() {for(int i 0;i 10;i )System.out.println("Este es el thread : " getName());}}public class TestThread {public static void main(String[] args) { // metodo principalSimpleThread miThread new SimpleThread("Hilo de prueba");miThread.start();} // fin de metodo Main} // fin de clase TestThreadEjemplo de Runnable:public class SimpleRunnable implements Runnable {// se crea un nombreString nameThread;// constructorpublic SimpleRunnable(String str) {nameThread str;}// definición del método run()public void run() {for (int i 0; i 10; i ) {System.out.println("Este es el thread: " nameThread);}}}public class TestRunnable {public static void main(String[] args) { // metodo principalTestRunnable miTest new TestRunnable();SimpleRunnable p new SimpleRunnable("Hilo de prueba");// se crea un objeto de la clase Thread pasándolo el objeto Runnable como argumentoThread miThread new Thread(p);// se arranca el objeto de la clase ThreadmiThread.start();} // fin de metodo Main} Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 14 / 1510Ejercicios1) Conectarse a la base de datos y sacar una lista de los primeros 5 empleados.2) Crear una clase que extiende com.solucionjava.db.ConnectDB y utilizarla de desde otra clase.3) Probar el ejemplo de uso de memoria con y sin System.gc(). Comparar el uso de memoria utilizando StringBuilderen ves de String.4) Utilizar la clase ArrayList para crear una arreglo dinamico, y ordenar el arreglo.5) Leer un archivo del disco de desde una clase Java6) Pasar una variable al iniciar Java y leerla de desde una clase.7) Crear un archivo Jar que continene una pequña aplicación y ejecutarla utilizando el archivo Jar. Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en JavaPagina 15 / 1511Esquema de la base de datos Copyright Cédric Simon, 2009Versión 2.0Reproducción prohibida

Curso de programación en Java Pagina 4 / 15 3 Conexión a base de datos Cuando se desarrolla una aplicación, muchas veces se necesita conectar a una base de datos. Java permite conectarse a las mayorías de las base de datos, por tanto que existe un driver ODBC o mejor, JDBC. 3.1 Objetivo del capitulo