Sistemas

Sistemas

martes, 24 de mayo de 2011

JAVA 31. EJEMPLO BÁSICO DE MYSQL CON JAVA


Una vez instalado MySQL, descargado el driver para java de MySQL y con una base de datos y una tabla creada en MySQL, vamos a hacer un pequeño programa en java que nos permita conectarnos a la base de datos MySQL y consultar la tabla que hemos creado.

Además, necesitamos la clase org.gjt.mm.mysql.Driver que viene con el driver de MySQL. Por ello, en nuestro CLASSPATH o incluido en nuestro proyecto con nuestro IDE favorito, debemos incluir el jar que contiene el driver MySQL (mysql-connector-java-3.1.7-bin.jar) o la versión más moderna y compatible con la versión de nuestro servidor de MySQL.

Lo primero que tenemos que hacer es asegurarnos que el Driver se inicializa y se registra, para ello


try
{
   Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e)
{
   e.printStackTrace();
}


Establecer la conexión con la base de datos 

 

Debemos tener el servidor de MySQL arrancado. Si hemos instalado y dejado esa opción como estaba, cada vez que encendamos el ordenador, se arrancará el servidor de MySQL, por lo que no tenemos que preocuparnos por ello.

El servidor de MySQL abre por defecto el puerto 3306 para aceptar conexiones de posibles clientes, de programas que quieran conectarse y acceder a la base de datos. Nuestro programa java, si quiere consultar la tabla de base de datos que hemos creado, deberá conectarse a este servidor.
Para establecer la conexion, la clase DriverManager tiene métodos getConnection(). Usaremos uno de ellos

// Establecemos la conexión con la base de datos.
Connection conexion = DriverManager.getConnection ("jdbc:mysql://localhost/prueba","root", "la_clave");
El primer parámetro del método getConnection() es un String que contiene la url de la base de datos:

  • jdb:mysql porque estamos utilizando un driver jdbc para MySQL, que es el que nos hemos bajado.
  • localhost porque el servidor de base de datos, en mi caso, está en el mismo ordenador en el que voy a correr el prorama java. Aquí puede ponerse una IP o un nombre de máquina que esté en la red.
  • prueba es el nombre de la base de datos que he creado dentro de mysql. Se debe poner la base de datos dentro del servidor de MySQL a la que se quiere uno conectar. Es el nombre que pusimos cuando desde SQL hicimos create database prueba;

Los otros dos parámetros son dos String. Corresponden al nombre de usuario y password para acceder a la base de datos. Al instalar MySQL se crea el usuario root y se pide la password para él. Como no hemos creado otros usuarios, usaremos este mismo.

Si todo va bien, en conexion tendremos nuestra conexión a la base de datos.

Esta conexión es en realidad un socket entre java y la base de datos, aunque para nosotros es transparente. Lo que sí es importante, es saber que si varios hilos comparten esta conexión, deben usarla sincronizadamente. Si no se hace así, los mensajes que van por el socket se pueden entremezclar y los hilos pueden leer cachos de mensaje destinados al otro hilo. Otra opción es que cada hilo cree su propia conexión. Finalmente, la mejor opción de todas si nuestra aplicación va a tener varios hilos intentando acceder a la base de datos, es usar un Pool de conexiones.

Realizar una consulta


Para realizar cualquier acción sobre la base de datos (consulta, insertar nuevos registros, modificar los existentes o borrar), necesitamos una clase Statement. Para obtenerla, se le pide dicha clase a la conexión. La forma de hacerlo, para una consulta, es la siguiente:

// Preparamos la consulta
Statement s = conexion.createStatement();
ResultSet rs = s.executeQuery ("select * from persona");


La parte de createStatement() no tiene ningú secreto, salvo que puede lanzar una excepción que hay que capturar.

El Statement obtenido tiene un método executeQuery(). Este método sirve para realizar una consulta a base de datos.
  • El parámetro que se pasa en un String en el que está la consulta en lenguaje SQL. No hace falta terminarlo con punto y coma. En nuestro caso "select * from persona". siendo persona el nombre que hemos puesto a la tabla en la base de datos.
  • El resultado nos lo devuelve el método como un ResultSet. Este ResultSet no es más que una clase java similar a una lista en la que está el resultado de la consulta. Cada elemento de la lista es uno de los registros de la base de datos. En realidad, ResulSet no contiene todos los datos, sino que los va consiguiendo de la base de datos según se van pidiendo. Por ello, el método executeQuery() puede tardar poco, pero el recorrer los elementos del ResultSet no es tan rápido. De esta forma se evita que una consulta que dé muchos resultados tarde mucho tiempo y llene la memoria del programa java.

 

Leer los resultados 

 

El ResultSet contiene dentro los registros leidos de la base de datos. Inicialmente, tal cual nos lo devuelve el Statement.executeQuery(), tiene internamente un "puntero" apuntando justo delante del primer registro. El método next() del ResultSet hace que dicho puntero avance al siguiente registro, en este caso, al primero. Si lo consigue, el método next() devuelve true. Si no lo consigue (no hay siguiente registro que leer), devuelve false.

Por tanto, una forma de ir leyendo los registros en meternos en un while.  
// Recorremos el resultado, mientras haya registros para leer, y escribimos el resultado en pantalla.
while (rs.next())
{
    System.out.println (rs.getInt (1) + " " + rs.getString (2)+ " " + rs.getDate(3));
}

Una vez que el "puntero" está apuntando a un registro, los métodos getInt(), getString(), getDate(), etc nos van devolviendo los valores de los campos de dicho registro. Podemos pasar a estos métodos un índice (que comienza en 1) para indicar qué columna de la tabla de base de datos deseamos. También podemos usar un String con el nombre de la columna (tal cual está en la tabla de base de datos).

Es responsabilidad nuestra saber qué tipo de dato hay en cada columna, aunque si nos equivocamos y RecordSet es capaz de hacer la conversión, la hará por nosotros. Por ejemplo, en cualquiera de los campos anteriores podemos pedir un getString() y nos devolveran los números como String y la fecha como String.
También podemos usar getObject(), y el RecordSet nos devolverá el Object más adecuado para el tipo de campo que pedimos.

Cerrar la conexión

 

Una vez que terminamos de usar la conexión, se debería cerrar, o bien terminar el programa, con lo que se cierra automáticamente.

// Cerramos la conexion a la base de datos.
conexion.close();

 

El ejemplo:

 /*

* PruebaMySQL.java
*
* Programa de prueba para conexión a una base de datos de MySQL.
* Presupone que el servidor de base de datos está arrancado, disponible,
* en el puerto por defecto.
* El usuario y password de conexión con la base de datos debe cambiarse.
* En la base de datos se supone que hay una base de datos llamada prueba y que
* tiene una tabla persona con tres campos, de esta manera:
* mysql> create database prueba;
* mysql> use prueba;
* mysql> create table persona (id smallint auto_increment, nombre varchar(60), 
 *      nacimiento date, primary key(id)); 
 */
 
//package chuidiang.ejemplos.base_datos;
 
import java.sql.*;
 
/**
* Clase de prueba de conexión con una base de datos MySQL
*/
public class PruebaMySQL {
    
