viernes, 19 de marzo de 2010

Java 6. Derby, la base de datos incluida en jdk 6

   Saludos compañeros y gracias por estar de nuevo aquí aprendiendo juntos un poco más sobre lo que es la tecnología Java en su última version de Java SE 6.

   Ahora le toca el turno a Derby: Base de datos relacional y transaccional que viene incluido por defecto en el JDK 6.0, más específicamente lo puede encontrar en la ruta de java. En windows: C:\Archivos de Programa\Java\jdk1.6.0\db, o en general en la carpera db donde se encuentra la instalación de java SE 6.

   Para hablar un poco de dónde viene Derby, esta se inicia como CloudSpace: una base de datos relacional creada por Informix, compañía que fue adquirida en 2001 por IBM. en 2004 IBM decide convertir a CloudSpace en software libre cambiando su nombre a Derby.
La página principal de Derby es: http://db.apache.org/derby/.

   Las ventajas que promete Derby son sus mínimas necesidades de configuración y administración y el pequeño espacio que ocupa en disco. Otra ventaja es que Derby soporta el almacenamiento de una base de datos archivada en un archivo JAR, lo que lo hace fácil de incluirlo y distribuirlo en nuestra aplicación.

   Visto esto, empecemos a ver cómo incluir esta base de datos en nuestra aplicación Java.

   Objetando un poco: Aunque se dice que Derby viene incluido con el JDK 6.0, en las últimas instalaciones que he realizado no ha sido instalado por defecto, por lo tanto lo descargué directamente de db-derby-10.5.3.0-bin.zip.

   Una vez descargado se descomprime en la carpeta que se desee (supongamos C:\derby). Ahora se agrega al PATH (variable de entorno) la ruta interna bin (es decir C:\derby\bin). En esta carpeta se encuentran dos archivos esenciales: ij.bat y startNetworkServer.bat. Abrimos una consola y ejecutamos primero el startNetworkServer.bat (en la ruta C:\derby\bin) con esto se levantará el servidor de base de datos Derby.

   Una vez hecho esto hay que dirigirse en una consola nueva a la carpeta de nuestro proyecto (preferiblemente) para crear nuestra base de datos nueva.
Una vez ubicado en la ruta de nuestro proyecto java se escribe ij.bat, se iniciará la aplicación ij que es la herramienta para conectarse, crear y manipular base de datos Derby.
NOTA IMPORTANTE: La creación de una base de datos Derby agrega una carpeta con el nombre de la base de datos al sistema en la ruta donde fue ejecutada la aplicación ij, por ello es recomendable dirigirse a la carpeta donde se encuentra nuestro proyecto y ejecutar allí esta herramienta.


C:\RutaProyecto\ij.bat
Version ij 10.5
ij>


   Ahora a la linea ij> se debe agregar algo como:

ij> connect 'jdbc:derby:NombreBD;create=true';



NOTA: No olvide colocar el punto y coma al final de cada sentencia derby, ya que esto indica que finaliza la misma, si no lo hace no se ejecuta la sentencia escrita.

   Con esto se crea una base de datos Derby de nombre NombreBD en la ruta donde se ejecutó el ij.bat. Podemos ahora crear una tabla, insertar registros y seleccionarlos:


ij> CREATE TABLE persona(id integer, nombre varchar(15), apellido varchar(15), edad integer);
0 filas insertadas/actualizadas/suprimidas
ij>INSERT INTO persona VALUES(1, 'Rafael', 'Romero', 31),(2, 'Orlando', 'Gracia', 42),(3, 'Yessica', 'Alba', 35);
3 filas insertadas/actualizadas/suprimidas
ij> SELECT * FROM persona;
//Se muestran los datos ingresados
3 filas seleccionadas


   Por defecto la ejecución automática está activada (autocommit ON), se puede controlar escribiendo en ij> autocommit ON; o autocommit OFF;

   Para salir de la herramienta ij se escribe exit;

   Una vez visto esto veamos como podemos enlazar esta base de datos a nuestra aplicación.
  1. import java.sql.*;
  2.  
  3. public class Derbiando {
  4.  
  5.         public static void main(String[] args) {
  6.                 Derbiando dbDerby = new Derbiando();
  7.                 dbDerby.mostrarDatos();
  8.         }
  9.  
  10.         public void mostrarDatos(){
  11.                 try{
  12.                         String driver = "org.apache.derby.jdbc.EmbeddedDriver";
  13.                         Class.forName(driver).newInstance();
  14.                         Connection conn = DriverManager.getConnection("jdbc:derby:C:\\RutaProyecto\\NombreBD");
  15.                         Statement s = conn.createStatement();
  16.                         ResultSet rs = s.executeQuery("SELECT * FROM persona");
  17.                         while(rs.next()){
  18.                                 System.out.println("id: "+rs.getInt(1));
  19.                                 System.out.println("nombre: "+rs.getString(2));
  20.                                 System.out.println("apellido: "+rs.getString(3));
  21.                                 System.out.println("edad: "+rs.getInt(4));
  22.                                 System.out.println();
  23.                         }
  24.                         rs.close();
  25.                         s.close();
  26.                         conn.close();
  27.                 }catch (Exception e) {
  28.                         e.printStackTrace();
  29.                 }
  30.                        
  31.                
  32.         }
  33. }



