Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tecnologia Cliente Servidor Con Java
Tecnologia Cliente Servidor Con Java
FACULTAD DE INGENIERIA
Primera Edición
Universidad Nacional del Santa
Facultad de Ingeniería Tecnología Cliente–Servidor con Java
E.A.P. Sistemas e Informática
INDICE
Introducción 02
Programación Cliente – Servidor 03
Herramientas para la Programación Cliente – Servidor 04
Arquitectura Cliente – Servidor 06
Conectividad a la Base de Datos con JDBC 08
Uso del Entorno Netbeans para conexión a Base de Datos 16
Acceso de la base de datos y el paquete java.sql 26
Objeto de control JTable en mantenimiento de datos 38
Swing, Menús y mantenimiento de datos usando varias tablas 50
Mantenimiento de datos usando procedimientos almacenados 66
Transacciones y Búsquedas con base de datos 77
consulta de datos usando el objeto JTable 90
INTRODUCCION
La tecnología llamada Cliente /Servidor es actualmente utilizada en casi todas las
aplicaciones administrativas e Internet/Intranet. Bajo este esquema, un servidor es
un ordenador remoto, en algún lugar de una red, que proporciona información según
se le solicite. Mientras que un cliente funciona en su computadora local, se comunica
con el servidor remoto y pide a éste información.
Los sistemas Cliente-Servidor pueden ser de muchos tipos, pues esto depende
principalmente de las aplicaciones instaladas en el propio servidor. Entre otros,
existen: servidores de impresión mediante los cuales los usuarios comparten
impresoras, servidores de archivos con los que los clientes comparten discos duros,
servidores de bases de datos donde existe una única base de datos que es consultada
por los clientes y puede o no ser modificada por ellos y servidores Web que utilizan
también la tecnología Cliente/Servidor, aunque añaden aspectos nuevos y propios a la
misma.
Los servidores web quizás actualmente son los de mayor importancia. Un servidor
web es aquel que permite a los clientes compartir datos, documentos y multimedia en
formato web. Aunque parte de la tecnología Cliente/Sevidor, el servidor Web aporta
ventajas adicionales a un servidor tradicional.
1. CORBA:
Es necesario que exista una versión de CORBA para la plataforma donde se quiere
implementar.
Ventajas:
● Soporta múltiples plataformas y lenguajes de programación.
● Dispone de una gran cantidad de servicios
● Definida por un organismo serio e independiente
Incovenientes:
● Complejidad en el desarrollo
● Lentitud para adaptarse
● Pocas implementaciones libres.
2. NET
Ventajas:
● Soporta múltiples plataformas
● Fácil proceso de desarrollo (Visual Studio .Net)
● Entorno Windows muy extendido.
● Buen marketing
Inconvenientes:
● Exclusiva del sistema operativo Windows
● Propia de Microsoft
● Casi ninguna implementación libre.
3. JAVA EE
Ventajas:
● Soporta para múltiples plataformas y sistemas operativos
● Avalado por múltiples empresas (SUN, IBM, ORACLE, etc)
● Competitividad
● Soluciones Libres
Inconvenientes:
● Exclusivo para el lenguaje Java
● Complejidad relativa en el desarrollo de aplicaciones
● No existe un entorno de desarrollo fijo.
Modelo Físico:
– 1 capa (Sistema monolítico, no es realmente una aplicación C/S)
¿Qué es un JDBC?
ODBC es un interfaz escrito en lenguaje C, que al no ser un lenguaje portable, haría que las
aplicaciones Java también perdiesen la portabilidad. Y además, ODBC tiene el inconveniente
Modelo de 2 capas
El presente modelo se basa en que la conexión se presenta entre la aplicación Java o el
applet (que se ejecuta en el navegador), se conectan directamente a la base de datos.
Como sabemos en Java se puede tener dos tipos de aplicaciones: la aplicación Java
propiamente dico y una aplicación applet, esta última que se ejecuta en un navegador.
Observamos en la figura que el driver o controlador JDBC debe residir en la computadora
local. La base de datos puede estar en cualquier otra máquina y se accede a ella
mediante la red. Esta es la configuración de típica Cliente/Servidor: el programa cliente
envía instrucciones SQL a la base de datos, ésta las procesa y envía los resultados de
vuelta a la aplicación
Modelo de 3 capas
El presente modelo, las instrucciones son enviadas a una capa intermedia entre Cliente y
Servidor, que es la que se encarga de enviar las sentencias SQL a la base de datos y
recoger el resultado desde la base de datos. En este caso el usuario no tiene contacto
directo, ni a través de la red, con la máquina donde reside la base de datos.
Puente JDBC-ODBC
Utilizada por Sun inicialmente para popularizar JDBC y consiste en aprovechar todo lo
existente, estableciendo un puente entre JDBC y ODBC. Este driver convierte todas las
llamadas JDBC a llamadas ODBC y realiza la conversión correspondiente de los resultados.
La ventaja de este driver, que se proporciona con el JDK, es que Java dispone de acceso
inmediato a todas las fuentes posibles de bases de datos y no hay que hacer ninguna
configuración adicional aparte de la ya existente. La desventaja está en que es lenta y no
será posible ser usada en el sistema operativo Linux.
Java Binario
Este driver se salta la capa ODBC y habla directamente con la librería nativa del
fabricante del sistema DBMS (como pudiera ser DB-Library para Microsoft SQL Server o CT-
Lib para Sybase SQL Server). Este driver es un driver 100% Java pero aún así
necesita la existencia de un código binario (la librería DBMS) en la máquina del cliente,
con las limitaciones y problemas que esto implica.
La única desventaja de este tipo de drivers es que el cliente está ligado a un servidor
DBMS concreto.
Hay varias formas de hacerlo, pero la más sencilla es utilizar el método forName() de la
clase Class:
Class.forName("Controlador JDBC");
Para el caso particular del controlador para MySQL, Connector/J, se tiene lo siguiente:
Class.forName("com.mysql.jdbc.Driver");
Debe tenerse en cuenta que el método estático forName() definido por la clase Class genera
un objeto de la clase especificada. Cualquier controlador JDBC tiene que incluir una parte
de iniciación estática que se ejecuta cuando se carga la clase. En cuanto el cargador de
clases carga dicha clase, se ejecuta la iniciación estática, que pasa a registrarse como un
controlador JDBC en el DriverManager.
es equivalente a:
Class c = Class.forName("Controlador JDBC");
Driver driver = (Driver)c.newInstance();
DriverManager.registerDriver(driver);
Una vez en el método principal llamado main se declara la variable objeto conn y a través de
la instrucción try se busca proteger la ejecución ante posibles errores (lo que se denomina
manejo de excepciones).
Con la instrucción: Class.forName(“com.mysql.jdbc.Driver).newInstance();, se establece el
driver para el gestor de base de datos MySql. Luego en la siguiente línea de
programación se establece la conexión con la base de datos a través del método
getConnection perteneciente a la clase DriverManager. A través de la sentencia selectiva if
se evalúa el éxito de la conexión, por lo tanto, si la variable conn es diferente de null
significa que se logró la conexión, caso contrario se mostrará mensajes de error, gracias a la
instrucción catch.
A continuación se listan algunas de las salidas que se pueden obtener al ejecutar el
programa anterior:
Existe versiones superiores como la versión 5.0 para dicho conector. NetBeans nos permite la
tarea de conectar una aplicación a una base de datos
Conexión de una Aplicación a una base de datos creada en MySql
Para conectar a una aplicación a una base de datos, se requiere:
1. Agregarle a NetBeans el conector como una biblioteca o librería. Esto permite que el
conector este disponible para los proyectos.
2. Agregarle a un proyecto el conector. Esto permite que la aplicación se pueda conectar a la
base de datos.
A continuación procedemos agregarle a NetBeans un conector a una base de datos MySql:
a. Seleccione la opción Tools/Libraries de la barra de menú del entorno de NetBeans.
b. Se visualiza un
cuadro de
diálogo que
permite
administrar las
librerías o
bibliotecas de
NetBeans. En la
ventana, al lado
izquierdo se
observa las
librerías
agregadas a
NetBeans. Del
lado derecho
aparece el nombre de la biblioteca y la trayectoria del archivo con la biblioteca. Para
agregar el conector a MySQL a NetBeans presione el botón de comando New Library ...
b. Se cierra el cuadro de
diálogo y volvemos a la
ventana anterior donde se
observará la nueva librería
MySQL. Posteriormente
procedemos a dar clic en el
botón de comando Add
JAR/Folder ...
d. Al dar clic en Add JAR/Folder volvemos a la ventana anterior. Cabe señalar que en las
últimas versiones de NetBeans ya existe una librería o biblioteca para la conexión a una
base de datos de MySql, denominada MYSQL JDBC Driver.
8) Para agregar el concetor MySQL, haga clic en el botón derecho del mouse en el
nodo o carpeta Drivers y seleccione la opción New Driver.
14) Se muestra un cuadro de diálogo para establecer el URL de la base de datos usando
el siguiente formato:
jdbc:mysql://servidor:puerto/baseDatos
donde servidor es la dirección IP (o nombre de dominio del servidor), en caso que el
servidor esté en la misma computadora que NetBeans utiliza el nombre: localhost;
puerto es el puerto empleado por el servidor. Si el servidor utiliza el puerto
predefinido, se puede omitir; baseDatos es la base de datos a la que se desea
conectar.
15) Damos clic en el botón de comando OK. A continuación aparecerá una ventana
confirmando la conexión con la base de datos de campeonatouefa. Luego damos clic
en el botón de comando OK.
4. Vamos a proceder a crear la tabla de Equipo con los campos codequipo int,
nombre varchar(40), representante varchar(32), entrenador varchar(40), grupo
char(1) y estado bit. Una vez indicado los campos damos clic en el botón de comando
OK.
6. Si deseamos insertar un registro a una de las tablas a través del comando insert,
seleccionamos el nodo referido a Tables. Dando clic botón derecho se muestra un menú
flotante y luego seleccionamos la opción Execute Command...
8. Luego si escribimos el comando select para consultar los datos de la tabla Ciudad,
observaremos el contenido de dicha tabla.
Como verán el entorno de NetBeans nos ofrece la oportunidad de acceder y manipular los
datos y las estructuras de los elementos que conforman una base de datos. Ahora
ustedes mismos, en base a la experiencia de los conocimeintos adquiridos en los cursos
referentes a base de datos, procedan a experimientar el entorno gráfico que nos ofrece
NetBeans.
Ejecuta una sentencia UPDATE, DELETE, INSERT o cualquier otra sentencia SQL que no
devuelva un conjunto de registros, y devuelve el número de registros afectados por
la sentencia.
public abstract void setMaxRows(int max) throws SQLException
Establece el tiempo en segundos que el controlador esperará hasta que el sistema gestor
de bases de datos devuelva un resultado
public abstract int getQueryTimeout() throws SQLException
Devuelve el tiempo en segundos que el controlador esperará hasta que el sistema gestor
de bases de Datos devuelva un resultado
public abstract void close() throws SQLException
muchas opciones. Todos los métodos funcionan de la misma manera. Toman como
parámetro el índice o el nombre del campo que se desea obtener y devuelven el dato en
cuestión.
public abstract String getString(int columnIndex) throws SQLException public
abstract String getString(String columnName) throws SQLException public
abstract int getInt(int columnIndex) throws SQLException
public abstract int getInt(String columnName) throws SQLException
Además, existen otros métodos gracias a los cuales es posible recorrer los
resultados guardados en el objeto de tipo ResultSet.
public abstract int findColumn(String columnName) throws SQLException
Devuelve el número de columna cuyo nombre se pasa como parámetro public
abstract boolean next() throws SQLException
Un objeto de tipo ResultSet puede contener más de un resultado. Para ir
avanzando por la lista de resultados utilizamos este método, que devuelve un valor
indicando si existe otro resultado o no.
public abstract boolean wasNull() throws SQLException
Vamos a proceder a visualizar en objetos Jlist, los datos contenidos de la tabla de Equipo.
1) Creamos un
objeto Jframe
para abrir un
nuevo formulario.
3) Damos clic botón derecho sobre el diseño del formulario para cambiar el Set
Layout a AbsoluteLayout, lo cual nos permitirá usar los objetos de control más
libremente.
5) Borramos los Items de cada objeto Jlist y colocamos los nombres a cada objeto de
control. Recuerden que para eliminar los items de cada Jlist hay que hacer uso de
model que se encuentra en la ventana de propiedades.
En la primera llave (color rojo) observamos que importamos los paquetes java.sql
(todo lo que acabamos de ver) y el paquete javax.swing para poder utilizar la clase
JoptionPane para la visualización de un mensaje a través de su método
ShowMessageDialog. En la segunda llave se define las variables que se van a
usar. Vendría hacer los atributos de la clase frmVerEquipo. Como tenemos establecer
conexión usaremos un objeto Connection (conn), para hacer una operación de consulta
usaremos un objeto Statement (st) y para almacenar los resultados de la consulta
usaremos un objeto ResultSet (rs). Como la aplicación hace uso de los Jlist se tiene
crear 4 objetos instanciados de la clase DefaultListModel (mayor información en la
sesión 4 del curso de Programación Visual). Posteriormente preparamos variables para
indicar el nombre de la base de datos, el login, el password y el url. En la tercera llave
se ha diseñado un método denominado Enlace que permitirá establecer conexión con
la base de datos campeonatouefa.
El siguiente gráfico intenta mostrar como cada componente JTable obtiene siempre sus
datos desde un modelo de tabla.
Se crea el método sta que devolverá un objeto del tipo Statement. Básicamente
permite crear el objeto del tipo Statement a partir del objeto connection a través
del método createStatement(). Finalmente se necesita tener un método
denominado EnlEst que permitirá enlazarnos con la tabla de Estadio aplicando el
método executeQuery() estableciendo a través del comando select a todos los campos
de la tabla de Estadio solo aquellos cuyo estado es igual a 1, es decir, los estadios que
están habilitados para su uso.
Si observamos en cada uno de los métodos se esta usando throws SQLException, esto
quiere decir que los métodos usan excepciones (intercepcion de errores) para los erroes
que se pueden presentar durante la conexión y acceso de datos.
4. La tabla de Estadio posee realmente cinco campos, pero el último es para indicar si el
estadio esta habilitado para su uso o no lo está, estom quiere decir si hacemos una
elimnación se procederá a cambiar el estado a 0 (elimación lógica) y cada vez que
grabemos los datos de un nuevo estadio se habilitará.
Vamos a diseñar el siguiente formulario al cual lo llamaremos frmMantEstadio
dando los nombres correspondientes a cada uno de los objetos de control
dibujados.
En el botón de comando btnBuscar si está habilitado después de dar clic en dicho botón, se
procederá a la conexión con la base de datos, luego en la variable rs se almacenará los
datos provenientes de la tabla de Estadio. En la variable b se coloca el valor ingresado
en el cuadro de texto txtCodEst. Se define una variable boleana encuentra para manejar
la situación de éxito o fracaso de la búsqueda. En la sentencia while utilizamos el método
next que pertenece al objeto rs, es decir, es un método de la interfaz ResulSet. El
método next devuelve verdadero si encuentra la primera fila de información, las
siguientes veces se desplaza en cada registro almacenado en el rs. La sentencia if que se
encuentra dentro del while, su condición lógica se hará verdadero cuando encuentre el
código de estadio buscado, haciendo que los cuadros de textos se muestren los demás
datos, es entonces que la variable encuentra recién se hace verdadero.
El botón de comando btnVer (Ver Lista de Estadios), consiste en aumentar el tamaño del
formulario para visualizar el objeto JTable. Posteriormente se establece la conexión con
la base de datos y en la variable rs se almacena los datos provenientes de la
tabla de Estadio. Se define un vector denominado datos de tamaño 5 elementos del tipo
String que servirá colocar los datos de una fila para luego agregarlo al objeto dtm que
está vinculado al objeto JTable llamado tablaEstadio. Pero antes de agregarlo debemos
asegurarnos que no exista fila alguna de datos en el modelo dtm y por ende en la
tablaEstadio. El bucle de la sentencia while permite colocar en cada elemento del
arreglo los datos extraidos de una fila que almacena el objeto rs, esto es posible ya
que el método getString, indicando la posición de la columna, podemos obtener el dato
de la fila actual.
Con el método addRow logramos crear una fila con los datos del vector datos en el
objeto dtm y como está vinculado a la tablaEstadio entonces se podrá ver los registros
agregados.
Para el botón de comando btnNuevo, limpiamos los cuadros de textos con el método
limpiarObjetos. Se inhabilita el cuadro de texto txtCodEst y se envía el cursor al
cuadro de texto txtNom. Se inhabilta los botones de comando a excepción de
grabar ya que estamos en el momento de ingresar nuevos datos y proceder a
almacenar.
En
el botón de comando btnModificar, al igual que de grabar o eliminar se procede a
confirmar a través de un mensaje si se procede a la modificación de datos. Una vez
salvados los datos ingresados en los cuadros de textos en variables de memoria
se prepara la instrucción en la variable de memoria comando. Usamos el comando
UPDATE para actualizar los datos. Se procede a ejecutar el comando con el método
executeUpdate y se cierra la conexión con el método close.
8. Al dar clic en el botón de comando Nuevo podemos proceder a ingresar datos. Una vez
ingresado damos clic en el botón de comando Grabar.
Tenemos el JmenuBar que permite iniciar el diseño del menú, Se crea por defecto un
objeto Jmenu que permitirá a partir de este crear las opciones, las cuales se crearán con
los objetos JmenuItem.
8. Vamos a proceder a agregar los métodos en la clase Main que utilizaremos para el
mantenimiento de datos de la Programación de Partidos.
Para obtener los registros de datos de aquellos encuentros que están programados
Para obtener los equipos que pertenecen a un grupo indicado. Cada grupo debe
estar conformado por 4 equipos.
Para obtener el código del equipo dado el nombre del equipo. Este método nos servirá al
momento de grabar datos.
Para obtener el código del estadio dado el nombre del estadio. Este método nos servirá
al momento de grabar o modificar datos.
b. Definir los atributos o variables a usar en los distintos métodos que forma la
clase frmProgramacionPartidos
e. Diseñamos el método llenarListas() para mostrar los posibles encuentros dado los 4
equipos que conforman un grupo.
g. Cuando se seleccione una etapa del campeonato, como por ejemplo eliminatoria se
habilitará el uso del objeto jComboBox llamado cboGrupo.
continuamos ...
Procedimientos almacenados
Poco a poco las empresas y muchas personas en general empiezan a mirar más hacia el
Software Libre y se dan cuenta que existen excelentes alternativas a distintos programas
que para ellos son de uso frecuente en otro Sistema Operativo, como pueden ser
OpenOffice, Mozilla Firefox, Eclipse, NetBeans, PostgreSQL, PHP y MySQL por citar algunos,
en esta nota hablaré un poco del Manejador de Bases de datos MySQL, que en los últimos
años ha tenido grandes avances en su desarrollo y actualmente es uno de los DBMS más
usados en sitios web y que en sus últimas versiones ha incorporado nuevas características
como la implementación de las tablas, disparadores, funciones y procedimientos
almacenados. Los procedimientos almacenados son de gran utilidad para realizar tareas
frecuentes en una base de datos, es sorprendente la cantidad de tiempo que se puede
llegar a ahorrar al hacer uso de este mecanismo.
Interface PreparedStatement
Este componente permitirá hacer uso de los procedimientos almacenados. Una vez
instanciado el objeto usaremos el método preparedStatement para invocar el uso de un
procedimiento almacenado. También se hará uso de los métodos setString(), setInt(),
setDate(), etc para indicar la posición del parámetro y el valor de dicho parámetro.
Finalmente usaremos el método executeUpdate() para ejecutar el procedimiento
almacenado.
Preparamos las variables para el acceso de datos: conn, st, rs. En el método
constructor frmMantArbitro() preparamos las columnas del objeto JTable y damos al
formulario su tamaño y ubicación dentro de la pantalla.
objeto dtm que está vinculado al objeto JTable llamado tablaArbitro. Pero antes de
agregarlo debemos asegurarnos que no exista fila alguna de datos en el modelo dtm
y por ende en la tablaArbitro. El bucle de la sentencia while permite colocar en cada
elemento del arreglo los datos extraidos de una fila que almacena el objeto rs, esto es
posible ya que el método getString, indicando la posición de la columna, podemos
obtener el dato de la fila actual.
Con el método addRow logramos crear una fila con los datos del vector datos en el
objeto dtm y como está vinculado a la tablaArbitro entonces se podrá observar los
registros agregados.
Para el botón de comando btnNuevo, limpiamos los cuadros de textos con el método
limpiarObjetos. Se inhabilita el cuadro de texto txtCodArb y se envía el cursor al cuadro
de texto txtNom. Se inhabilta los botones de comando a excepción de grabar.
Este método nos ayudará a llenar de datos en el objeto JTable del diseño de
formulario frmIncidenciasEncuentro.
Este método permitirá buscar las incidencias ocasionadas por los dos equipos de un
encuentro dado el número de programación.
6. En el formulario frmPrincipal que contiene el diseño del menú, ubicamos la opción
Incidencias dentro de Procesos.
7. Seleccionando incidencias del Encuentro y dando clic con el botón derecho del
mouse elegimos Events/Action/ActionPerformed.
Preparamos las variables para el acceso de datos: conn, st, rs. La variable graba es para
saber si se va a grabar las incidencias (true) o se va a modificar las incidencias (false). Con
la variable dtm es para el manejo del objeto Jtable.
Programar en el evento FocusLost permitirá asignarle los goles a favor que tiene el
equipo local como goles en contra al equipo visitante ó asignarle los goles en
contra del equipo local como goles a favor del equipo visitante.
V
a
m
o
s
Veamos a continuación como se podría hacer una consulta a los datos de la tabla de Estadio y
almacenarlos en un arreglo.
Este método nos permitirá obtener los datos de los Equipos habilitados para el
campeonato.
Seleccionando Jugadores por Equipo y dando clic con el botón derecho del mouse
elegimos Events/Action/ActionPerformed
Importamos los paquetes java.sql (para acceder a base de datos), javax.swing (para el
uso de los controles visuales), javax.swing.table para el manejo de las clases del paquete
table y el paquete campeonato_uefa que contiene a la clase Main con lo cual podremos
hacer uso de todos los métodos que tenga.
Se define las variables objeto conn, st, rs del tipo Connection, Statement y
ResultSet inicializando como null. La variable objeto dtm es del tipo
DefaultTableModel para el manejo del objeto Jtable tablaConsulta.
5.
Procedemos a ejecutar el formulario desde el menú.