    /** 
     * Crea una instancia de la clase MySQL y realiza todo el código 
     * de conexión, consulta y muestra de resultados.
     */
    public PruebaMySQL() 
    {
        // Se mete todo en un try por los posibles errores de MySQL
        try
        {
            // Se registra el Driver de MySQL
            DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());
            
            // Se obtiene una conexión con la base de datos. Hay que
            // cambiar el usuario "root" y la clave "la_clave" por las
            // adecuadas a la base de datos que estemos usando.
            Connection conexion = DriverManager.getConnection (
                "jdbc:mysql://localhost/prueba","root", "la_clave");
            
            // Se crea un Statement, para realizar la consulta
            Statement s = conexion.createStatement();
            
            // Se realiza la consulta. Los resultados se guardan en el 
            // ResultSet rs
            ResultSet rs = s.executeQuery ("select * from persona");
            
            // Se recorre el ResultSet, mostrando por pantalla los resultados.
            while (rs.next())
            {
                System.out.println (rs.getInt ("Id") + " " + rs.getString (2)+ 
                    " " + rs.getDate(3));
            }
            
            // Se cierra la conexión con la base de datos.
            conexion.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    
    /**
     * Método principal, instancia una clase PruebaMySQL
     *
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
        new PruebaMySQL();
    }
    
}

JAVA 30. LO BÁSICO DE MYSQL CON JAVA

Una vez instalada la base de datos, MySQL en nuestro ejemplo, vamos a ver de forma rápida como podemos conectarnos con ella y ejecutar los comandos SQL básicos: SELECT, INSERT, UPDATE y DELETE.
También, por si acaso, crearemos desde Java la tabla de base de datos que vamos a usar y la borraremos.

EL DRIVER CON LA BASE DE DATOS


Lo primero que necesitamos para conectarnos con una base de datos es un Driver (o Connector) con ella. Ese Driver es la clase que, de alguna forma, sabe cómo hablar con la base de datos. Desgraciadamente (y hasta cierto punto es lógico), java no viene con todos los Drivers de todas las posibles bases de datos del mercado. Debemos ir a internet y obtener el Driver, normalmente en la página de nuestra base de datos.

Tendremos que poner ese jar accesible en nuestro proyecto. Dependiendo de qué utilicemos para programar en java hay muchas opciones.
  • Guardarlo en la carpeta <DIRECTORIO_DE_JAVA>/jre/lib/ext. Si has hecho una instalación por defecto en Windows, estará en C:\Archivos de Programa\Java\jdk1.5.0_05\jre\lib\ext. Esta es la carpeta en la que java nos deja poner jar adicionales para que se encuentren por defecto. Es buena idea ponerlo aquí si vamos a hacer muchos programas con base de datos. Si solo vamos a hacer uno, es mejor no ponerlo aquí. Si decidimos usar esta carpeta, también debemos tener la precaución de ir retirando jars de versiones antiguas cuando pongamos las nuevas, o tendremos problemas.
  • Añadirlo en nuestro IDE. En el ejemplo de eclipse, damos con el botón derecho del ratón sobre el proyecto, para sacar el menú y elegimos "properties"->"java build path"->"Libraries"->"Add external JARs..." y seleccionamos nuestro jar.

 

CONECTARNOS CON LA BASE DE DATOS


Una vez que java tiene el jar accesible y sabe dónde encontrarlo, ya podemos empezar con el código. Lo primero es conectarse con la base de datos

El código puede ser como este:

import java.sql.Connection;
import java.sql.DriverManager;
...
try
{
   Class.forName("com.mysql.jdbc.Driver");
   Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", "LA_PASSWORD");
   ...

En primer lugar hemos hecho los import adecuados para poder obtener la conexión. 

Luego hay que asegurarse de que se inicializa el Driver y se registra. Para ello hay dos opciones. Hacer un new de él o bien instanciarlo con Class.forName("nombre de clase"), que es como hacer el new, pero de una forma rara.

La ventaja de hacerlo con Class.forName() es que sólo necesitaremos el Driver de una base de datos si lo usamos. Imagina que haces un programa que permite permite conectarse con varias bases de datos distintas: MySQL, PostGres, Oracle, etc. En algún sitio damos a elegir al usuario qué tipo de base de datos tiene.

Si hacemos new de los Driver, tendremos que hacer unos if para en función de la elegida, hacer new de uno o de otro. El problema es que en nuestro código estarán los import y los new de todos los Driver de todas las bases de datos necesaras, los vayamos a usar o no. El programa no compilará y no correrá si no tiene todos los Driver accesibles.


/* Todos estos import son necesarios para que compilen los news correspondientes */
import driver_de_mysql;
import driver_de_postgres;
import driver_de_oracle;
...
if (ha_elegido_mysql)
   new driver_de_mysql();
if (ha_elegido_postgres)
   new driver_de_postgres();
if (ha_elegido_oracle)
   new driver_de_oracle();

Sin embargo, con Class.forName() no necesitamos el import. Haremos los mismos if de antes, pero usaremos simplemente String distintos para llamar a Class.forName(). No necesitamos los import y no necesitamos los jar con los Driver, salvo el jar con el Driver que realmente elija el usuario. Es cosa suya tener instalado SU driver de SU base de datos.

/* No hacen falta imports */
...
if (ha_elegido_mysql)
   Class.forName("driver_de_mysql");
if (ha_elegido_postgres)
   Class.forName("driver_de_postgres");
if (ha_elegido_oracle)
   Class.forName("driver_de_oracle");


Una vez que nos hemos asegurado que java tiene el Driver cargado, simplemente pediremos conexión con la base de datos a la clase DriverManager.

Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", "LA_PASSWORD");

DriverManager tiene muchos métodos getConnection() con parámetros variados. Todos son variantes de lo mismo y la información que suministramos es la misma. Aquí hemos utilizado uno con tres parámetros String, que vamos a explicar.
  • url: Es una cadena que nos permite localizar la base de datos. Para mysql, el formato es "jdbc:mysql://ordenador_donde_corre_la_base_de_datos/nombre_base_datos". Donde se pone el nombre o IP del ordenador en el que se encuentra nuestro servidor de base de datos y el nombre de la base de datos. En nuestro ejemplo, tenemos el servidor de base de datos corriendo en el mismo ordenador que el programa java, por lo que ponemos localhost. La base de datos la he llamado agenda. El comando SQL para crear la base de datos agenda sería
mysql> CREATE DATABASE agenda;
  • user: Un usuario válido para la base de datos.
  • password: La clave del usuario.
Si todo va bien, tendremos nuestra conexión a la base de datos. Si va mal, saltará una excepción. Por eso es importante (y obligatorio para que compile) meter todo esto en un try-catch.

Esta forma de obtener una conexión está bien para apliaciones sencillas, en el que únicamente se establece una conexión con la base de datos, no hay muchos hilos trabajando, etc. Si nuestra aplicación es algo más compleja/seria, en el que varios hilos pueden trabjar simultáneamente, en vez de obtner las conexiones directamente con DriverManager.getConnection(), es mejor obtenerlas a través de un Pool de Conexiones.

 

Creamos la tabla en Base de Datos ... y la borramos.

 

Para enviar comandos SQL a la base de datos, se usa la clase Statement de java. Esta clase se obtiene a partir de la conexión, de esta forma:

Statement st = conexion.createStatement();

por supuesto, dentro de un try-catch.

Statement tiene muchos métodos, pero hay dos interesentantes: executeUpdate() y executeQuery(). El primero se usa para sentencias SQL que impliquen modificaciones en la base de datos (INSERT, UPDATE, DELETE, etc). El segundo sólo para consultas (SELECT y similares).

Nuestra creación de tabla afecta a la base de datos, así que con executeUpdate().

st.executeUpdate("CREATE TABLE contacto (id INT AUTO_INCREMENT, PRIMARY KEY(id), nombre VARCHAR(20), apellidos VARCHAR(20), telefono VARCHAR(20))");

Esto crea una tabla contacto con cuatro campos: id, nombre, apellidos y telefono.

Para borrar la tablita esta, lo mismo, pero con DROP en vez de CREATE.

st.executeUpdate("DROP TABLE contacto");

Insertar datos en la base de datos

 

Vamos a hacer un esfuerzo de imaginación y supongamos que no hemos borrado la tabla contacto, que sigue existiendo en base de datos. Vamos a meterle datos.

String nombres[]={"Juan","Pedro","Antonio"};
String apellidos[]={"Gomez","Lopez","Alvarez"};
String telefonos[]={"123","456","789"};
...

for (int i=0;i<nombres.length;i++)
   st.executeUpdate("INSERT INTO contacto (nombre, apellidos, telefono) VALUES ('"+nombres[i]+"','"+apellidos[i]+"','"+telefonos[i]+"' )");

también en un try-catch.

He puesto los datos a insertar en unos arrays. Tú puedes recogerlos de un sitio con más sentido. Por ejemplo, si es una agenda de contactos, lo mejor es pedírselos al usuario. Yo, por simplicidad y porque para el ejemplo esta mejor, los pongo en un array y con un bucle los voy insertando.

Fíjate que la sentencia INSERT se va componiendo a base de sumar cadenas. Sería más eficiente con un StringBuffer, pero así se simplifica algo el ejemplo.

Fíjate que en el INSERT metemos comillas simples para los valores de cadenas, es decir, en nombre, apellidos y telefono. El INSERT sería, de verdad, así

INSERT INTO contacto (nombre, apellidos, telefono) VALUES ('Juan', 'Gomez', '123');

Ahí se ven más claras las comillas simples para los datos que definimos como VARCHAR en la creación de la tabla, es decir, Juan, Gomez y 123. Por eso en el código las hemos puesto

...VALUES ('"+nombres[i]+"','"...

Si fuesen datos numéricos no harían falta, son cosas de SQL, pero tenemos que tener cuidado de componerlas bien.

Consultar datos de la base de datos

 

Vamos a hacer ahora una consulta de los datos que acabamos de insertar en la base de datos. Las consultas se hacen con executeQuery() y nos devolverán un

ResultSet.

El ResultSet de alguna forma representa una conexión hacia los datos. En el ResultSet NO están todavía los datos. Según se los vayamos pidiendo, los irá trayendo de base de datos. Esto quiere decir que si una consulta devuelve muchos resultados, no se nos va a llenar la memoria por el hecho de hacer la consulta.
Para traer el primer resultado, debemos llamar el método next() del ResulSet. Para el siguiente otro next() y así sucesivamente hasta que next() devuelva false, indicando que ya no quedaban datos. El código puede ser así

ResultSet rs = st.executeQuery("SELECT * FROM contacto");

while (rs.next())
{
   System.out.println("nombre="+rs.getObject("nombre")+
      ", apellidos="+rs.getObject("apellidos")+
      ", telefono="+rs.getObject("telefono"));
}
rs.close();

Hemos hecho un SELECT para obtener los datos. Luego un bucle while(rs.next()), es decir, mientras next() vaya trayendo resultados.

Después de next(), el resultado recién traido está disponible en el ResulSet. La forma de recoger los campos es pedirlos con algún método get(). Si sabemos de qué tipo es el dato, podemos pedirlo con getInt(), getString(), etc. Si no lo sabemos o nos da igual (como en este caso), bastará con un getObject(), capaz de traer cualquier tipo de dato.

En estos métodos get() podemos pasar como parámetro un entero, empezando en 1, que es el número del campo en el SELECT. Es decir, si hacemos SELECT campo1, campo2, campo3 ..., si pedimos getObject(1) obtenemos el valor de campo1, para getObject(2) el de campo2, etc.
Otra opción que a mi me gusta más, es pasar el nombre del campo, como se muestra en el código. Así, en el ejemplo de antes, getObject("campo1") nos devuelve el valor del campo1.

Update en la base de datos

 

Para UPDATE usamos executeUpdate(). Vamos a cambiar el número de teléfono de Juan. Ya que en la tabla hemos puesto un campo id, vamos primero a obtener el id de Juan para luego usarlo en el UPDATE. Esto no tiene por qué ser así, es sólo el ejemplo.

Para obtener el id:

rs = st.executeQuery("SELECT id FROM contacto WHERE nombre='Juan'");
rs.next();
int id = rs.getInt("id");

Es un SELECT para obtener el campo id de Juan. Con rs.next() hacemos que venga el primer resultado de la consulta (y único en nuestro ejemplo). Como sabemos que es un INT, lo recogemos con getInt() y lo guardamos.

Para hacerlo bien, deberíamos ver si rs.next() devuelve o no resultado (quizás no haya nadie que se llame Juan en la base de datos) o si devuelve más de uno (más de un Juan en la base de datos), pero no vamos a complicarnos la vida en este ejemplo sencillo.

Ahora, sabiendo el id, podemos hacer el UPDATE.

st.executeUpdate("UPDATE contacto SET telefono='111' WHERE id="+id);
Esta vez, como el campo id es numérico, no hemos puesto las comillas simples.
 

Borrar datos de la base de datos

 

El borrado se hace con DELETE y executeUpdate(). Vamos a borrar a Pedro, que nos hemos peleado con él. Obtenemos primero su id, igual que antes.

rs = st.executeQuery("SELECT id FROM contacto WHERE nombre='Pedro'");
rs.next();
id = rs.getInt("id");
y ahora lo borramos
st.executeUpdate("DELETE FROM contacto WHERE id="+id);

Cerramos conexiones

 

Los Connection, Statement y ResultSet con conexiones abiertas con base de datos. Debemos cerrarlas.
ResultSet se cierra solo cuando hacemos otra llamada execute() al Statement del que obtuvimos este ResultSet o bien cuando el recolector de basura "recolecta" al ResultSet. No nos preocupa en principio que se quede abierto, porque se acabará cerrando solo.

Eso sí, no podemos hacer nada con el Statement hasta que hayamos terminado con el ResultSet o se nos cerrará. Si necesitamos realizar otra cosa con base de datos, debemos crear otro Statement distinto.

Cuando terminemos con el Statement, lo cerramos con st.close().
Cuando terminemos con la Connection, la cerramos con conexion.close().
 

JAVA 29. INSTALACIÓN DE MYSQL EN WINDOWS

Lo primero, descargarse MySQL de algún sitio.

Instalación:

Ejecuto el Setup.exe. Me sale una ventana que me permite elegir instalación por defecto o personalizada. Elijo instalación a medida, más que nada por ir viendo que opciones. 

Aparece un arbol con las cosas a instalar. Dejo lo que viene por defecto, aunque veo que se pueden instalar ficheros de cabecera .h y librerías para poder acceder a MySQL desde C. Es un detalle a tener en cuenta. También elijo el directorio de instalación. 

Pregunta si quiero configurar MySQL durante la instalación. Le contesto que sí. Selecciono "configuración detallada", que es la que viene por defecto. 

Me da a elegir tres posibles tipos de máquina en la que instalar MySQL. Elijo la opción de máquina para desarrollo, que es la opción por defecto. Supuestamente el servidor MySQL en una máquina de desarrollo se configura de forma que consuma pocos recursos. 

Me da a elegir el tipo de base de datos. Elijo base de datos multifuncional. 

Me da a elegir la ubicación de las tablas de la base de datos. Dejo el directorio por defecto. 

Me da a elegir el número de conexiones que va a admitir la base de datos. Dejo DSS/OLAP, para pocas conexiones, que es la opción por defecto. 

Habitlio acceso a través de tpc/ip que está marcado por defecto y con el puerto por defecto 3306
Juego de caracteres por defecto. 

Elijo instalar con servicio de windows y que lo lance automáticamente, todo ello está por defecto. 

Le marco, que no lo estaba, para que incluya en el path tanto el cliente como el servidor de MySQL, y asi poder llamarlo desde línea de comandos. Esto es necesario para que otros programas (por ejemplo, un servidor apache con php) encuentren las librerías de MySQL cuando las necesiten. 

Elijo pasword de root y dejo el resto por defecto (no acceso en remoto al root y no creo cuenta anónima). 

He tenido que conectar a internet para que no fallara en la última parte de la instalación. No sé muy bien si es porque MySQL intenta acceder a Internet para algo o símplemente, porque como se instala como servicio, tiene que abrir un puerto de escucha de internet.

Creación de una base de datos, una tabla y un registro de prueba 

 

Aunque MySQL crea una base de datos de prueba que llama "test", decido crearme mi propia base de datos, con mi propia tabla y un registro en ella. 

Una vez instalado, me voy al menú de " inicio", "programas", "mysql", "MySQL Server 4.1",  "MySQL Command Line Client". Me sale una ventanita negra que me pide el password y trata de acceder a internet. como la conexión es a través de red, necesita el acceso a internet. Meto la password de root/administrador que puse al instalar y me sale un "prompt" de MySQL

Voy a crear una base de datos, con una tabla y una entrada de datos para poder acceder desde java.

mysql> create database prueba;
mysql> use prueba;
mysql> create table persona (id smallint auto_increment, nombre varchar(60), nacimiento date, primary key(id));
mysql> insert persona values (NULL, 'Pedro', '1995-09-12');

JAVA 28. INSTALAR ECLIPSE SQL EXPLORER EN ECLIPSE JAVA

se indicara cómo instalar y configurar Eclipse SQL Explorer. Se trata de un plugin gratuito / free para Eclipse que permite acceder y manipular bases de datos (Oracle, MySQL, SQL Server, etc) desde el propio IDE de Eclipse (perspectiva).

Instalación y configuración de Eclipse SQL Explorer en Eclipse (Java) 

En primer lugar necesitaremos tener instalado Eclipse. se explicara como integrar Eclipse SQL Explorer en el IDE de Eclipse (Perspectiva). Se trata de un plugin de código fuente abierto, disponible en:

http://sourceforge.net/projects/eclipsesql

Que permite la manipulación de bases de datos desde el propio Eclipse (ejecutar consultas SQL de todo tipo mostrando el resultado (SQL Results), estructura de la base de datos (Database structure), detalles de la base de datos (Database Details), historia del SQL ejecutado (SQL History), admite múltiples conexiones a múltiples motores de base de datos (Axion, HSQLDB, IBM DB2, InstantDB, InterClient, Firebird, Microsoft SQL Server, Mimer SQL, MySQL, Oracle, Pointbase, PostgreSQL, Progress OpenEdge, SAPDB, Sunopsis XML, Sybase, ThinkSQL, etc). 

Lo descargaremos desde la web anterior, será un fichero .zip que descomprimiremos en la carpeta de instalación de Eclipse (en nuestro caso C:/eclipse), se descomprimirá la carpeta net.sourceforge.sqlexplorer_3.0.0.20060901 dentro de plugins. Si tenemos abierto Eclipse lo cerraremos y lo volveremos a abrir.

Para poder visualizar la perspectiva de SQL Explorer en Eclipse, abriremos Eclipse y pulsaremos en "Ventana" - "Abrir perspectiva" - "Otros...":


 

En la ventana "Abrir perspectiva" seleccionaremos "SQL Explorer" y pulsaremos "Aceptar": 



El IDE de Eclipse mostrará este aspecto:



Como ejemplo de utilización de Eclipse SQL Explorer utilizaremos una conexión de una base de datos MySQL, para ello descargaremos e instalaremos (con descomprimirlo es suficiente) el Connector/J de MySQL (JDBC), para ello accederemos a:

http://dev.mysql.com/downloads/connector/j/5.1.html 

Descomprimiremos el fichero JDBC descargado anteriormente en cualquier carpeta, en nuestro caso en

C:/eclipse/mysql-connector-java-5.1.0

Para acceder a MySQL desde Eclipse con SQL Explorer y el JDBC abriremos Eclipse, en la ventana "Connections" pulsaremos en el primer botón "Create New Connection Profile": 



En la ventana de "Create New Connection Profile" introduciremos los siguientes datos:
  • Name: el nombre del nuevo perfil de conexión, por ejemplo "pruebaConexionMySQL"
  • Driver: en el desplegable nos aparecerán drivers por defecto, en nuestro caso, vamos a utilizar el JDBC descargado anteriormente, para ello pulsaremos en "New Driver":
Le pondremos un nombre al nuevo driver en "Name", por ejemplo "mMySQL", introduciremos el ejemplo de URL en "Example URL": jdbc:mysql://localhost/test. Pulsaremos en la pestaña / solapa "Extra Class Path" y pulsaremos en el botón "Add" que aparece en la parte derecha de la ventana:

Seleccionaremos la ubicación del driver JDBC descargado anteriormente de la web de MySQL, en concreto el fichero .jar: mysql-connector-java-5.1.0-bin.jar:


Por último en la ventana de "Create New Driver" indicaremos (en el desplegable que aparece en la parte inferior de la ventana) el "Driver Class Name": com.mysql.jdbc.Driver. Pulsaremos "Aceptar" para volver a la ventana "Create New Connection Profile":

 
  • En "Driver" seleccionaremos el anteriormente dado de alta "mMySQL".
  • URL: jdbc:mysql://localhost/test (donde "localhost" será el nombre o la IP del servidor de MySQL, "test" será el nombre de la base de datos (esquema) de MySQL al que nos conectaremos.
  • User Name: nombre de usuario de la base de datos con el que nos conectaremos.
  • Password: contraseña del usuario de la bd.
  • Auto Logon: marcaremos esta opción si hemos introducido usuario y contraseña y queremos que la conexión se realice de forma automática, sin pedir estos datos.
  • Open on Startup: marcaremos este check para conectar directamente con el driver indicado al abrir el entorno Eclipse SQL Explorer.
Tras rellenar todas las opciones pulsaremos en "Aceptar" para crear el nuevo perfil de conexión: 


Para realizar una conexión pulsaremos con el botón derecho del ratón sobre el perfil de conexión creado "pruebaConexionMySQL" y seleccionaremos "Connect":


Indicaremos usuario y contraseña y pulsaremos "Aceptar": 


Mostrará una Eclipse SQL Explorer mostrará una ventana indicando el proceso de la conexión:


Para realizar una prueba añadiremos una consulta SQL para crear la tabla de prueba "clientes". Esto lo haremos añadiendo en la ventana SQL Editor del IDE de Eclipse SQL Explorer la siguiente consulta SQL:
create table clientes 
(
  codigo varchar(5) primary key,
  fecha date,
  nombre varchar(90) not null unique,
  cif varchar(15) not null unique,
  tipo varchar(10) default "Cliente",
  ccc varchar(20)
)

Para ejecutarla pulsaremos sobre el icono "Execute SQL" o con la combinación de teclas "Control + Intro": 



Insertaremos algún registro con la siguiente sentencia SQL:
insert into clientes (codigo, nombre, cif, tipo, ccc) 
values ('00001', 'Fernando Alonso','111222333V',
'Contado','28000550002020202')


 

Podremos ver el contenido de la tabla ejecutando la siguiente consulta SQL :
select * from clientes
Incluso podremos exportar el resultado a .xls (Excel), csv, html): 



Con Eclipse SQL Explorer también podremos ver en forma de árbol todos los esquemas de nuestro servidor MySQL con todas las tablas y sus campos, índices, procedimientos, etc. Utilzando para ello "Database Structure": 




En la ventana "Database detail" podremos ver todos los datos posibles del esquema y tabla seleccionados en "Database Structure": vista previa de todos los registros y campos (Preview), número de registros (Row count), claves primarias (Primary Keys), claves exportadas/foráneas (Exported Keys), índices (Indexes), privilegios (Priviliges), privilegios de columna (Column Priviliges), Row Ids, Versions, etc: 



Con lo cual Eclipse SQL Explorer se convierte en una herramienta sumanente útil para realizar aplicaciones con acceso a base de datos. Permite de una forma rápida ejecutar consultas SQL, mostrar los resultados, ver la estructura de las tablas, etc.

domingo, 22 de mayo de 2011

JAVA 27. EXPORTAR UN PROYECTO ECLIPSE COMO UN JAR EJECUTABLE

Este tutorial muestra cómo exportar una aplicación Java como un archivo .jar ejecutable en Eclipse 3.6 (Helios). Tras la exportación, podremos ejecutar el código java desde la línea de comandos de la siguiente manera:


java -jar aplicacion.jar
 
Una aplicación Java dispone de al menos una clase con el método main. Para poder generar un fichero jar ejecutable, es necesario, por tanto, que exista una clase con un método main. Además, primero deberemos disponer de una configuración de ejecución en Eclipse para esa clase. Las configuraciones de ejecución son las que aparecen al seleccionar el menú Run > Run Configurations... 

Cuando ejecutamos una aplicación Java desde Eclipse, automáticamente se añade una configuración de ejecución para dicha aplicación. Esta configuración indica cuál es la clase con main que queremos ejecutar, además de otra información como parámetros de la aplicación, parámetros de la máquina virtual, etc. 

 

Para exportar una aplicación como un jar ejecutable es necesario disponer de una configuración de ejecución para la aplicación. La forma más sencilla de disponer de esta configuración es simplemente ejecutando la aplicación. Una vez hecho esto, tenemos que seleccionar la opción Export... del menú File. En el cuadro de diálogo que nos aparece seleccionamos Runnable jar file en la categoría Java.



A continuación se nos pide la configuración de ejecución que queremos utilizar. Seleccionamos la apropiada a nuestra aplicación de la lista e indicamos dónde queremos guardar el jar generado. Si nuestra aplicación incluye otras librerías Java (otros jar), seleccionar la opción Extract required libraries into generated jar.





Una vez que pulsemos Finish, Eclipse generará el fichero jar a partir de la información que le hemos proporcionado. Si java está en el path, puedes navegar hasta el directorio donde exportaste el fichero en una consola y escribir:

java -jar fichero.jar


La aplicación se ejecutará.

martes, 17 de mayo de 2011

JAVA 26. MEJORANDO INTERFAZ GRAFICA

COLORES DE FONDO Y DE TEXTO

La clase Component proporciona dos métodos para modificar el color de un Componente. A través de los métodos setBackground() y setForeground(), se pueden indicar los colores del fondo y del texto, respectivamente:

Clase:  import java.awt.color;

 
label1 = new JLabel("Sumar");
text1 = new JTextField("Restar"); 
text1.setBackground( Color.blue );
label1.setForeground( Color.red );
 
 
FUENTE
                               
Cambiemos el font de caracteres a Times Roman de 12 puntos
 
Clase: import java.awt.font;
 
label1.setFont( new Font( "TimesRoman",Font.PLAIN,12 ) );
label1.setFont( new Font( "TimesRoman",Font.BOLD,24 ) );
label1.setFont( new Font("Helvetica",Font.ITALIC,12) );
 

IMAGENES

Atributo: ImageIcon imagen = new ImageIcon("C:/holamu.gif");

   
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Color;

import java.awt.event.*;
public class Formulario extends JFrame {
      ImageIcon imagen = new ImageIcon("C:/holamu.gif");
         
    private JLabel label1;
    public Formulario() {
        setLayout(null);
        label1=new JLabel(imagen);
        label1.setBounds(10,20,350,350);
        add(label1);
    }
     
        public static void main(String[] ar) {
        Formulario formulario1=new Formulario();
        formulario1.setBounds(0,0,400,500);
        formulario1.setVisible(true);
       
    }
}

 
VENTANAS Y COLABORACION ENTRE VENTANAS

  
importe:
import javax.swing.WindowConstants;

Ejemplo:

import javax.swing.*;
import java.awt.Window;
import java.awt.event.*;
public class Formulario1 extends JFrame implements ActionListener{
    private JButton boton1,boton2,boton3,boton4;
    private JLabel label1,label2,label3;
    public Formulario1() {
        setLayout(null);
        boton1=new JButton("1");
        boton1.setBounds(10,100,90,30);
        add(boton1);
        boton1.addActionListener(this);
        boton2=new JButton("2");
        boton2.setBounds(110,100,90,30);
        add(boton2);
        boton2.addActionListener(this);
        boton3=new JButton("3");
        boton3.setBounds(210,100,90,30);
        add(boton3);
        boton3.addActionListener(this);
        label1=new JLabel("label de la ventana 1");
        label1.setBounds(10,10,200,30);
        label2=new JLabel("label de la ventana 2");
        label2.setBounds(10,10,200,30);
        label3=new JLabel("label de la ventana 3");
        label3.setBounds(10,10,200,30);
        boton4=new JButton("4");
        boton4.setBounds(210,100,90,30);
        boton4.addActionListener(this);
    }
   
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==boton1) {
            setTitle("boton 1");
            JFrame frame1 = new JFrame("Ventana Emergente 1");
            frame1.setLayout (null);
            frame1.add(label1);
            //frame1.pack();
            frame1.setVisible(true);
            frame1.setSize(400,500);
        }
        if (e.getSource()==boton2) {
            setTitle("boton 2");
            JFrame frame2 = new JFrame("Ventana Emergente 2");
            frame2.setLayout (null);
            frame2.add(label2);
            //frame1.pack();
            frame2.setVisible(true);
            frame2.setSize(400,600);
           
        }
        if (e.getSource()==boton3) {
            setTitle("boton 3");
            JFrame frame3 = new JFrame("Ventana Emergente 2");
            frame3.setLayout (null);
            frame3.add(label3);
            //frame1.pack();
            frame3.setVisible(true);
            frame3.setSize(400,700);
            frame3.add(boton4);
       
        }       
        if (e.getSource()==boton4) {
            setTitle("boton 4");
            JFrame frame4 = new JFrame("Ventana Emergente 4");
            frame4.setLayout (null);
           
            //frame1.pack();
            frame4.setVisible(true);
            frame4.setSize(400,700);
           
       
        }       
       
    }
   
      public static void main(String[] ar){
        Formulario1 formulario2=new Formulario1();
        formulario2.setBounds(0,0,350,200);
        formulario2.setVisible(true);
    }
}


CUADROS DE DIALOGO


//título e icono por defecto

JOptionPane.showMessageDialog(null,"Texto del mensaje.");

//título personalizado, icono de aviso

JOptionPane.showMessageDialog(null,
"Texto del mensaje.",
"Título del marco",
JOptionPane.WARNING_MESSAGE);

//título personalizado, icono de error

JOptionPane.showMessageDialog(null,
"Texto del mensaje.",
"Título del marco",
JOptionPane.ERROR_MESSAGE);

//título personalizado, sin icono

JOptionPane.showMessageDialog(null,
"Texto del mensaje.",
"Título del marco",
JOptionPane.PLAIN_MESSAGE);

martes, 10 de mayo de 2011

JAVA 25. APPLETS EN JAVA

Un applet es una pequeña aplicación accesible en un servidor Internet, que se transporta por la red, se instala automáticamente y se ejecuta in situ como parte de un documento web.

Un applet es una mínima aplicación Java diseñada para ejecutarse en un navegador Web. Por tanto, no necesita preocuparse por un método main() ni en dónde se realizan las llamadas. El applet asume que el código se está ejecutando desde dentro de un navegador. El appletviewer se asemeja al mínimo navegador. Espera como argumento el nombre del fichero html que debe cargar, no se le puede pasar directamente un programa Java.

<HTML>
    <APPLET CODE=HolaMundo.class WIDTH=300 HEIGHT=100>
    </APPLET>
</HTML>

CICLO DE VIDA DE UN APPLET

 


Cuando un applet se carga en el appletviewer, comienza su ciclo de vida, que pasaría por las siguientes fases:
  • Se crea una instancia de la clase que controla el applet. En el ejemplo de la figura anterior, sería la clase HolaMundo.
  • El applet se incializa.
  • El applet comienza a ejecutarse.
  • El applet empieza a recibir llamadas. Primero recibe una llamada init (inicializar), seguida de un mensaje start (empezar) y paint (pintar). Estas llamadas pueden ser recibidas asíncronamente.


METODOS DE APPLETVIEWER


Vamos a utilizar como excusa la función asociada al appletviewer de los siguientes métodos para adentrarnos en su presentación,  porque también son los métodos propios de la clase Applet.

init()
El método init() se llama cada vez que el appletviewer carga por primera vez la clase. Si el applet llamado no lo sobrecarga, init() no hace nada. Fundamentalmente en este método se debe fijar el tamaño del applet, aunque en el caso de Netscape el tamaño que vale es el que se indique en la línea del fichero html que cargue el applet. También se deben realizar en este método las cargas de imágenes y sonidos necesarios para la ejecución del applet. Y, por supuesto, la asignación de valores a las variables globales a la clase que se utilicen. En el caso de los applet, este método únicamente es llamado por el sistema al cargar el applet.

start()
start() es la llamada para arrancar el applet cada vez que es visitado. La clase Applet no hace nada en este método. Las clases derivadas deben sobrecargarlo para comenzar la animación, el sonido, etc. Esta función es llamada automáticamente cada vez que la zona de visualización en que está ubicado el applet se expone a la visión, a fin de optimizar en uso de los recursos del sistema y no ejecutar algo que no puede ser apreciado (aunque el programador puede variar este comportamiento y hacer que un applet siga activo aun cuando esté fuera del área de visión). Esto es, imaginemos que cargamos un applet en un navegador minimizado; el sistema llamará al método init(), pero no a start(), que sí será llamado cuando restauremos el navegador a un tamaño que permita ver el applet. Naturalmente, start() se puede ejecutar varias veces: la primera tras init() y las siguientes (porque init() se ejecuta solamente una vez) tras haber aplicado el método stop().

stop()
stop() es la llamada para detener la ejecución del applet. Se llama cuando el applet desaparece de la pantalla. La clase Applet tampoco hace nada en este método, que debería ser sobrecargado por las clases derivadas para detener la animación, el sonido, etc. Esta función es llamada cuando el navegador no incluye en su campo de visión al applet; por ejemplo, cuando abandona la página en que está insertado, de forma que el programador puede paralizar los threads que no resulten necesarios respecto de un applet no visible, y luego recuperar su actividad mediante el método start().
destroy()
El método destroy() se llama cuando ya no se va a utilizar más el applet, cuando se necesita que sean liberados todos los recursos dispuestos por el applet, por ejemplo, cuando se cierra el navegador. La clase Applet no hace nada en este método. Las clases derivadas deberían sobrecargarlo para hacer una limpieza final. Los applet multithread deberían utilizar destroy() para detener los threads que quedasen activos.
El appletviewer también contiene la clase Component (componente), que usa dos métodos para ayudas al applet a escribir en el espacio gráfico que el appletviewer le proporciona para su ejecución.

paint( Graphics g )
Es la función llamada cada vez que el área de dibujo del applet necesita ser refrescada. La clase Applet simplemente dibuja un rectángulo gris en el área, es la clase derivada, obviamente, la que debería sobrecargar este método para representar algo inteligente en la pantalla. Cada vez que la zona del applet es cubierta por otra ventana, se desplaza el applet fuera de la visión o el applet cambia de posición debido a un redimensionamiento del navegador, el sistema llama automáticamente a este método, pasando como argumento un objeto de tipo Graphics que delimita la zona a ser pintada; en realidad se pasa una referencia al contexto gráfico en uso, y que representa la ventana del applet en la página web.

update( Graphics g )
Esta es la función que realmente se llama cuando se necesita una actualización de la pantalla. La clase Applet simplemente limpia el área y llama al método paint(). Esta funcionalidad es suficiente para la mayoría de los casos; aunque, de cualquier forma, las clases derivadas pueden sustituir esta funcionalidad para sus propósitos especiales. Es decir, en las situaciones detalladas anteriormente que dañan la zona de exposición del applet, el sistema llama al método paint(), pero en realidad la llamada se realiza al método update(), cuyo comportamiento establecido en la clase Component es llamar al método paint(), tras haber rellenado la zona del applet con su color de fondo por defecto. Pudiera parecer así que se trata de un método de efecto neutro, pero si la función paint() cambiara el color del fondo, podríamos percibir un flick de cambio de colores nada agradable. Por tanto, habrá que cuidarse por lo común, de eliminar este efecto de limpia primero, sobrecargando el método update(), para que llame únicamente a paint(). Otra solución sería insertar el código de pintado en una sobrecarga del método update() y escribir un método paint() que sólo llame a update(). La última solución pasaría por usar el mismo método setBackground( Color ), en el método init() para así evitar el efecto visual sin tener que sobrecargar el método update(). Estas son las mismas razones que aconsejan usar el método resize() inserto en init(), para evitar el mismo desagradable efecto.

repaint
Llamando a este método se podrá forzar la actualización de un applet, la llamada a update(). Pero hay que tener cierto cuidado, porque AWT posee cierta inteligencia (combinación casi siempre nefasta), de forma que si se llama a update() mediante repaint() con una frecuencia muy corta, AWT ignorará las llamadas a update() que estime oportuno, pues considera a esta función como un bien escaso.

Sinopsis

La llamada a appletviewer es de la forma:
   