Salida Generada:
id: 1
nombre: Rafael
apellido: Romero
edad: 31

id: 2
nombre: Orlando
apellido: Gracia
edad: 42

id: 3
nombre: Yessica
apellido: Alba
edad: 35

domingo, 28 de febrero de 2010

Java 6: Publicación de una clase como un Servicio Web

    Para este propósito encontré un artículo que habla claramente y paso a paso como construir un Servicio Web, es decir, como publicar nuestra clase java para que esté disponible en la web y poder ser utilizada por clientes en forma remota.

    Java 6.0 agregó el paquete javax.xml.ws junto a las anotaciones de javax.jws.

    El artículo completamente en español y se deriva de la documentación Java, es decir no es lo mismo pero utiliza el mismo ejemplo de esta documentación.

    Utilizamos lo que se llama JAX-WS que no es más que las siglas para Java API for XML Web Services. Este blog a que les hago referencia, detalla paso a paso como hacer una clase y marcarla como publicable, crear la clase publicadora, y como por consola realizar los pasos para publicar y utilizar la clase por un cliente.

    El enlace es el blog de Willy Mejía (willyxoft) y el articulo es Servicios Web con JAX-WS sin contenedores Java EE.

    Para un tutorial completo sobre Web Services de java visite The Java Web Services Tutorial. Espero haber ayudado. Además todavía hay mucho que investigar.

    Por cierto todavía tengo una duda y es cómo importar una clase de Java en una clase que será publicada como servicio web. Las cosas se complican un poco más, pero lean el artículo, incluso allí en comentario está escrita mi duda.

Nos vemos

sábado, 30 de enero de 2010

Java 6: Conexión con los lenguajes de Script.

Si desea ver una imagen en tamaño completo haga click en ella.

   Con la versión más reciente de Java (J2SE 6) se hace posible combinar secciones de código Java con lenguajes de Script como JavaScript, PHP, Ruby y Phyton entre otros. Esto gracias al nuevo paquete javax.script.
   En nuestros ejemplos ejecutaremos ejemplos sólo combinando hasta ahora JavaScript y Java.

   Para comenzar lo más importante es saber que se debe crear una instancia de ScriptEngineManager que me permitirá retornar un objeto ScriptEngine especificando el lenguaje con el que haré la conexión veamos esto con código:



Como se puede ver, además de crear los objetos explicados anteriormente se utilizó el método eval de ScriptEngine para evaluar el código Script (lanza ScriptException), en este caso obtendríamos por consola, la frase: Hola Mundo, que se ha impreso desde código JavaScript combinado con Java.

Nota: También podríamos enlazar con JavaScript con el método getEngineByExtension de ScriptEngineManager de la siguiente manera: factory.getEngineByExtension(“js”);

Claro, este es el ejemplo más sencillo, veamos qué otras opciones tenemos.
Supongamos que tenemos un procedimiento que queremos invocar en varias ocasiones, no es necesario colocar todo el código de nuevo, podemos hacer una función JavaScript mediante el método eval y luego castear el objeto ScriptEngine en Invocable, para llamar a la función creada en el momento que lo deseemos.



Salide del Ejemplo:
Hola, como estas?
Saludando de nuevo...
Hola, como estas?
Se invocó la función dos veces.

También podemos acceder a objetos de java desde nuestro código Script, para ello se utilizan los objetos Binding que son un mapa (Map) de pares clave-valor con clave String y valores Object (Map), con esto puedo crear objetos y asignarlos a un String y mediante el código de Script realizar las operaciones que desee. Veamos el ejemplo:



Salida del ejemplo anterior:

Ambiente Script...
Java
C++
Phyton
Ambiente Java...
Java
C++
Phyton
Ruby

Aunque también puedo pasarle parámetros reales en la invocación del método en invokeFunction() de la interface Invocable, veamos:



Salida del ejemplo anterior:
Primera Impresion...
Java
C++
Segunda Impresion...
Java
C++
Ruby

Para terminar también es bueno saber que puedo utilizar objetos y métodos de java dentro de los scripts, para ello debo importar el paquete que desee y utilizarlo dentro del script, veamos ejemplo:



Salida del ejemplo anterior, por consola un número aleatorio del 0 al 1.

Para descargar un ejemplo completo de Scripting Java 6 haga click Aquí

Hablemos de las novedades de Java 6

   Saludos de nuevo, es un placer para mí encontrarnos de nuevo en este año para compartir nuevas experiencias y conocimientos en el caso de la tecnología Java.
   Para empezar este año hablaremos sobre la nueva versión de Java 6 (J2SE 6) y algo de lo nuevo que ha incluido esta versión.
   Para comenzar nombremos algunas de ellas:
   • Conexión con lenguajes de Script como JavaScript, PHP, Ruby, Phyton, entre los que pude encontrar.
   • Exportar una clase como un Servicio Web.
   • Uso de Derby , herramienta que ofrece conectarse y manipular bases de datos Derby.
   • Hablaremos sobre algunas novedades del paquete javax.swing.

   En fin, todo en lo que esté a mi alcance posible, para conocer las buenas nuevas que trae esta versión que está disponible ya, y que hasta esta fecha permanece como la versión más reciente.

   Espero que esta información sirva de provecho y aclare dudas con respecto a las novedades de java 6. Feliz viaje.

jueves, 31 de diciembre de 2009

Feliz Año nuevo 2010

Al culminar este año les agradezco que hayan compartido con nosotros nuestro primer año en línea de "Acerca de Java".

Espero seguir compartiendo junto a ustedes siempre, esperando de sus comentarios y sugerencias para poder llevar un mejor servicio de estudio de la tecnología Java, con la bendición de Dios, la compañía de los ángeles y con todos ustedes lectores que son los principales protagonistas.

Para el año entrante 2010 espero sigamos adelante, haciendo uso de nuevas alternativas para compartir las técnicas de programación, también de innovaciones de esta tecnología, enlaces a otras páginas webs y blogs que puedan aclararnos las ideas y compartir el conocimiento que nos lleve a crecer como personas y a mejorar las condiciones de vida del ser humano.

Nos espera todavía mucho por recorrer, java es un lenguaje muy extenso y por eso hay tantos libros que lo abordan de distinta manera. Gracias a todos los que escriben por pasión al conocimiento, al libro de la WROX "Java JDK 6.0" (W. Clay Richardson y otros autores) de la cual he extraído algunas ideas para compartir, a DEITEL por su libro "Java, cómo programar" donde explican de forma clara, extensa y precisa la programación orientada a objetos en Java 1.4; por supuesto, también gracias al API de Java que es la guía de referencia de cualquier programador Java y por último a todos los blogs, foros y demás herramientas de internet que sirven para tener información de referencia y poder aclararla o extenderla. Es decir gracias a todos aquellos que directa o indirectamente aportan o hacen posible este servicio.

Y además, gracias de nuevo a ustedes por su compañía y apoyo.

¡Nos vemos en el 2010, Feliz Navidad y un 2010 lleno de amor y esperanza!

Les desea su servidor Kelvin Atencio a través de www.acercadejava.blogspot.com

martes, 22 de diciembre de 2009

Tenemos 2 de Argumentos variables y otras 2 más...

Nota: Si no ve bien las imágenes del código puede dar click en ella y esta se mostrará más fielmente en una nueva pantalla.

1.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código?



[A].- Error de compilación
[B].- Se imprime 1
[C].- Se imprime 2
[D].- Se imprime 3
[E].- Se imprime 4
[F].- Se lanza una excepción en ejecución

2.- ¿Cuál es el resultado al compilar y ejecutar este código?
Suponga que en ejecución se pasan los parámetros de la siguiente manera:
>java PruebaVarArgs2 arg1 arg2 arg3