 appletviewer [-debug] urls...


El appletviewer toma como parámetro de ejecución, o bien el nombre del un fichero html conteniendo el tag (marca) <APPLET>, o bien un URL hacia un fichero HTML que contenga esa marca.
Si el fichero html no contiene un tag <APPLET> válido, el appletviewer no hará nada. El appletviewer no muestra otras marcas html.
La única opción válida que admite la llamada a appletviewer es -debug, que arranca el applet en el depurador de Java, jdb. Para poder ver el código fuente en el depurador, se tiene que compilar el fichero .java con la opción -g.

Ejemplo de uso

En el ejemplo de llamada al appletviewer siguiente, hacemos que se ejecute el applet básico que crearemos en la sección siguiente y que lanzaremos desde un fichero html del mismo nombre que nuestro fichero de código fuente Java.

%appletviewer HolaMundo.html

Esta llamada lanzaría la ejecución de HolaMundo.class en el appletviewer, abriéndose en pantalla la ventana siguiente:




FUNCIONES DE MENU DE APPLETVIEWER

 

El appletviewer tiene un único menú mostrado en la imagen siguiente y que vamos a explicar en cada una de sus opciones, ya que lo usaremos a menudo cuando vayamos avanzando en nuestros conocimientos de Java.





  • Restart
La función Restart llama al método stop() y seguidamente llama de nuevo a start(), que es el método que ha lanzado inicialmente la ejecución del applet. Se puede utilizar Restart para simular el movimiento entre páginas en un documento html.
  • Reload
La función Reload llama al método stop() y luego al método destroy() en el applet actual. A continuación carga una nueva copia del applet y la arranca llamando al método start().
  • Clone
La función Clone crea una copia del applet actual en una ventana de appletviewer nueva. En realidad es un appletviewer idéntico con el mismo URL.
  • Tag
La función Tag muestra en una ventana hija del appletviewer el código html cargado para su ejecución. Es similar a la función View Source que figura en la mayoría de los navegadores, Netscape, Internet Explorer y HotJava incluidos.
  • Info
La función Info lee los comentarios de documentación contenidos en el fichero html y muestra la información de los parámetros (si la hay).
  • Properties
El appletviewer tiene las funciones básicas de presentación de un navegador y la función Properties (propiedades de la red) permite cambiar o establecer el modo de seguridad o fijar los servidores de proxy o firewall.
  • Close
La función Close llama al método destroy() de la ventana actual del appletviewer, teminando su ejecución.
  • Quit
La función Quit llama al método destroy() de cada una de las copias del appletviewer que se encuentren lanzadas, concluyendo la ejecución de todas ellas y terminando entonces el appletviewer.

UN APPLET BASICO EN JAVA

 

Vamos a comenzar la creación del código fuente del un applet que satisfaga nuestras necesidades. Recordamos que Java utiliza la extensión .java para designar los ficheros fuente.

 

HolaMundo


A continuación está el código fuente del applet HolaMundo, que es la versión applet de la mínima aplicación Java que antes habíamos escrito. Guardar este código en un fichero fuente Java como HolaMundo.java.
     
    //
    // Applet HolaMundo de ejemplo
    //
    import java.awt.Graphics;
    import java.applet.Applet;
    public class HolaMundo extends Applet {
        public void paint( Graphics g ) {
            g.drawString( "Hola Mundo!",25,25 ) ;
            }
        }
 

Componentes Básicos De Un Applet

El lenguaje Java implementa un modelo de Programación Orientada a Objetos. Los objetos sirven de bloques centrales de construcción de los programas Java. De la misma forma que otros lenguajes de programación, Java tiene variables de estado y métodos.
Veamos como se descompone un applet en sus piezas/objetos:
/*
Sección de importaciones
*/
public class NombreDelNuevoApplet extends Applet {
/*
Aquí se declaran las variables de estado (public y private)
*/
    
/*
Los métodos para la interacción con los objetos se 
declaran y definen aquí
*/
public void MetodoUno( parámetros ) {
/* 
Aquí viene para cada método, el código Java que 
desempeña la tarea.
Qué código se use depende del applet
*/
}
}
 
 
Para HolaMundo, se importan las dos clases que necesita. No hay variables de estado, y sólo se tiene que definir un método para que el applet tenga el comportamiento esperado.

El comando import carga otras clases dentro de nuestro código fuente. El importar una clase desde un paquete de Java hace que esa clase importada esté disponible para todo el código incluido en el fichero fuente Java que la importa. Por ejemplo, en el applet HolaMundo se importa la clase java.awt.Graphics, y podremos llamar a los métodos de esta clase desde cualquier método de nuestro programa que se encuentre en el fichero HolaMundo.java. Esta clase define una área gráfica y métodos para poder dibujar dentro de ella. La función paint() declara a g como un objeto de tipo Graphics; luego, paint() usa el método drawString() de la clase Graphics para generar su salida.

Se puede crear una nueva clase, en este caso HolaMundo, extendiendo la clase básica de Java: Applet. De esta forma, se hereda todo lo necesario para crear un applet. Modificando determinados métodos del applet, podemos lograr que lleve a cabo las funciones que deseamos.