[A].- Se imprime "entro en arreglo"
[B].- Se imprime "entro en elipsis"
[C].- Se lanza IllegalArgumentException
[D].- Se lanza ArrayIndexOutOfBoundsException
[E].- El programa no puede compilar
[F].- Ninguna de las anteriores

3.- ¿Que se imprime al compilar y ejecutar el siguiente código?

[A].- This is the default outputtwentyten
[B].- twentyten
[C].- twenty
[D].- Error de compilacion
[E].- Excepción en ejecución

4.- ¿Qué se imprime en pantalla al compilar y ejecutar el siguiente código?

[A].- medidas finales (Alto: 50.0, Ancho: 20.0)
[B].- medidas finales (Alto: 60.0, Ancho: 30.0)
[C].- medidas finales (Alto: 80.0, Ancho: 20.0)
[D].- medidas finales (Alto: 80.0, Ancho: 30.0)
[E].- medidas finales (Alto: 60.0, Ancho: 20.0)
[F].- medidas finales (Alto: 50.0, Ancho: 30.0)

Respuestas Correctas:

1.- [D]. Se imprime 3.
Si, el compilador no tiene ninguna dificultad al compilar este código, pero en la ejecución como ambos métodos pueden ejecutar el código se le da prioridad al que recibe dos parámetros por defecto. Es decir si llamo a metodo(), o metodo(5), o metodo(1,8,7), se imprime 0, 1 y 3 respectivamente que es la longitud de z, pero al llamar a metodo(6,2) se ejecuta metodo(int x, int y) y por lo tanto se imprime 3 que es el resultado de 6 entre 2.

2.- [E]. El programa no puede compilar:
Esto debido a que el compilador interpreta tanto método String[] como String... como arreglos y por lo tanto el método está duplicado, por lo tanto el programa no compila.

3.- [B]. twentyten:
C
omo k vale 20, el programa imprime twenty, luego, como no existe un break, continúa abajo hasta case 10, por lo que imprime ten también. La compilación tiene efecto aunque default este de primero y aunque esté en cualquier parte de switch este sólo se ejecuta si ninguno de los case coincide.

4.- [C]. medidas finales (Alto: 80.0, Ancho: 20.0):
Java por defecto pasa los parámetros por valor. Para referencias y arreglos puedo cambiar el contenido pero no puedo asignarle una nueva referencia. Debido a esto, la línea 24 deja a rectangulo igual (50.0, 20.0), pero al llamar a cambiarAlto si cambia el valor dentro de la referencia y por lo tanto cambia el alto a 80.0, por lo tanto las medidas finales son Alto: 80.0 y Ancho 20.0

lunes, 30 de noviembre de 2009

Tres preguntas variadas

1.- Cuál es el resultado de compilar y ejecutar el siguiente código?



[A].- Imprime CAMain
[B].- Imprime ABCAMain
[C].- Imprime BCAMain
[D].- Imprime CBAAMain
[E].- Error de compilación
[F].- Excepcion en la ejecución


2.- Cual es el resultado al compilar y ejecutar el siguiente código?



[A].- 0123
[B].- 13
[C].- 1234
[D].- Error de compilación
[E].- Excepción en tiempo de ejecución

3.- Cual es el resultado al compilar y ejecutar el siguiente código?

[A].- Se imprime intenta, atrapa, finalmente y luego se lanza excepcion.
[B].- Error de compilación. Método main no debe lanzar (throws) Excepciones.
[C].- Error de compilación linea 17. No se puede lanzar excepcion en bloque finally.
[D].-Ninguna de las anteriores.


Respuestas:

1.- [C]: Debido a que cuando se crea el objeto C en la línea 19, se llama a los constructores por defecto de A, B y C, pero el constructor de A no hace nada (constructor por defecto), el método A que aparece allí es un método de clase ya que devuelve "void" (no es un constructor ya que tiene la palabra void), entonces al invocarse el constructor B se imprime B, luego se imprime C que es el constructor de C, y luego se invoca al mátodo A en la línea 20 por lo que se imprime A, para termina se imprime Main.

2.- [A]: Debido a que a es "true" esto hace que se entre en la estructura if sin verificar la segunda condición, es decir (++x) > 0. Por lo tanto se imprimen los valores que trae x por defecto del ciclo for.

3.- [D].- Como e1 = e está en una estructura catch el compilador no tiene la garantía de que esta sentencia se ejecute y por lo tanto se lanza una excepción en esta línea ya que el compilador no tiene la garantía que e1 sea inicializada.