    import java.applet.Applet;
    .  .  .
    public class HolaMundo extends Applet {


Métodos de Applet
La parte del applet a modificar es el método paint(). En la clase Applet, se llama al método paint() cada vez que el método arranca o necesita ser refrescado, pero no hace nada. En nuestro caso, lo que hacemos es:

    public void paint( Graphics g ) {
        g.drawString( "Hola Mundo!",25,25 );
        }

De acuerdo a las normas de sobrecarga, se ejecutará este último paint() y no el paint() vacío de la clase Applet. Luego, aquí se ejecuta el método drawString(), que le dice al applet cómo debe aparecer un texto en el  área de dibujo.

Otros métodos básicos para dibujar son:

    drawLine( int x1,int y1,int x2,int y2 )
    drawRect( int x,int y,int ancho,int alto )
    drawOval( int x,int y,int ancho,int alto )

Tanto para drawRect() como para drawOval(), las coordenadas (x,y) son la esquina superior izquierda del rectángulo (para drawOval, el óvalo es encajado en el rectángulo que lo circunscribe).

 

LA MARCA APPLET DE HTML


Dado que los applets están mayormente destinados a ejecutarse en navegadores Web, había que preparar el lenguaje HTML para soportar Java, o mejor, los applets. El esquema de marcas de HTML, y la evolución del estándar marcado por Netscape hicieron fácil la adición de una nueva marca que permitiera, una vez añadido el correspondiente código gestor en los navegadores, la ejecución de programas Java en ellos.
La sintaxis de las etiquetas <APPLET> y <PARAM> es la que se muestra a continuación y que iremos explicando en párrafos posteriores:

<APPLET CODE=  WIDTH=  HEIGTH= [CODEBASE=] [ALT=] 
[NAME=] [ALIGN=] [VSPACE=] [HSPACE=]>
<PARAM NAME=  VALUE= >
</APPLET>

Atributos obligatorios:
CODE : Nombre de la clase principal
WIDTH : Anchura inicial
HEIGHT : Altura inicial

Atributos opcionales:
CODEBASE : URL base del applet
ALT : Texto alternativo
NAME : Nombre de la instancia
ALIGN : Justificación del applet
VSPACE : Espaciado vertical
HSPACE : Espaciado horizontal

Los applets se incluyen en las páginas Web a través de la marca <APPLET>, que para quien conozca html resultará muy similar a la marca <IMG>. Ambas necesitan la referencia a un fichero fuente que no forma parte de la página en que se encuentran embebidos. IMG hace esto a través de SRC=parámetro y APPLET lo hace a través CODE=parámetro. El parámetro de CODE indica al navegador dónde se encuentra el fichero con el código Java compilado .class. Es una localización relativa al documento fuente.
si un applet reside en un directorio diferente del que contiene a la página en que se encuentra localizado, entonces no se indica un URL a esta localización, sino que se apunta al directorio del fichero .class utilizando el parámetro CODEBASE, aunque todavía se puede usar CODE para proporcionar el nombre del fichero .class.

Al igual que IMG, APPLET tiene una serie de parámetros que lo posicionan en la página. WIDTH y HEIGHT especifican el tamaño del rectángulo que contendrá al applet, se indican en pixels. ALIGN funciona igual que con IMG (en los navegadores que lo soportan), definiendo cómo se posiciona el rectángulo del applet con respecto a los otros elementos de la página. Los valores posibles a especificar son: LEFT, RIGHT, TOP, TEXTTOP, MIDDLE, ABSMIDDLE, BASELINE, BOTTOM y ABSBOTTOM. Y, finalmente, lo mismo que con IMG, se puede especificar un HSPACE y un VSPACE en pixels para indicar la cantidad de espacio vacío que habrá de separación entre el applet y el texto que le rodea.
APPLET tiene una marca ALT. La utilizaría un navegador que entendiese la marca APPLET, pero que por alguna razón, no pudiese ejecutarlo. Por ejemplo, si un applet necesita escribir en el disco duro de nuestro ordenador, pero en las características de seguridad tenemos bloqueada esa posibilidad, entonces el navegador presentaría el texto asociado a ALT.

ALT no es utilizado por los navegadores que no entienden la marca APPLET, por ello se ha definido la marca </APPLET>, que finaliza la descripción del applet. Un navegador con soporte Java ignorará todo el texto que haya entre las dos marcas <APPLET> y </APPLET>, sin embargo, un navegador que no soporte Java ignorará las marcas y presentará el texto que se encuentre entre ellas.


ATRIBUTOS DE APPLET

 

Los atributos que acompañan a la etiqueta <APPLET>, algunos son obligatorios y otros son opcionales. Todos los atributos, siguiendo la sintaxis de html, se especifican de la forma: atributo=valor. Los atributos obligatorios son:

CODE
Indica el fichero de clase ejecutable, que tiene la extensión .class. No se permite un URL absoluto, como ya se ha dicho, aunque sí puede ser relativo al atributo opcional CODEBASE.

WIDTH
Indica la anchura inicial que el navegador debe reservar para el applet en pixels.

HEIGHT
Indica la altura inicial en pixels. Un applet que disponga de una geometría fija no se verá redimensionado por estos atributos. Por ello, si los atributos definen una zona menor que la que el applet utiliza, únicamente se verá parte del mismo, como si se visualiza a través de una ventana, eso sí, sin ningún tipo de desplazamiento.
Los atributos opcionales que pueden acompañar a la marca APPLET comprenden los que se indican a continuación:

CODEBASE
Se emplea para utilizar el URL base del applet. En caso de no especificarse, se utilizará el mismo que tiene el documento.

ALT
Como ya se ha dicho, funciona exactamente igual que el ALT de la marca <IMG>, es decir, muestra un texto alternativo, en este caso al applet, en navegadores en modo texto o que entiendan la etiqueta APPLET pero no implementen una máquina virtual Java.

NAME
Otorga un nombre simbólico a esta instancia del applet en la página que puede ser empleado por otros applets de la misma página para localizarlo. Así, un applet puede ser cargado varias veces en la misma página tomando un nombre simbólico distinto en cada momento.

ALIGN
Se emplea para alinear el applet permitiendo al texto fluir a su alrededor. Puede tomas los siguientes valores: LEFT, RIGHT, TOP, TEXTTOP, MIDDLE, ABSMIDDLE, BASELINE, BOTTOM y ABSBOTTOM.

VSPACE
Indica el espaciado vertical entre el applet y el texto, en pixels. Sólo funciona cuando se ha indicado ALIGN = LEFT o RIGHT.

HSPACE
Funciona igual que el anterior pero indicando espaciamiento horizontal, en pixels. Sólo funciona cuando se ha indicado ALIGN = LEFT o RIGHT.

Es probable encontrar en algunas distribuciones otras etiquetas para la inclusión de applets, como <APP>. Esto se debe a que estamos ante la tercera revisión de la extensión de HTML para la incrustación de applets y ha sido adoptada como la definitiva. Por ello, cualquier otro medio corresponde a implementaciones obsoletas que han quedado descartadas.

PASO DE PARAMETROS A APPLETS


El espacio que queda entre las marcas de apertura y cierre de la definición de un applet, se utiliza para el paso de parámetros al applet. Para ello se utiliza la marca PARAM en la página HTML para indicar los parámetros y el método getParameter() de la clase java.applet.Applet para leerlos en el código interno del applet. La construcción puede repetirse cuantas veces se quiera, una tras otra.
Los atributos que acompañan a la marca PARAM son los siguientes:

NAME
Nombre del parámetro que se desea pasar al applet.

VALUE
Valor que se desea transmitir en el parámetro que se ha indicado antes.

Texto HTML
Texto HTML que será interpretado por los navegadores que no entienden la marca APPLET en sustitución del applet mismo.

Para mostar esta posibilidad vamos a modificar nuestro applet básico HolaMundo para que pueda saludar a cualquiera. Lo que haremos será pasarle al applet el nombre de la persona a quien queremos saludar. Generamos el código para ello y lo guardamos en el fichero HolaTal.java.

import java.awt.Graphics;
    import java.applet.Applet;
    
    public class HolaTal extends Applet {
      String nombre;
        public void init() {
            nombre = getParameter( "Nombre" );
            }
        public void paint( Graphics g ) {
            g.drawString( "Hola "+nombre+"!",25,25 );
            }
        }

Si compilamos el ejemplo obtendremos el fichero HolaTal.class que incluiremos en nuestra página Web. Vamos a generar el fichero HolaTal.html, en el que incluiremos nuestro applet, y que debería tener el siguiente contenido:

    <HTML>
    <APPLET CODE=HolaTal.class WIDTH=300 HEIGHT=100>
    <PARAM NAME="Nombre" VALUE="Jairo">
    </APPLET>
  </HTML>

Puedes sustituir mi nombre por el tuyo. Este cambio no afectará al código Java, no será necesario recompilarlo para que te salude a ti el applet.

Los parámetros no se limitan a uno solo. Se puede pasar al applet cualquier número de parámetros y siempre hay que indicar un nombre y un valor para cada uno de ellos.

El método getParameter() es fácil de entender. El único argumento que necesita es el nombre del parámetro cuyo valor queremos recuperar. Todos los parámetros se pasan como Strings, en caso de necesitar pasarle al applet un valor entero, se ha de pasar como String, recuperarlo como tal y luego convertirlo al tipo que deseemos. Tanto el argumento de NAME como el de VALUE deben ir colocados entre dobles comillas (") ya que son String.

 

APPLET EJEMPLO



import java.awt.*;
import java.applet.*;

public class GuiExample extends Applet
{

     Button okButton;
     TextField nameField;
     CheckboxGroup radioGroup;
     Checkbox radio1;
     Checkbox radio2;
     Checkbox option;


     public void init()
     {
  // Tell the applet not to use a layout manager.
        setLayout(null);
  // initialze the button and give it a text.
        okButton = new Button("A button");
  // text and length of the field
        nameField = new TextField("A TextField",100);
  // initialize the radio buttons group
          radioGroup = new CheckboxGroup();
  // first radio button. Gives the label text, tells to which
  // group it belongs and sets the default state (unselected)
          radio1 = new Checkbox("Radio1", radioGroup,false);
  // same but selected
          radio2 = new Checkbox("Radio2", radioGroup,true);
  // Label and state of the checkbox
          option = new Checkbox("Option",false);

  // ubicacion y tamaño de los objetos
 
          okButton.setBounds(20,20,100,30);
          nameField.setBounds(20,70,100,40);
          radio1.setBounds(20,120,100,30);
          radio2.setBounds(140,120,100,30);
          option.setBounds(20,170,100,30);

  // adicionar componentes al frame
      add(okButton);
      add(nameField);
      add(radio1);
      add(radio2);
      add(option);
     }

    }