Manual de Java JSP

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 75

http://www.programacionfacil.

com/java_jsp/startº

UNIDAD 2: JAVA JSP CONTROL DE PROGRAMA

TEMA 8: JAVA JSP INSTRUCCIÓN SWITCH


También existen ocasiones o programas donde se exige evaluar muchas condiciones a la vez, en estos casos o se
usa una condición compuesta muy grande o se debe intentar convertir el problema a uno que se pueda resolver
usando la instrucción SWITCH.
Esta instrucción es una instrucción de decisión múltiple donde el compilador prueba o busca el valor contenido
en una variable ENTERA o CHARACTER contra una lista de constantes apropiadas, es decir enteras, character,
cuando el computador encuentra el valor de igualdad entre variable y constante entonces ejecuta el grupo de
instrucciones asociados a dicha constante, si no encuentra el valor de igualdad entre variable y constante,
entonces ejecuta un grupo de instrucciones asociados a un default, aunque este ultimo es opcional.
El formato de esta instrucción es el siguiente;
capturar o asignar variable de condición;

switch(var OPCION)
{
case const1: instrucción(es);
break;
case const2: instrucción(es);
break;
case const3: instrucción(es);
break; ………………
default: instrucción(es);
};

prog3 jsp
<%
// declarando
char letra=' ';
if(request.getParameter("OK") != null)
{
//recordar que TEXTBOX contiene una string
letra=request.getParameter("LETRA").charAt(0);
switch(letra)
{case 'a':
out.println("aguila ");
break;
case 'b': case 'B':
out.println("baca ");
break;
case 'c':
out.println("caballo ");
break;
default:
out.println("no hay ");
};
// observar que se puede escribir direcatmente a la pagina dinamica
// esto es para los flojos
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog3.jsp METHOD=post>");
out.println("DAME UNA LETRA:<INPUT TYPE=TEXT NAME=LETRA value="+letra+"><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=evento1 ><BR>");
out.println("</FORM>");
%>
http://www.programacionfacil.com/java_jsp/startº

Observar el caso “b”, observar como se pueden usar mas de dos case con un solo break sorry por lo de BACA
pero el unico animalito que me acorde fue el BURRO y luego mis alumnos se sienten aludidos y ofendidos.
TAREAS PROGRAMACION JAVA JSP
1.- Construir un programa que capture un deporte cualesquiera y despliegue dos implementos deportivos
apropiados.
2.- Evaluar cualquier función vista para cuando x =3,-4, 5

TEMA 9: CONTROL SELECT JAVA JSP


Existen muchas ocasiones en donde el usuario del programa tiene que proporcionar datos que provienen de un
conjunto finito y muy pequeño de posibles respuestas esto significa que cada vez que se ejecute el programa el
usuario estará proporcionando las mismas respuestas.
Ejemplo de esta clase de datos, son por ejemplos Municipio en BC las posibles respuestas solo son (Tecate,
Tijuana, Mexicali, Ensenada, Rosarito), otro ejemplo es Sexo (Hombre, Mujer), etc.
Para situaciones como esta existen componentes html que permiten programar por adelantado las posibles
respuestas y el usuario solo debe seleccionar la respuesta apropiada en lugar de tener que escribirla.
Este control SELECT nos permite definir en primera instancia un conjunto de datos o valores respuestas
asociados a una caja de edición cualesquiera así ahora el usuario tendrá la oportunidad de seleccionar un dato del
conjunto de datos o respuestas ya predefinido.
Este componente SELECT DEBERA CONSTRUIRSE EN dos partes una parte de encabezado para poner el
nombre del grupo de respuestas( por ejemplo municipios, sexo, etc.)
La segunda parte es la lista de opciones o respuestas que se debe cargar al tiempo de ejecución de la forma html
como lo muestra el siguiente programa:

Prog4.jsp
<%
// declarando
String municipio="";
if(request.getParameter("OK") != null)
{
municipio =request.getParameter("MUNICIPIO");
out.println(municipio+" =");
if (municipio.compareTo("ENSENADA")==0) out.println("TIBIO");
if (municipio.compareTo("TIJUANA")==0) out.println("HELADO");
if (municipio.compareTo("MEXICALI")==0) out.println("CALIENTE");
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog4.jsp METHOD=post>");
out.println("<B>MUNICIPIOS</B>");
out.println("<SELECT NAME=MUNICIPIO>");
out.println("<OPTION>ENSENADA<OPTION>TECATE<OPTION>TIJUANA<OPTION>MEXICALI");
out.println("</SELECT>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=evento1 ><BR>");
out.println("</FORM>");
%>
http://www.programacionfacil.com/java_jsp/startº

Notas:
1.- Observar que el servidor de paginas devolvio el par MUNICIPIO=TIJUANA que estamos capturando en
nuestra variable municipio.
TEMA 10: JAVA JSP CHECKBOX Y EXCEPCIONES
El componente CheckBox , permite seleccionar una opción al usuario del programa o tomar una decisión
directamente en pantalla.
Ejemplos de uso:

Observar que dos o mas checkboxs pueden estar seleccionados a la vez.

Codigo prog5 jsp


<%! String m,n,f; %>
<%
// observar declaracion y usando las otras directivas
if(request.getParameter("OK") != null)
{
m=request.getParameter("M");
n=request.getParameter("N");
f=request.getParameter("F");
try{
if (m.compareTo("on")==0) out.println("masculino checado<br>");
}catch(java.lang.NullPointerException e){};
try{
if (n.compareTo("on")==0) out.println("neutro checado<br>");
}catch(java.lang.NullPointerException e){};
try{
if (f.compareTo("on")==0) out.println("femenino checado<br>");
}catch(java.lang.NullPointerException e){};
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog5.jsp METHOD=post>");
out.println("<b>sexo:</b><br>");
out.println("<input type=checkbox name=M checked>masculino<br>");
out.println("<input type=checkbox name=F >femenino<br>");
out.println("<input type=checkbox name=N checked>neutro<br>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=evento1 ><BR>");
http://www.programacionfacil.com/java_jsp/startº

out.println("</FORM>");
%>
Notas:
1.- grabarlo y subirlo como prog5 jsp a tusitio en programacionfacil.com
2.- La propiedad name debera ser diferente en cada checkbox usado, la propiedad checked se usa para que
aparezca ya palomeado o seleccionado el control.
3.- Cuando se activa prog5 jsp, esta forma manda el par NAME=on solo de los checkbox que fuerón
seleccionados.
Corrida:

Para programar este componente:


Como ya se indico, esta forma va a mandar el par NAME=on asi que esto es sencillo en java jsp, solo recordar
usar un if por cada checkbox.
Muy sencillo el codigo de validación y no olvidar subirlo a tu sitio.
ERRORES Y EXCEPCIONES
Estos problemas de errores y excepciones que en java, se producen al tiempo de execución del programa son los
problemas normales de mal codigo y que tambien se producen al tiempo de compilación no al tiempo de
ejecucion del programa, este tema se refiere a eehhrorres y excepciones al tiempo de ejecución del programa.
Java tiene un mecanismo muy completo para el manejo de errores y excepciones, un ERROR ocurre
generalmente al tiempo de estarse ejecutandose un programa, por ejemplo una division entre cero.
Una EXCEPCION es creada tambien al tiempo de ejecución del programa cuando en alguna parte del programa
se produce alguna condición no contemplada en el programa para el programa ejemplo del checkbox, se crearon
tres variables o mejor dicho tres objetos strings y cuando de la forma se manda solo una o dos de ellas cargadas
con “on” algunas de las variables u objetos strings queda cargada con null(caso especial de strings) y al intentar
hacer la comparación java avisa de una excepcion como se muestra en la siguiente pantalla ejemplo:

Esta excepción ocurrio al tiempo de ejecución del programa y por el problema ya descrito y explicado.
La diferencia entre una EXCEPCION y un ERROR es que una excepcion si es atrapada(catch) por el programa y
el programador permite recuperar el programa y continuar con su ejecución, mientras que un error aunque sea
atrapado(catch) por el programa y el programador el programa suspendera y terminara su ejecución.
Si errores o excepciones no son atrapadas(catch) el programa terminara su ejecución y mandara el aviso al
usuario, como se demuestra en la pantallita de arriba.
http://www.programacionfacil.com/java_jsp/startº

Es por esta razón que es conveniente y necesario atrapar (catch) errores o excepciones, asi el programador podra
incluir algun mecanismo de corrección de errores o al menos de avisarle al usuario en lugar de que sea el
servidor quien le avise.
Este mecanismo de correccion de errores es la clausula o instrucción

Try{
Instrucciones normales de java;
} catch(tipo de error o excepcion var de error){ inst de aviso o correc de error puede incluir la var de error ; };

Un try-catch puede encerrar una instruccion de java, un grupo de instrucciones de java o todo el programa
completo.
En el prog5 jsp se uso un try-catch en cada if, se pudo usar un try catch con todos los if's pero no se conoce de
antemano cuales variables strings se quedan en null asi que fue mas conveniente revisar if por if.
En resumen cuando en algun programa al tiempo de ejecución les aparezca un error o excepcion van a ocupar
usar try-catch para atraparlo o corregirlo, el tipo de error o excepcion a cubrir se los va a estar indicando el
propio servidor de paginas como lo muestra la pantallita ejemplo de excepción y observar que la misma
excepcion que aparecio en dicha pantallita, se puso en la clausula catch.
Si aparecen mas errores o excepciones en un programa es valido que un try lleve mas de un catch.

TEMA 11: COMPONENTE RADIOBUTTON JAVA JSP


Se utiliza para presentar al usuario un conjunto de opciones mutuamente excluyentes entre si es decir si el
usuario selecciona un componente radio todos los demás componentes radioButton en la forma, se deseleccionan
solos es por esta razón que decimos que radiobotones son mutuamente excluyentes.

Codigo prog6 jsp


<%! String sexo, carrera; %>
<%
// es mejor esta declaracion no hay que inicializar
if(request.getParameter("OK") != null)
{
sexo=request.getParameter("SEXO");
carrera=request.getParameter("CARRERA");
out.println("carrera="+carrera+"<br>");
out.println("sexo="+sexo+"<br>");
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog6.jsp METHOD=post>");
out.println("sexo:<br>");
out.println("<input type=radio name=SEXO value=masculino checked>masculino<br>");
out.println("<input type=radio name=SEXO value=femenino>femenino<br>");
out.println("<input type=radio name=SEXO value=neutro>neutro<br>");
out.println("carrera:<br>");
out.println("<input type=radio name=CARRERA value=sistemas checked>sistemas<br>");
out.println("<input type=radio name=CARRERA value=informatica>informatica<br>");
out.println("<input type=radio name=CARRERA value=medicina>medicina<br>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=evento1 ><BR>");
out.println("</FORM>");
%>

1.- Observar que tenemos dos grupos de radiobotones uno con NAME=SEXO y otro con NAME=CARRERA
sin embargo existen varios radiobotones y cada radiobuton tiene su propio valor o VALUE.
2.- Recordar que en checkbox(tema anterior) la propiedad NAME debe ser distinta para cada uno de ellos,
mientras que en radiobutton es la misma para todo un grupo similar de ellos.
3.- La razón principal para esta situación es que los radiobotones son mutuamente excluyentes entre si Y QUE
SOLO UNO PUEDE ESTAR ENCENDIDO A LA VEZ por eso los agrupamos con la propiedad NAME para
que html los pueda considerar como dos o mas grupos diferentes.
4.- Tambien tienen la propiedad checked para que aparezcan seleccionados al cargar el programa prog6 jsp
http://www.programacionfacil.com/java_jsp/startº

5.- A diferencia del checkbox, html va a regresar solamente el par NAME=VALUE de el radiobuton que
este seleccionado, esto lo hace por cada grupo de radiobotones que tengamos en la forma html
Rrecordar que html regresa un y solo un par NAME=VALUE por cada grupo de radiobutton's que existan en la
forma.html, asi que es bastante sencillo tomar el valor del radiobuton seleccionado y ya cargado este valor
realizar o programar el proceso correspondiente.
Corrida:

UNIDAD 4: JAVA PROGRAMACION ORIENTADA OBJETOS


TEMA 1: DECLARACIONES o PROCEDIMIENTOS JAVA JSP
Un camino para dividir un gran programa en partes mas pequeñas es el uso de declaraciones.
Una declaración es un grupo de instrucciones, variables, constantes, etc, que estan diseñados con un próposito
particular y tiene su nombre propio.
Es decir una declaracion es un modulo de un programa que realiza una tarea especifica y que no puede regresar
valores al programa principal u a otro procedimiento que lo este invocando.
Despue de escribir una declaración se usara ese nombre propio como una sola instrucción o llamada.
Las declaraciones se construyen antes del cuerpo principal del programa, es decir en la parte declarativa.
Su formato es:
<%! void Nom_decl(){instrucciones;} %>

Un programa puede tener tantos procedimientos como se deseen, para hacer una llamada o invocación a el
Procedimiento durante la ejecución de un programa se debera escribir el nombre dela misma y los parentesis en
blanco.

Prog12.jsp
<%!
int base=0,altura=0; double area=0;
void proc1(){
area= base * altura / 2.0 ;};
%>
<%
// no usar objetos request y out fuera de scriptlet
// porque no estan creados por java todavia
if(request.getParameter("OK") != null)
{
base = Integer.parseInt(request.getParameter("BASE"));
altura = Integer.parseInt(request.getParameter("ALTURA"));
// llamando o invocando procedimiento uno
proc1();
};
// construyendo forma dinamica
http://www.programacionfacil.com/java_jsp/startº

out.println("<FORM ACTION=prog12.jsp METHOD=post>");


out.println("DAME LA BASE:<INPUT TYPE=TEXT NAME=BASE value="+base+"><BR>");
out.println("DAME LA ALTURA:<INPUT TYPE=TEXT NAME=ALTURA value="+altura+"><BR>");
out.println("AREA:<INPUT TYPE=TEXT NAME=AREA value="+area+"><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=evento1 ><BR>");
out.println("</FORM>");
%>

Recordar que no se deben usar los objetos REQUEST y OUT antes de la parte principal del programa (esto
porque java convierte el jsp a un servlet y la creación de REQUEST y OUT lo hace despues, generando errores
de objetos request y out desconocidos).

TEMA 2: PARAMETROS JAVA JSP


Un parametro es una variable que puede pasar su valor a un procedimiento desde el principal o desde otro
procedimiento.
Existen ocasiones en que es necesario mandar al procedimiento ciertos valores para que los use en algún
proceso.
Estos valores que se pasan del cuerpo principal del programa al procedimiento se llaman parametros.
Entonces una declaracion completa es:
<%! void NomProc(lista de parametros)
{ cuerpo de instrucciones; }; %>

prog13.jsp
<%!
int base=0; double altura=0; double area=0;

void proc1(int a, double b){

area= a * b / 2.0 ;};

%>

<%
// no usar objetos request y out fuera de scriptlet
// porque no estan creados por java todavia
if(request.getParameter("OK") != null)
{
base = 10;
altura = 3.1416;
// llamando o invocando procedimiento uno y pasando parametros
// recordar que se pueden mandar datos o variables
proc1(base,3.1416);
};
http://www.programacionfacil.com/java_jsp/startº

// construyendo forma dinamica


out.println("<FORM ACTION=prog13.jsp METHOD=post>");
out.println("DAME LA BASE:<INPUT TYPE=TEXT NAME=BASE value="+base+"><BR>");
out.println("DAME LA ALTURA:<INPUT TYPE=TEXT NAME=ALTURA value="+altura+"><BR>");
out.println("AREA:<INPUT TYPE=TEXT NAME=AREA value="+area+"><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=evento1 ><BR>");
out.println("</FORM>");
%>

REGLAS PARA EL USO DE PARAMETROS


1.- Cuando se usan variables como parametros, la variable que se manda debe ser declarada dentro del principal
o del procedimiento de donde se esta enviando.
2.- La variable que se manda tiene un nombre, la que se recibe puede tener otro nombre.
3.- La cantidad de variables que se envian deben ser igual en cantidad, orden y tipo a las variables que reciben.
4.- La variable que se recibe tiene un ambito local dentro del procedimiento, es decir solo la puede usar ese
procedimiento.

TEMA 3: JAVA JSP VARIABLES LOCALES Y GLOBALES

En java Jsp el lugar donde sea declarada una variable afectara el uso que el programa quiera hacer de esa
variable.
Las reglas basicas que determinan como una variable puede ser usada depende de 3 lugares donde se puede
declarar una variable.
En primer lugar es dentro de cualquier función o procedimiento incluyendo main, a estas se les llama variables
locales y solo pueden ser usadas por instrucciones que esten dentro de esa función o procedimiento.
En segundo lugar es como parametro de una función o procedimiento, donde despues de haber recibido el valor,
podra actuar como variable local en esa función o procedimieto.
En escencia una variable local solo es conocida por el código de esa función o procedimieto y es desconocida
por otras funciones o procedimientos.
En tercer lugar es fuera de todas las funciones pero dento de la parte declarativa <%! … %>, a este tipo de
variables se les llama variables globales y podran ser usadas por cualquier función o procedimiento del
programa.

TEMA 4: JAVA JSP FUNCIONES


En jaba jsp una funcion es un modulo de un programa separado del cuerpo principal, que realiza una tarea
especifica y que puede regresar un valor a la parte principal del programa u otra funcion o procedimiento que la
invoque.
La forma general de una funcion es:

<%! tipodatoregresa Nom_fun(parametros)


{ cuerpo de instrucciones;
http://www.programacionfacil.com/java_jsp/startº

intruccion return;
}; %>

El tipo especifica el tipo de valor que la funcion regresara utlizando la instrucción return.
Si no se especifica un tipo se asume de default que el tipo regresado es int.
La lista de parametros formales es una lista de variables separadas por comas (,) que almacenaran los valores que
reciba la funcion, estas variables actuan como locales dentro del cuerpo de la funcion.
Aunque no se ocupen parametros los paréntesis son requeridos.
La declaracion de parametros es la especificacion de cada tipo de parametro recibido.
INSTRUCCION RETURN
Dentro del cuerpo de la función deber haber una instrucción return cuando menos, para regresar el valor, esta
instrucción permite regresar datos.

Prog14 jsp
<%!
double res=0;
double funcion1(int a, double b){
return a * b; };
%>
<%
// no usar objetos request y out fuera de scriptlet
// porque no estan creados por java todavia
if(request.getParameter("OK") != null)
{
// llamando o invocando funcion uno y pasando parametros
// recordar que se pueden mandar datos o variables
double alfa=funcion1(2,2.5) + 3 + funcion1(2, 3.3);
res= alfa;
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog14.jsp METHOD=post>");
out.println("RESULTADO:<INPUT TYPE=TEXT NAME=RESULTADO value="+res+"><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=evento1 ><BR>");
out.println("</FORM>");
%>

Es permitido poner mas de un return en el cuerpo de instrucciones sobre todo en condiciones, pero solo un return
se ejecutara.
Ejemplo;

if (suma >= 10)


{ return 10; }
else
{ return 20; }

EXISTEN 3 CLASES USUALES DE FUNCIONES.


http://www.programacionfacil.com/java_jsp/startº

Las primeras son de tipo computacional que son diseñadas para realizar operaciones con los argumentos y
regresan un valor basado en el resultado de esa operación.
Las segundas funciones son aquellas que manipulan información y regresan un valor que indican la terminacion
o la falla de esa manipulacion.
Las terceras son aquellas que no regresan ningun valor, es decir son estrictamenta procedurales.

UNIDAD 5: JAVA JSP REGISTROS Y ARCHIVOS SECUENCIALES

TEMA 1: INTRODUCCION JAVA JSP


Antes de empezar a programar en serio se estudian en esta unidad dos problemas.
Problema A:
Variables que puedan almacenar un conjunto de valores y no necesariamente del mismo tipo.
Problema B:
Resolver el problema de almacenar en forma permanente los datos que se generan dentro de un programa ya sea
por captura, proceso, etc;
El problema (A) se resuelve usando el concepto de estructuras o registros el problema (B) se resuelve usando el
concepto de archivos.

TEMA 2: REGISTROS JAVA JSP


Ya se ha visto como variables simples pueden almacenar una sola pieza de información y como arreglos pueden
almacenar un conjunto de ellas del mismo tipo y al mismo tiempo, estos dos mecanismos pueden manejar una
gran variedad de situaciones, pero a menudo se necesita trabajar sobre datos de diversos tipos, en este caso ni
variables escalares ni arreglos son adecuados.
Para resolver estos problemas los lenguajes de programación proveen de un tipo de dato especial llamado
registros.
Un registro es una variable especial que tiene la capacidad de almacenar datos de diferentes tipos.
Sin embargo JAVA usa en su lugar una CLASE.
Este metodo tiene la ventaja de que ademas de incluir los campos tradicionales de un registro (en forma de
atributos) tambien puede incorporar una serie de metodos que permiten procesar de manera mas facil los campos
o atributos de la clase.

Ejemplo;
class alumno{
void alumno(){};
static String nombre= new String();
static int edad;
void inicializar(){
alumno.nombre="pepe el toro";
alumno.edad=18; };
void desplegar(){
System.out.println(alumno.nombre);
System.out.println(alumno.edad);
};
} // termina la clase

Programa 16.jsp;
<%!
static class alumno{
static String nombre=" ";
static int edad=0;
void alumno(){};
static void inicializar(){
alumno.nombre="pepe el toro";
alumno.edad=18; };
};
%>
<%
if(request.getParameter("OK") != null)
{
http://www.programacionfacil.com/java_jsp/startº

alumno.inicializar();
out.println(alumno.nombre);
out.println(alumno.edad);
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog16.jsp METHOD=post>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=evento1 ><BR>");
out.println("</FORM>");
%>

Recordar no usar objetos OUT, Request en la parte declarativa de el programa, la razón ya se explico
anteriormente.
Para indicar a “java” durante cualquier proceso que la variable a utilizar es un campo de una clase se debera
utilizar el siguiente formato.
nomclase.nombredelcampo

TEMA 3: JAVA JSP ARCHIVOS (INTRODUCCION)


Si bien es cierto que ya se pueden manejar gran cantidad de datos del mismo y diferente tipo al mismo tiempo, el
problema es que al terminar de ejecutarse el programa los datos se pierden.
De esta situación nace el concepto de archivos que son medios que facilita el lenguaje para almacenar los datos
en forma permanente normalmente en los dispositivos de almacenamiento standar.
En general es necesario entender algunos conceptos elementales de sistemas de archivos tradicionales.
Como nota a tomar en cuenta los datos que se van almacenando en un archivo de disco se almacenan en
renglones consecutivos y cada renglon en disco se conoce como registro del archivo favor de no confundir el
concepto de registro de archivo y registro o estructura como variable ya analizada son dos cosas totalmente
diferentes aunque se llamen igual.
Operaciones basicas con archivos:
1. ESCRIBIR O GRABAR: Es la operacion mas elemental con un archivo consiste en tomar un o unos
datos en variables de cualquier tipo (escalar, mezcla de datos, arreglo, structuras) y almacenarlas en un archivo
de datos en disco.
2. LEER: Operación consistente en sacar los datos del archivo en disco y mandarlo o cargar la variable
respectiva
Organización de archivos:
En general existen dos tipos de archivos:
1. Archivos Secuenciales.- En este caso los datos se almacenan en forma consecutiva y no es posible leer
(recuerdan que significa esta operación) ningun registro (recuerdan la nota de arriba) directmente es decir para
leer el registro n, se debera recorrer o accesar los n-1 registros anteriores.
2. Archivos Directos o Random.- Para este caso si se puede acceder o leer un renglon n cualquiera.
Tipo de archivos:
A) En general, existen tantos tipos de archivos como tipos de datos existen es decir existen archivos de bytes, de
chars, de ints, de floats, etc.
ATENCION: Ya que se decide utilizar algun archivo especifico de datos (caracteres, strings, formateados,
registros o arreglos) solo utilizar las funciones de escritura y lectura de ese tipo de archivo por ningun motivo
mezcle funciones de lectura y escritura de otro tipo de archivos.
Almacenamiento en arhivos:
http://www.programacionfacil.com/java_jsp/startº

1. Modo Texto: en este caso los datos son almacenados usando codigp ascii y por tanto son plenamente
visibles usando cualquier editor.
2. Modo Binario: en este caso los datos son almacenados en notación hexadecimal y por tanto se ocupa un
editor binario para reconocerlos sin embargo un archivo binario es mas compacto que un archivo texto.

TEMA 4: JAVA JSP ARCHIVOS SECUENCIALES PLANOS


Existen ademas muchas otras operaciones asociadas a archivos las mas elementales son:
1.- Creación de Archivo.- En este proceso se pretende solamente crear un archivo nuevo en disco, con su
nombre, tipo y especialidad de almacenamiento de datos apropiado.
2.- Apertura de Archivos.- En este caso se pretende abrir un archivo ya existente en disco para procesarlo, ya sea
cargar o grabar datos en sus registros, o leer algun registro en especial para mandarlo a una variable de cualquier
tipo.
No confundir creación con apertura creación es un proceso que solo se ejecuta una sola vez en la vida de un
archivo, mientras que apertura siempre se esta realizando por los programas especializados en algun proceso.
3.-Cierre de archivos: Es la operación mas importante en cualquier programa que maneje archivos o se cierra el
archivo como ultima instrucción del pograma o se vera el anuncio ABORT,RETRY,FAIL.
98, /s, scandisk
4.-Altas en archivo.- En este proceso se carga una clase en memoria con sus datos pertinentes y se graba la clase
en el archivo en disco.
5.-Lectura de archivo.- En este proceso, se abre el archivo y se manda el registro de disco, a una clase en
memoria para su procesamiento.
6.- Consulta de archivos: En este proceso se pretende desplegar todos los registros del archivo en disco a la
pantalla ya sea consola o mejor aún, a una pagina html
7.-Busqueda en archivos: Una de las operaciones mas comunes, consiste en que el usuario pide toda la
información de algun renglon en disco, porporcionando la información de algun campo, generalmente el campo
clave de la clase.
8.- Filtros.- En este proceso el usuario esta interesado en algun conjunto de renglones con caracteristicas
comunes (condición), por ejemplo todos los alumnos de “sistemas”, o todos los empleados que ganen mas de
$500.00 pesos, o todos los clientes que sean de “tijuana”, etc
9.-Modificaciones de registros o archivos: Problema muy comun, donde los datos originales ya grabados se
tienen que cambiar o actualizar, por ejemplo el nombre no era “juan” es “juana”, o la calificación no es 100 es
20, etc.
10.- Bajas de registros: tambien muy comun este proceso por ejemplo el alumno ya egreso, el cliente huyo, etc.

TEMA 5: GRABACION ARCHIVO SECUENCIAL JAVA JSP


Grabación y lectura son los dos procesos mas comunes con archivos disco en cualquier lenguaje de
programación.
Codigo de grabación:
Prog17.jsp

<%@ page import="java.io.*" %>


<%
// declarando
int clave=0;String nombre=""; float estatura=0;
// creando un objeto de tipo archivo

DataOutputStream archivo = null;


if(request.getParameter("INSERTAR") != null)
{
// capturando datos
clave=Integer.parseInt(request.getParameter("CLAVE"));
nombre=request.getParameter("NOMBRE");
estatura=Float.parseFloat(request.getParameter("ESTATURA"));
try {
// creando archivo en append
archivo = new DataOutputStream(new FileOutputStream("c:\\archivo1.dat",true));
// grabando al archivo
archivo.writeInt(clave);
archivo.writeUTF(nombre);
http://www.programacionfacil.com/java_jsp/startº

archivo.writeFloat(estatura);
out.println(clave+": registro grabado");
}
catch(FileNotFoundException fnfe) {}
catch (IOException ioe) {};
// cerrando el archivo
archivo.close();
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog17.jsp METHOD=post>");
out.println("CLAVE :<INPUT TYPE=TEXT NAME=CLAVE><BR>");
out.println("NOMBRE :<INPUT TYPE=TEXT NAME=NOMBRE><BR>");
out.println("ESTATURA :<INPUT TYPE=TEXT NAME=ESTATURA><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=INSERTAR VALUE=GRABAR ><BR>");
out.println("</FORM>");
%>

Se usa una clase llamada FileOutputStream, especializada en archivos con muchos metodos y constructores para
crear, manipular y procesar archivos el constructor usado solo lleva dos parametros, el primero todo la ruta o
path a donde quedara el archivo(cuidado con no poner la doble diagonal \\) y el segundo parametro es la palabra
“true”, esto es para que el archivo se abra en modo llamado “APPEND”, es decir que cada nuevo registro se
vaya escribiendo al final del archivo, si no se pone este parametro(true), un nuevo registro se sobreescribiria
sobre el registro anterior.
Sin embargo en el programa no se uso solo FILEOUTPUSTREAM ( solo para crear el archivo), tambien se usa
DATAOUTPUTSTREAM, esta segunda clase es derivada de la anterior y comparte muchos de sus metodos, la
diferencia es que fileoutputstream esta especializada en grabar y leer bytes, mientras que dataoutputstream esta
especializada en grabar y leer datos formateados, observar que los metodos que uso el objeto archivo para grabar
o almacenar datos se especializan en algun tipo de dato en especial, sus otros metodos son:

Method Summary
“void” flush”()” Flushes this data output stream.
“int” size”()” Returns the current value of the counter “written”, the number of bytes written to this data
output stream so far.
“void” write”(byte[] b, int off, int len)“
Writes “len” bytes from the specified byte array starting at offset “off” to the underlying output stream.
“void” write”(int b)” Writes the specified byte (the low eight bits of the argument “b”) to the underlying output
stream.
“void” writeBoolean”(boolean v)” Writes a “boolean” to the underlying output stream as a 1-byte value.
“void” writeByte”(int v)“
Writes out a “byte” to the underlying output stream as a 1-byte value.
“void” WriteBytes (String s) Writes out the string to the underlying output stream as a sequence of bytes.
http://www.programacionfacil.com/java_jsp/startº

“void” writeChar”(int v)” Writes a “char” to the underlying output stream as a 2-byte value, high byte first.
“void” WriteChars (String s) writes a string to the underlying output stream as a sequence of characters.
“void” writeDouble”(double v)“
Converts the double argument to a “long” using the “doubleToLongBits” method in class “Double”,
and then writes that “long” value to the underlying output stream as an 8-byte quantity, high byte first.
“void” writeFloat”(float v)” Converts the float argument to an “int” using the “floatToIntBits” method in class
“Float”, and then writes that “int” value to the underlying output stream as a 4-byte quantity, high byte
first.
“void” writeInt”(int v)“
Writes an “int” to the underlying output stream as four bytes, high byte first.
“void” writeLong”(long v)“
Writes a “long” to the underlying output stream as eight bytes, high byte first.
“void” writeShort”(int v)“
Writes a “short” to the underlying output stream as two bytes, high byte first.
“void” writeUTF (String str) writes a string to the underlying output stream using UTF-8 encoding in a
machine-independent manner.

TABLA TOMADA DEL API DE JAVA


Observar que la grabación lleva un try-catch filenotfound y ioexception, que son obligatorios o no compila el
programa.
No olvidar cerrar el archivo, con la instruccion archivo.close

TEMA 6: LECTURA ARCHIVO Secuencial JAVA JSP


El Proceso de Lectura de los Registros de la ONU Archivo Secuencial es realmente Sencillo, Como he Muestra
El Siguiente codigo EJEMPLO;

Prog18.jsp:
<% @ Page import = "java.io. *"%>
<%
/ / Declarando
int clave = 0; cadena nombre = ""; Estatura float = 0;
/ / Creando la ONU Objeto de tipo, Archivo
DataInputStream Archivo = null;
if (request.getParameter ("LECTURA")! = null)
{
/ / Construyendo Una tabla html
out.println ("<HTML> <TABLE Border=10 CellPadding=5> <TR>");
out.println ("<th bgcolor=Green> CLAVE </ th> <th bgcolor=White> NOMBRE </ th> <th bgcolor=Red>
Estatura </ td> </ TR>");
try {
/ / Abriendo Archivo
Archivo = new DataInputStream (new FileInputStream ("c: \ \ archivo1.dat"));
/ / Ciclo de Lectura del Archivo
while (true) {

out.println ("<TR>");
clave = archivo.readInt ();
out.println ("<TD>" + clave + "</ TD>");
nombre = archivo.readUTF ();
out.println ("<TD>" + Nombre + "</ TD>");
Estatura = archivo.readFloat ();
out.println ("<TD>" + Estatura + "</ TD>");
out.println ("</ TR>");
}}
catch (FileNotFoundException fnfe) {}
catch (IOException ioe) {};
archivo.close ();
};
/ / Construyendo forma dinamica
http://www.programacionfacil.com/java_jsp/startº

out.println ("<FORM ACTION=prog18.jsp METHOD=POST>");


out.println ("<input type=submit NAME=LECTURA VALUE=leer> <BR>");
out.println ("</ FORM>");
%>

Notas:
Observar en codigo Que Ahora sí USAN Y FileInputStream DataInputStream clases de COMO.
En FileInputStream sólo sé USO El parametro de abrir Archivo (no El verdadero añadir de) Como ya sí
menciono ESTAS clases en sí especializan en Archivos secuenciales.
El Ciclo de Lectura sí realiza las Naciones Unidas Con while (true)
Los metodos de DataInputStream SON:

Method Summary
leer "(byte [] b)"
"Int"
Ver el contrato general de la "leer" el método de "DataInput".
leer "(byte [] b, int off, int len)"
"Int"
Ver el contrato general de la "leer" el método de "DataInput".
readBoolean "()"
"Booleano"
Ver el contrato general de la "readBoolean" método de "DataInput".
readByte "()"
"Byte"
Ver el contrato general de la "readByte" método de "DataInput".
ReadChar "()"
"Char"
Ver el contrato general de la "ReadChar" método de "DataInput".
readDouble "()"
"Doble"
Ver el contrato general de la "readDouble" método de "DataInput".
readFloat "()"
"Flotar"
Ver el contrato general de la "readFloat" método de "DataInput".
readFully "(byte [] b)"
"Vacío"
Ver el contrato general de la "readFully" método de "DataInput".
readFully "(byte [] b, int off, int len)"
"Vacío"
Ver el contrato general de la "readFully" método de "DataInput".
readInt "()"
"Int"
Ver el contrato general de la "readInt" método de "DataInput".
Cadena

con: BufferedReader d
= New BufferedReader (new InputStreamReader (in)); |
"Largo" |
http://www.programacionfacil.com/java_jsp/startº

readLong"()"

Ver el contrato general de la "readLong" método de "DataInput". |


readShort "()"
"Corto"
Ver el contrato general de la "readShort" método de "DataInput".
readUnsignedByte "()"
"Int"
Ver el contrato general de la "readUnsignedByte" método de "DataInput".
readUnsignedShort "()"
"Int"
Ver el contrato general de la "readUnsignedShort" método de "DataInput".
readUTF "()"
Cadena
Ver el contrato general de la "readUTF" método de "DataInput".
readUTF "(" DataInput "en)"
"Estática"
Lecturas de la corriente "en" una representación de una cadena de caracteres Unicode codificada en
String
Java modificado formato UTF-8, esta cadena de caracteres se devuelve como un "String".
skipBytes "(int n)"
"Int"
Ver el contrato general de la "skipBytes" método de "DataInput".

TEMA 7: BUSQUEDA ARCHIVOS SECUENCIALES JAVA JSP


Recordar que existen una serie de procesos basicos con archivos el famoso y antiguo ABC (altas, bajas,
consultas y modificaciones) con ellos.
Actualmente estos procesos o similares a ellos se llaman insertar, eliminar, editar, etc, en las modernas bases de
datos pero esto lo analizaremos mas adelante.
El primer proceso para un archivo secuencial es agregar una cantidad indefinida de registros al archivo este
proceso se resuelve o ejecutando una cantidad indeterminada de veces el programa de grabación ya hecho o
incluir un ciclo while en el mismo programa.
Un segundo proceso tambien comun, llamado consulta es desplegar todos los registros del archivo a la vez
problema tambien resuelto en el programa de lectura.
El tercer Proceso que “resolvemos” en este tema es la busqueda de un registro determinado, en este proceso el
usuario del programa quiere que se despliegue un y solo un registro de información, proporcionando un dato de
busqueda, generalmente la clave del registro.
La solucion es sencilla, solo tenemos que abrir el archivo para lectura, hacer un ciclo while(true) condicionar y
solo desplegar el registro cuando se cumpla la condición.

Codigo prog19.Java:
<%@ page import="java.io.*" %>
<%
// declarando
int clave=0;int claveb=0;String nombre=""; float estatura=0;
// creando un objeto de tipo archivo
DataInputStream archivo = null;
if(request.getParameter("BUSCAR") != null)
{
// construyendo tabla html
out.println("<HTML><TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>ESTATURA</th></TR>");
// capturando clave a buscar
claveb=Integer.parseInt(request.getParameter("CLAVEB"));
try {
// abriendo archivo
archivo = new DataInputStream(new FileInputStream("c:\\archivo1.dat"));
while(true){
clave=archivo.readInt();
nombre=archivo.readUTF();
estatura=archivo.readFloat();
if (claveb==clave){
out.println("<TR>");
http://www.programacionfacil.com/java_jsp/startº

out.println("<TD>"+clave+"</TD>");
out.println("<TD>"+nombre+"</TD>");
out.println("<TD>"+estatura+"</TD>");
out.println("</TR>");
}}}
catch(FileNotFoundException fnfe) {}
catch (IOException ioe) {};
archivo.close();
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog19.jsp METHOD=post>");
out.println("CLAVE BUSCAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=BUSCAR VALUE=buscar><BR>");
out.println("</FORM>");
%>

TEMA 8: JAVA JSP FILTROS o CONDICIONES


Como su nombre lo indica en este proceso se pretende desplegar todo un conjunto de renglones que cumplan con
la condición por ejemplo se pide desplegar todos los alumnos de “sistemas” o todos los empleados que sean de
“sinaloa”, etc.
Filtros se usan para obtener información acerca de un subconjunto de renglones de el archivo.

Codigo prog20 jsp


<%@ page import="java.io.*" %>
<%
// declarando
int clave=0;float est=0;String nombre=""; float estatura=0;
// creando un objeto de tipo archivo
DataInputStream archivo = null;
if(request.getParameter("FILTRAR") != null)
{
// construyendo tabla html
out.println("<HTML><TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>ESTATURA</th></TR>");
// capturando filtro
est=Float.parseFloat(request.getParameter("ESTATURA"));
try {
// abriendo archivo
archivo = new DataInputStream(new FileInputStream("c:\\archivo1.dat"));
while(true){
clave=archivo.readInt();
nombre=archivo.readUTF();
http://www.programacionfacil.com/java_jsp/startº

estatura=archivo.readFloat();
if (estatura>=est){
out.println("<TR>");
out.println("<TD>"+clave+"</TD>");
out.println("<TD>"+nombre+"</TD>");
out.println("<TD>"+estatura+"</TD>");
out.println("</TR>");
}}}
catch(FileNotFoundException fnfe) {}
catch (IOException ioe) {};
archivo.close();
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog20.jsp METHOD=post>");
out.println("ESTATURA >=:<INPUT TYPE=TEXT NAME=ESTATURA><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=FILTRAR VALUE=Filtrar><BR>");
out.println("</FORM>");
%>

Seria mas interesante construir un programa donde el filtro se construya con dos comboboxs y un textbox para el
dato(recordar definición de condición simple) y de esta manera se podra construir un programa que filtre por
cualuier campo y por cualquier operador relacional, pero este programa es la

TEMA 9: JAVA JSP BAJA O ELIMINACION ARCHIVO SECUENCIAL


Eliminar o dar de baja en un archivo secuencial, implica tener que estar procesando dos archivos a la vez, el
segundo de ellos es un archivo temporal, un algoritmo de eliminacion fisica quedaria como:
Procedimiento :
1.- Abrir el archivo original en modo letcura.
2.- Abrir un archivo llamado temporal en modo escritura.
3.- Iniciar un ciclo de lectura del archivo original.
3a.- Dentro del ciclo leer el primer registro.
3b.- Validar el registro si no es eliminable, se escribe al
archivo temporal.
3c.- Fin de ciclo (cerrar el ciclo).
4.- Cerrar ambos archivos.
5.- eliminar el archivo original.
6.- renombrar el archivo temporal con el nombre de archivo original.
Una segunda tecnica, consiste en agregar un campo de estado (status) al registro, tal como se vio en el curso
anterior:
Sin embargo el proceso de baja se tiene que realizar en un sistema de información, para resolver este problema la
respuesta es agregar un campo especial llamado status que puede ser de tipo char, con algunos caracteres de
http://www.programacionfacil.com/java_jsp/startº

control que se puedan cargar en el por ejemplo una 'a' siginifica que esta en alta, una 'b' significa que esta en
baja, etc.
Lo unico que se tiene que hacer, es que cuando se agrega o manda el registro por primera vez a disco, mandarlo
cargado el campo de status con 'a' y estar validando con if siempre este campo en cualquier proceso de busqueda
o condicion o despliegue, si se encuentra cargado con 'b' entonces solo avisar al usuario que esta de baja dicho
registro.”
A continuación damos un ejemplo de eliminación fisica:

Prog21 jsp
<%@ page import="java.io.*" %>

<%
// declarando
int clave=0;int claveb=0;String nombre=""; float estatura=0;
// creando un objeto de tipo archivo
DataInputStream archivo = null;
DataOutputStream archivot = null;
if(request.getParameter("ELIMINAR") != null)
{
// capturando clave a eliminar
claveb=Integer.parseInt(request.getParameter("CLAVEB"));
try {
// abriendo archivos
archivo = new DataInputStream(new FileInputStream("c:\\archivo1.dat"));
archivot = new DataOutputStream(new FileOutputStream("c:\\temp.dat",true));
while(true){
clave=archivo.readInt();
nombre=archivo.readUTF();
estatura=archivo.readFloat();
if (claveb!=clave){
archivot.writeInt(clave);
archivot.writeUTF(nombre);
archivot.writeFloat(estatura);
}}}
catch(FileNotFoundException fnfe) {}
catch (IOException ioe) {};
// cerrando archivos
archivo.close();
archivot.close();
// eliminando original renombrando temporal
File file1 = new File("c:\\archivo1.dat");
File file2 = new File("c:\\temp.dat");
if (file1.exists()) {file1.delete();};
file2.renameTo(file1);
// avisando
out.println("REGISTRO ELIMINADO");
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog21.jsp METHOD=post>");
out.println("CLAVE ELIMINAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=ELIMINAR VALUE=Eliminar><BR>");
out.println("</FORM>");
%>
http://www.programacionfacil.com/java_jsp/startº

TEMA 10: OPERACIONES CON CAMPOS JAVA JSP


Este es tambien un caso comun con los elementos de un archivo, sin embargo es tambien facil de resolver.
Solo usar los dos archivos el original y el temporal y antes de grabarse al temporal hacer la operacion
correspondiente, como lo muestra el siguiente ejemplo.

Prog22.jsp
<%@ page import="java.io.*" %>
<%
// declarando
int clave=0;String nombre=""; float estatura=0;
// creando dos objetos de tipo archivo uno para escritura y otro para lectura
DataInputStream archivo = null;
DataOutputStream archivot = null;
if(request.getParameter("SUMAR") != null)
{
try {
// abriendo archivos
archivo = new DataInputStream(new FileInputStream("c:\\archivo1.dat"));
archivot = new DataOutputStream(new FileOutputStream("c:\\temp.dat",true));
while(true){
clave=archivo.readInt();
nombre=archivo.readUTF();
estatura=archivo.readFloat();
// sumando
estatura = estatura + 5;
// grabando a temporal
archivot.writeInt(clave);
archivot.writeUTF(nombre);
archivot.writeFloat(estatura);
}}
catch(FileNotFoundException fnfe) {}
catch (IOException ioe) {};
// cerrando archivos
archivo.close();
archivot.close();
// eliminando original renombrando temporal
File file1 = new File("c:\\archivo1.dat");
File file2 = new File("c:\\temp.dat");
if (file1.exists()) {file1.delete();};
file2.renameTo(file1);
// avisandoout.println("ESTATURAS SUMADAS ");
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog22.jsp METHOD=post>");
out.println("<INPUT TYPE=SUBMIT NAME=SUMAR VALUE=EST+5><BR>");
out.println("</FORM>");
http://www.programacionfacil.com/java_jsp/startº

%>

prog22.jsp:

Corrida prog18.jsp

TEMA 11: EDICION DE REGISTROS JAVA JSP


Editar registros significa cambiar el contenido de algunos de los campos o columnas por nueva informacíón o
para corregir algun error de captura original o para agregar alguna columna que no existia por modificación de la
tabla o la base de datos.
La solucion es similar a los temas anterior, es decir se ocupan los dos archivos el original y el temporal y ya sea
que se modifique una sola clave o se modifiquen todos los registros, el ejemplo que se construye va mostrando
los registros del archivo y pregunta y modifica o edita el registro pedido.

Prog23.jsp
<%@ page import="java.io.*" %>
<%
// declarando
int clave=0;int claveb=0;String nombre=""; float estatura=0;
// creando un objeto de tipo archivo
DataInputStream archivo = null;
DataOutputStream archivot = null;
// codigo de busqueda
String temp1=request.getParameter("BUSCAR");
if(temp1==null)temp1=" ";
if(temp1.compareTo("buscar")==0)
{
// capturando clave a buscar
claveb=Integer.parseInt(request.getParameter("CLAVEB"));
try {
// abriendo archivo
archivo = new DataInputStream(new FileInputStream("c:\\archivo1.dat"));
http://www.programacionfacil.com/java_jsp/startº

while(true){
clave=archivo.readInt();
nombre=archivo.readUTF();
estatura=archivo.readFloat();
if (claveb==clave){
out.println("<FORM ACTION=prog23.jsp METHOD=post>");
out.println("CLAVE :<INPUT TYPE=TEXT NAME=CLAVE value="+clave+"><BR>");
out.println("<INPUT TYPE=HIDDEN NAME=CLAVEB value="+claveb+"><BR>");
out.println("NOMBRE :<INPUT TYPE=TEXT NAME=NOMBRE value=\""+nombre+"\"><BR>");
out.println("ESTATURA :<INPUT TYPE=TEXT NAME=ESTATURA value="+estatura+"><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=EDITAR VALUE=editar><BR>");
out.println("</FORM>");
}
}}
catch(FileNotFoundException fnfe) {}
catch (IOException ioe) {};
archivo.close();
};
// codigo de edicion
String temp2=request.getParameter("EDITAR");
if(temp2==null)temp2=" ";
if(temp2.compareTo("editar")==0){
try {
// abriendo archivos
archivo = new DataInputStream(new FileInputStream("c:\\archivo1.dat"));
archivot = new DataOutputStream(new FileOutputStream("c:\\temp.dat",true));
// cargando clave de edicion
claveb=Integer.parseInt(request.getParameter("CLAVEB"));
while(true){
clave=archivo.readInt();
nombre=archivo.readUTF();
estatura=archivo.readFloat();
if (claveb != clave){
archivot.writeInt(clave);
archivot.writeUTF(nombre);
archivot.writeFloat(estatura);
}
else{
// capturando y grabando nuevos datos
clave=Integer.parseInt(request.getParameter("CLAVE"));
nombre=request.getParameter("NOMBRE");
estatura=Float.parseFloat(request.getParameter("ESTATURA"));
archivot.writeInt(clave);
archivot.writeUTF(nombre);
archivot.writeFloat(estatura);
};
}}
catch(FileNotFoundException fnfe) {}
catch (IOException ioe) {};
// cerrando archivos
archivo.close();
archivot.close();
// eliminando original renombrando temporal
File file1 = new File("c:\\archivo1.dat");
File file2 = new File("c:\\temp.dat");
if (file1.exists()) {file1.delete();};
file2.renameTo(file1);
// avisando
out.println("REGISTRO EDITADO");
};
http://www.programacionfacil.com/java_jsp/startº

// construyendo forma dinamica


out.println("<FORM ACTION=prog23.jsp METHOD=post>");
out.println("CLAVE ELIMINAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=BUSCAR VALUE=buscar><BR>");
out.println("</FORM>");
%>

TEMA 12: GRAFICOS JAVA JSP


Campos de graficos o de imagenes se han convertido en elementos importantes de cualquier base de datos.
Para manejar este elemento:
1.- Es un metodo sencillo, primero subir las imagenes ( de preferencia jpg) con un ftp normal a tusitio y al folder
principal de el servidor, en este caso ROOT ( para el lws).
http://www.programacionfacil.com/java_jsp/startº

2.- Usar el tag <img src> de html EN EL PROGRAMA jsp.


3.- agregar un campo de string llamado fotourl o foto o url a el registro en el archivo secuencial y cargarlo con el
nombre de la imagen por ejemplo pato.jpg, MUCHO OJO este paso exije que se tengan que reconstruir todos los
programas anteriores para incluir este nuevo campo y volver a crear los archivos de ejemplos.

prog24.jsp
<%@ page import="java.io.*" %>
<%
// declarando
int clave=0;int claveb=0;String nombre=""; float estatura=0;String foto="";
// creando un objeto de tipo archivo
DataInputStream archivo = null;
if(request.getParameter("BUSCAR") != null)
{
// construyendo tabla html
out.println("<HTML><TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>ESTATURA</th><th>FOTOGRAFIA</TH></TR>");
// capturando clave a buscar
claveb=Integer.parseInt(request.getParameter("CLAVEB"));
try {
// abriendo archivo
archivo = new DataInputStream(new FileInputStream("c:\\archivo1.dat"));
while(true){
clave=archivo.readInt();
nombre=archivo.readUTF();
estatura=archivo.readFloat();
foto=archivo.readUTF();
if (claveb==clave){
out.println("<TR>");
out.println("<TD>"+clave+"</TD>");
out.println("<TD>"+nombre+"</TD>");
out.println("<TD>"+estatura+"</TD>");
out.println("<TD><img src=http:\\\\localhost\\progs\\"+foto+"></TD>");
out.println("</TR>");
}}}
catch(FileNotFoundException fnfe) {}
catch (IOException ioe) {};
archivo.close();
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog24.jsp METHOD=post>");
out.println("CLAVE BUSCAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=BUSCAR VALUE=buscar><BR>");
out.println("</FORM>");
%>

nota:
Observar que en img src debe ir la dirección internet del servidor por ejemplo http:\\misitio.com\pato.jpg, sin
embargo en el programa se esta usando http:\\\\localhost\\pato.jpg, en cuanto a localhost se puede sustituir por
el dominio ejemplo laurosoto.com, y en cuanto porque se usaron cuatro \\
recordar que en java dentro de una string las secuencias de escape ( \a, \r etc) van precedidas del simbolo \, por
esa causa para mandar un \ a la pagina se tiene que usar la secuencia de escape
y como la dirección incluia
al principio y una diagonal \ al final se mandaron \\
y
respectivamente.
http://www.programacionfacil.com/java_jsp/startº

UNIDAD 6: JAVA JSP ARCHIVOS DIRECTOS

TEMA 1: INTRODUCCION REGISTROS ARCHIVOS


SE DICE QUE UN ARCHIVO ES DE ACCESO U ORGANIZACION DIRECTA CUANDO PARA
ACCEDER A UN REGISTRO N CUALESQUIERA NO SE TIENE QUE PASAR POR LOS N-1 REGISTROS
ANTERIIORES.
Como se observa de esta definición los archivos directos tienen una gran ventaja( son mucho mas rapidos)
cuando se comparan con los archivos de acceso u organizacion secuencial estudiados en la unidad anterior.
Aunque lo anterior no quiere decir que son mejores que los secuenciales, es decir es el propio problema
planteado quien exigira una solucion u otra, por ejemplo si se quiere construir un archivo para almacenar los
datos de un guestbook, si se construye de manera directa seria muy rapido pero si lo construimos de manera
secuencial, se podran almacenar datos con cantidades de información mas adecuados al problema.
Es decir un archivo de acceso directo tiene que tener sus registros o renglones de un tamaño fijo o
predeterminado de antemano.
En java archivos de acceso directo pertenecen a la clase RANDOMACCESSFILE esta clase contiene muchas
propiedades algunas de las cuales se muestran aqui, estas propiedades se estaran usando mucho en esta unidad.
Un archivo de acceso directo permite posicionar el apuntador de interno de registros, a cualquier registro
determinado sin necesidad de pasar por todos los registros anteriores, usando las siguientes funciones.

Constructor Summary
RandomAccessFile”(“File “file,” String “mode)“
Creates a random access file stream to read from, and optionally to write to, the file specified by the “File”
argument.
RandomAccessFile”(“String “name,” String “mode)“
Creates a random access file stream to read from, and optionally to write to, a file with the specified name.
Method Summary
close”()“
“void” Closes this random access file stream and releases any system resources associated with the
stream.
getFD”()“
FileDescriptor
Returns the opaque file descriptor object associated with this stream.
getFilePointer”()“
“long”
Returns the current offset in this file.
“long” length”()“
http://www.programacionfacil.com/java_jsp/startº

Returns the length of this file.


read”()“
“int”
Reads a byte of data from this file.
read”(byte[] b)“
“int”
Reads up to “b.length” bytes of data from this file into an array of bytes.
read”(byte[] b, int off, int len)“
“int”
Reads up to “len” bytes of data from this file into an array of bytes.
readBoolean”()“
“boolean”
Reads a “boolean” from this file.
readByte”()“
“byte”
Reads a signed eight-bit value from this file.
readChar”()“
“char”
Reads a Unicode character from this file.
readDouble”()“
“double”
Reads a “double” from this file.
readFloat”()“
“float”
Reads a “float” from this file.
readFully”(byte[] b)“
“void”
Reads “b.length” bytes from this file into the byte array, starting at the current file pointer.
readFully”(byte[] b, int off, int len)“
“void”
Reads exactly “len” bytes from this file into the byte array, starting at the current file pointer.
readInt”()“
“int”
Reads a signed 32-bit integer from this file.
readLine”()“
String
Reads the next line of text from this file.
readLong”()“
“long”
Reads a signed 64-bit integer from this file.
readShort”()“
“short”
Reads a signed 16-bit number from this file.
readUnsignedByte”()“
“int”
Reads an unsigned eight-bit number from this file.
readUnsignedShort”()“
“int”
Reads an unsigned 16-bit number from this file.
readUTF”()“
String
Reads in a string from this file.
seek”(long pos)“
“void” Sets the file-pointer offset, measured from the beginning of this file, at which the next read or
write occurs.
setLength”(long newLength)“
“void”
Sets the length of this file.
skipBytes”(int n)“
“int”
Attempts to skip over “n” bytes of input discarding the skipped bytes.
write”(byte[] b)“
“void” Writes “b.length” bytes from the specified byte array to this file, starting at the current file
pointer.
write”(byte[] b, int off, int len)“
“void”
Writes “len” bytes from the specified byte array starting at offset “off” to this file.
write”(int b)“
“void”
Writes the specified byte to this file.
writeBoolean”(boolean v)“
“void”
Writes a “boolean” to the file as a one-byte value.
“void” writeByte”(int v)“
http://www.programacionfacil.com/java_jsp/startº

Writes a “byte” to the file as a one-byte value.


writeBytes”(“String “s)“
“void”
Writes the string to the file as a sequence of bytes.
writeChar”(int v)“
“void”
Writes a “char” to the file as a two-byte value, high byte first.
writeChars”(“String “s)“
“void”
Writes a string to the file as a sequence of characters.
writeDouble”(double v)“
“void” Converts the double argument to a “long” using the “doubleToLongBits” method in class
“Double”, and then writes that “long” value to the file as an eight-byte quantity, high byte first.
writeFloat”(float v)“
“void” Converts the float argument to an “int” using the “floatToIntBits” method in class “Float”, and
then writes that “int” value to the file as a four-byte quantity, high byte first.
writeInt”(int v)“
“void”
Writes an “int” to the file as four bytes, high byte first.
writeLong”(long v)“
“void”
Writes a “long” to the file as eight bytes, high byte first.
writeShort”(int v)“
“void”
Writes a “short” to the file as two bytes, high byte first.
writeUTF”(“String “str)“
“void”
Writes a string to the file using UTF-8 encoding in a machine-independent manner.
Fuente: JAVA SUN

TEMA 2: JAVA JSP CREACION ARCHIVOS DIRECTOS DISCO


En este proceso se pretende solamente crear un archivo directo en disco.

Prog25 jsp
<%@ page import="java.io.*" %>
<%
// creando e inicializando los campos del registro
// observar que se debe usar clases numericas apropiadas
int clave=0;
String nombre="";
int edad=0;
if(request.getParameter("CREAR") != null)
{
// abriendo archivo, capturando y grabando datos
try {
//* Creando y grabando a un archivo*/
File arch=new File("c:\\archivo2.dat");
RandomAccessFile archivo=new RandomAccessFile(arch,"rw");
archivo.close();
} catch(FileNotFoundException fnfe) { /* Archivo no encontrado */ }
catch (IOException ioe) { /* Error al escribir */ }
// avisando
out.println("ARCHIVO DIRECTO CREADO");
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog25.jsp METHOD=post>");
out.println("<INPUT TYPE=SUBMIT NAME=CREAR VALUE=\"CREACION ARCHIVO\" ><BR>");
out.println("</FORM>");
%>
http://www.programacionfacil.com/java_jsp/startº

Recordar que la estructura que se uso para crear el archivo se debera usar siempre y con el mismo orden
cuando se acceda al archivo con los procesos u operaciones anteriormente mencionados.
Observar que es parecido a la creación de archivos secuenciales.
Lo primero que se crea es un objeto de tipo FILE que se usa como parametro para crear el archivo de tipo
RANDOMACCESSFILE.
Respetar las dos diagonales en el path del disco duro donde quedara el archivo directo.
Observar el doble diagonal() en el parametro. Como segundo paso se crea el archivo con la
instruccion: RandomAccessFile archivo=new RandomAccessFile(arch,”rw”); El primer parametro o
argumento en esta función es la unidad de disco y el nombre del archivo. El segundo parametro o argumento es
llamado modo y es una de los varios modos que podemos usar. “r” → Lectura. “w” → Escritura. “rw” →
Crea para lectura y escritura y si ya existe, sobreescribe. Cuando se ha finalizado de escribir al archivo se debe
cerrar y esto se hace con la instrucción: Archivo.close(); Recordar estudiar todos los metodos de la clase
RANDOMACCESFILE. TAREAS PROGRAMACION JAVA JSP Crear archivos directos de alumnos,
provedores, libros, productos, peliculas.

TEMA 3: GRABACION Y LECTURA DISCO JAVA JSP


Estos dos procesos son los casos mas comunes y frecuentes que se pueden realizar con un archivo de disco.
GRABACION DE UNA ESTRUCTURA A UN ARCHIVO EN DISCO

Prog26.jsp
<%@ page import="java.io.*" %>
<%
// creando e inicializando los campos del registro
int clave=0;
String nombre="";
int edad=0;
if(request.getParameter("GRABAR") != null)
{
// abriendo archivo, capturando y grabando datos
try {
file arch=new File("c:\\archivo2.dat");
RandomAccessFile archivo=new RandomAccessFile(arch,"rw");
// capturando registro
clave=Integer.parseInt(request.getParameter("CLAVE"));
nombre=request.getParameter("NOMBRE");
edad=Integer.parseInt(request.getParameter("EDAD"));
// procesando la string para que quede de tamano fijo
if (nombre.length() < 25)
{ for(int i=nombre.length(); i <25; i++)
nombre=nombre+" ";}
http://www.programacionfacil.com/java_jsp/startº

else{ nombre=nombre.substring(0,25); };
// mandando el apuntador interno del archivo
// al final del archivo
if (archivo.length()!= 0){archivo.seek( archivo.length() );};
// grabando registro
archivo.writeInt(clave);
archivo.writeChars(nombre);
archivo.writeInt(edad);
// cerrando archivo
archivo.close();
} catch(FileNotFoundException fnfe) { /* Archivo no encontrado */ }
catch (IOException ioe) { /* Error al escribir */ }
// avisando
out.println("REGISTRO INSERTADO");
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog26.jsp METHOD=post>");
out.println("CLAVE :<INPUT TYPE=TEXT NAME=CLAVE><BR>");
out.println("NOMBRE :<INPUT TYPE=TEXT NAME=NOMBRE><BR>");
out.println("EDAD :<INPUT TYPE=TEXT NAME=EDAD><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=GRABAR VALUE=INSERTAR ><BR>");
out.println("</FORM>");
%>

Observar que es completamente similar a programa de archivos secuenciales, solo que es necesario que se usen
las claves con la secuencia 0,1,2,3,4,5…..
La primera observación es que se esta usando el modo “rw”, reestudiar la clase de modos de apertura.
Recordar que un archivo directo tiene un tamaño de registro predifinido y es importante qu dicho tamaño se
respete, para el caso de las variables strings dentro del codigo se estan ajustando a 25 caracteres, si la string es
mas corta que dicho tamaño se tendra que ampliar con caracteres en blanco ” ”, si el tamaño es mas grande la
string se tendra que recortar con el metodo substring(), como se muestra en el programa ejemplo.
Tambien es importante recordar que java grabara cada caracter de la string usando dos(2) bites en disco, es
decir el registro ejemplo quedara grabado en disco en 58 BYTES, 50 para la string y 4 bytes por cada entero, es
importante conocer el tamaño de registros grabados en disco porque esta información se usara ampliamente en
el resto de los programas de esta unidad.
Las metodos de grabación que se estan usando son:
Archivo.writeInt() y archivo.writeChars().
Recordar estudiar todos los metodos de la clase RANDOMACCESSFILE.
LECTURA CONSULTA DESPLIEGUE DE REGISTROS

Prog27.jsp
<%@ page import="java.io.*" %>
<%
// creando e inicializando los campos del registro
http://www.programacionfacil.com/java_jsp/startº

int clave=0;
String nombre="";
int edad=0;
// se ocupa el tamano del registro
// y recordar que cada carcater de la string, java lo almacena en dos bytes
// en total la string de 25 caracteres se almacenara en 50 bytes
// mas dos ints de 4 bytes c/u nos da en total
long treg=58;
if(request.getParameter("OK") != null)
{
// abriendo archivo
try {
File arch=new File("c:\\archivo2.dat");
RandomAccessFile archivo=new RandomAccessFile(arch,"rw");
// calculando cantidad de registros
long creg=archivo.length()/treg;
// empezando tabla html para desplegar
out.println("<HTML><TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>EDAD</th></TR>");
// iniciando ciclo lectura archivo
for (long r=0; r < creg; r++)
{
// leyendo el registro
clave=archivo.readInt();
//leyendo string
for(int i = 0; i < 25; ++i)
{ nombre += archivo.readChar(); };
edad=archivo.readInt();
// desplegando en tabla html
out.println("<TR>");
out.println("<TD>"+clave+"</TD>");
out.println("<TD>"+nombre+"</TD>");
out.println("<TD>"+edad+"</TD>");
out.println("</TR>");
**// limpiar string o java la encadena en la siguiente lectura**
nombre="";
}; // termina for
// fin tabla y cierre archivo
out.println("</table>");
archivo.close();
} catch(FileNotFoundException fnfe) { }
catch (IOException ioe) { }
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog27.jsp METHOD=post>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=desplegar ><BR>");
out.println("</FORM>");
%>
http://www.programacionfacil.com/java_jsp/startº

notas:
Primero se ocupa conocer la cantidad de registros que se encuentran almacenados en disco, para esto primero se
ocupan dos variables de tipo long treg y creg, la cantidad de registros se obtiene con la operación y metodos de
la clase RANDOMACCESSFILE siguientes:
creg=archivo.length()/treg;
Creo que esta muy claramente entendible como se consiguio la cantidad de registros, ya con esta información se
construye un ciclo for (puede ser cualquiera de los ciclos vistos) para empezar a recorrer renglon tras renglon del
archivo directo.
La unica nota a mencionar es que para leer la string se esta usando un ciclo de lectura de 25 caracteres y recordar
al final poner la string en nada =”” porque si no en la siguiente lectura se tendra la string encadenada a la
siguiente string.

TEMA 4: BUSQUEDA JAVA JSP


En este tema se analiza la busqueda de un registro o renglón determinado.
En este proceso el usuario del programa quiere que se despliegue un y solo un registro de información
proporcionando un dato de busqueda generalmente la clave del registro.
Recordar que en esta operación se muestra la diferencia fundamental entre archivos secuenciales y archivos
directos, es decir aqui si se puede acceder directamente un registro n cualesquiera.

Prog28.jsp
.<%@ page import="java.io.*" %>
<%
// creando e inicializando los campos del registro
int clave=0;
String nombre="";
int edad=0;
// se ocupa el tamano del registro
// y recordar que cada char de la string , java la almacena en dos bytes
// en total la string de 25 se almacena en 50 bytes
// mas dos ints de 4 bytes c/u nos da en total
long treg=58;
if(request.getParameter("BUSCAR") != null)
{
// capturando clave de busqueda
int claveb=Integer.parseInt(request.getParameter("CLAVEB"));
// abriendo archivo
try {
File arch=new File("c:\\archivo2.dat");
RandomAccessFile archivo=new RandomAccessFile(arch,"rw");
// moviendo apuntador interno a posicion deseada
archivo.seek(claveb * treg);
// leyendo registro
clave=archivo.readInt();
//leyendo la string 25 caracteres
http://www.programacionfacil.com/java_jsp/startº

for(int i = 0; i < 25; ++i)


{ nombre += archivo.readChar(); };
edad=archivo.readInt();
//desplegando en tabla html
// construyendo tabla html
out.println("<HTML><TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>EDAD</th></TR>");
out.println("<TR>");
out.println("<TD>"+clave+"</TD>");
out.println("<TD>"+nombre+"</TD>");
out.println("<TD>"+edad+"</TD>");
out.println("</TR></table>");
// limpiar la string o java encadena con la siguiente busqueda
nombre="";
// cerrando archivo
archivo.close();
} catch(FileNotFoundException fnfe) { }
catch (IOException ioe) { }
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog28.jsp METHOD=post>");
out.println("CLAVE BUSCAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=BUSCAR VALUE=buscar ><BR>");
out.println("</FORM>");
%>

Como se desprende del programa usando archivo.seek() es posible posicionarse en cualquier byte del archivo.
El formato usado seek() es:
Archivo.seek1);
Recordar que debemos posicionar el apuntador interno de registros, al principio o inicio del registro que se
quiere, por ejemplo en este ejemplo el inicio del registro (1 juan perez 22) se encuentra en el byte 59, pero java
inicia una lectura o una escritura en el BYTE ANTERIOR para este caso la lectura debe tener el apuntador
interno de registros en el BYTE 58, y si se multiplica la clave 1 por el tamaño de registro 58, adivinar que BYTE
SE OBTIENE.
Como va a estar dificil que se le atine a un byte determinado, es por eso que en el programa mejor se deja que
sea el propio servidor quien calcule el byte donde empieza un registro determinado usando la formula algebraica
(clave * tamaño de registro).

TEMA 5: FILTROS CONDICIONES JAVA JSP

Otro problema similar al anterior es el de filtros o condiciones, es decir en muchas ocasiones es necesario
obtener información acerca de un subconjunto de renglones de el archivo.
http://www.programacionfacil.com/java_jsp/startº

Por ejemplo todos los estudiantes que sean mayores de 17 años, o todos los clientes que sean de Tijuana, etc. a
esto le llamamos filtros o condiciones.
Tambien se resuelve de manera similar a los de archivos secuenciales es decir usando un ciclo de lectura de todo
el archivo e ir desplegando todos los registros que cumplan la condicion.

Prog29.jsp
<%@ page import="java.io.*" %>
<%
// creando e inicializando los campos del registro
int clave=0;
String nombre="";
int edad=0;
long treg=58;
if(request.getParameter("FILTRAR") != null)
{
// abriendo archivo
try {
File arch=new File("c:\\archivo2.dat");
RandomAccessFile archivo=new RandomAccessFile(arch,"rw");
// calculando cantidad de registros
long creg=archivo.length()/treg;
// empezando tabla html para desplegar
out.println("<HTML><TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>EDAD</th></TR>");
// capturando condicion de busqueda
int edadb=Integer.parseInt(request.getParameter("EDADB"));
// iniciando ciclo lectura archivo
for (long r=0; r < creg; r++)
{
// leyendo los registros
clave=archivo.readInt();
//leyendo string
for(int i = 0; i < 25; ++i)
{ nombre += archivo.readChar(); };
edad=archivo.readInt();
// desplegando en tabla html incluyendo condicion
if (edad >= edadb)
{ out.println("<TR>");
out.println("<TD>"+clave+"</TD>");
out.println("<TD>"+nombre+"</TD>");
out.println("<TD>"+edad+"</TD>");
out.println("</TR>");
// limpiando string
nombre="";
};
//limpiando string otra vez
nombre="";
}; // termina if y for
// fin tabla y cierre de arcgivo
out.println("</table>");
archivo.close();
} catch(FileNotFoundException fnfe) { }
catch (IOException ioe) { }
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog29.jsp METHOD=post>");
out.println("EDAD >= <INPUT TYPE=TEXT NAME=EDADB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=FILTRAR VALUE=filtrar ><BR>");
out.println("</FORM>");
http://www.programacionfacil.com/java_jsp/startº

%>

Como se observa es un problema y una solución similar al tema anterior de busquedas.

TEMA 6: JAVA JSP BAJAS O ELIMINACIONES


Eliminación o bajas es el proceso por medio del cual algunos registros del archivo son purgados del archivo,
existen dos maneras por las cuales se puede realizar ese proceso.
En la primera manera se usan dos archivos, el archivo original y un archivo temporal, el procedimiento o
algoritmo es muy sencillo, se lee el registro del archivo original y si no es el registro a eliminar entonces se
almacena en el archivo temporal, cuando se termina de procesar todo el archivo original, el archivo temporal
solo contendra todos los registros que no se quisieron eliminar, ya con estos dos archivo se procede a eliminar o
borrar usando las instrucciones vistas en el capitulo anterior y se procede a renombrar usando la instrucciónes
vistas sobre el archivo temporal como nuevo archivo original.
Sin embargo en archivos directos no se puede ni se debe eliminar fisicamente registros de los archivos, porque
recordar, que la clave del registro esta enlazada directamente a la posición que dicho registro tiene en disco y no
seria muy conveniente estarle cambiando la matricula al alumno cada rato o el numero de serie al auto, etc.
Aparte de que con esta manera de eliminar incluso fisicamente los registros del archivo es que no hay manera de
recuperar esa información posteriormente.
Es por eso que otra tecnica común de eliminación es incluir un campo de estado, status o bandera o semaforo en
el registro y conforme se va cargando el registro y antes de mandarlo a disco se le agrega a dicho campo el
caracter 'A' –>alta, asi que cuando se quiera una baja solo se pondria dicho campo en 'B' y todos los programas
de lectura, busqueda y filtros deberan revisar esta campo de estado antes de hacer algo con el registro.
TAREAS PROGRAMACION JAVA JSP
Construir programas de eliminacion usando el metodo de bajas logicas como se indica en el ultimo parrafo para
los archivos construidos.
TEMA 7: JAVA JSP OPERACIONES CON CAMPOS
En este tema se analiza la manera de poder realizar operaciones o procesos con los campos de los registros en el
archivo directo, lo unico importante a considerar es que los campos del registro son en cierta medida igual que
variables normales y por tanto se pueden procesar de manera normal como lo muestra el ejemplo.

prog30 jsp
<%@ page import="java.io.*" %>
<%
// creando e inicializando los campos del registro
int clave=0;
String nombre="";
int edad=0;
long treg=58;
if(request.getParameter("OK") != null)
{
// abriendo archivo
http://www.programacionfacil.com/java_jsp/startº

try {
File arch=new File("c:\\archivo2.dat");
RandomAccessFile archivo=new RandomAccessFile(arch,"rw");
// calculando cantidad de registros
long creg=archivo.length()/treg;
// iniciando ciclo lectura archivo
for (long r=0; r < creg; r++)
{
// leyendo registro
clave=archivo.readInt();
//leyendo string
for(int i = 0; i < 25; ++i)
{ nombre += archivo.readChar(); };
edad=archivo.readInt();
// realizando operacion
edad=edad + 100;
//regresando apuntador y regrabando con cambio
archivo.seek( archivo.getFilePointer() -treg);
archivo.writeInt(clave);
archivo.writeChars(nombre);
archivo.writeInt(edad);
// limpiando string
nombre="";
};
archivo.close();
// avisando
out.println(" PROCESO CONCLUIDO ");
} catch(FileNotFoundException fnfe) { }
catch (IOException ioe) { }
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog30.jsp METHOD=post>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=EDAD+100 ><BR>");
out.println("</FORM>");
%>

corrida programa despliegue:


http://www.programacionfacil.com/java_jsp/startº

como se observa la solución es muy sencilla solo se ocupa:


1.- leer fread() el registro, esto mueve el apuntador al siguiente registro.
2.- modificar registro
3.- regresar a posición anterior con seek()
4.- grabar el registro corregido
y no se ocupan los dos archivos como en el caso secuencial.

TEMA 8: EDICION MODIFICACION DE REGISTROS JAVA JSP


Modificar o editar un registro es uno de los procesos mas comunes con archivos en disco, generalmente despues
de un fuerte proceso de captura de registros, una revisión o consulta general muestra muchos de ellos con errores
de captura.
La primera parte del programa es el programa normal de busqueda que ya se construyo en temas anteriores, pero
al desplegar el registro se debera construir una forma dinamica que incluya los datos a modificar del registro.
La segunda parte del programa toma los datos, los almacena en el registro en memoria luego se posiciona en el
registro en disco a modificar con seek() y se regraban con write().

Prog31.jsp
<%@ page import="java.io.*" %>
<%
// creando e inicializando los campos del registro
int clave=0;
String nombre="";
int edad=0;
long treg=58;
if(request.getParameter("BUSCAR") != null)
{
// capturando clave de busqueda
int claveb=Integer.parseInt(request.getParameter("CLAVEB"));
// abriendo archivo
try {
File arch=new File("c:\\archivo2.dat");
RandomAccessFile archivo=new RandomAccessFile(arch,"rw");
// moviendo apuntador interno a posicion deseada
archivo.seek(claveb * treg);
// leyendo registro
clave=archivo.readInt();
//leyendo la string 25 caracteres
for(int i = 0; i < 25; ++i)
{ nombre += archivo.readChar(); };
edad=archivo.readInt();
//desplegando en su propia forma y controles dinamicos
http://www.programacionfacil.com/java_jsp/startº

if (claveb==clave)
{
out.println("<FORM ACTION=prog31.jsp METHOD=post>");
out.println("CLAVE :"+clave+"<BR>");
out.println("NUEVO NOMBRE:<INPUT TYPE=TEXT NAME=NOMBRE value=\""+nombre+"\"><BR>");
out.println("NUEVA EDAD :<INPUT TYPE=TEXT NAME=EDAD value="+edad+"><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=EDITAR VALUE=editar><BR>");
out.println("<INPUT TYPE=HIDDEN NAME=CLAVEB value="+claveb+"><BR>");
out.println("</FORM>");
};
// limpiando string
nombre="";
// cerrando archivo
archivo.close();
} catch(FileNotFoundException fnfe) { }
catch (IOException ioe) { }
}; // fin metodo buscar
// codigo de metodo EDICION
String temp2=request.getParameter("EDITAR");
if(temp2==null)temp2=" ";
if(temp2.compareTo("editar")==0)
{
// capturando los nuevos datos
clave=Integer.parseInt(request.getParameter("CLAVEB"));
nombre=request.getParameter("NOMBRE");
edad=Integer.parseInt(request.getParameter("EDAD"));
// procesando la string para que quede de tamano fijo
if (nombre.length() < 25)
{ for(int i=nombre.length(); i <25; i++)
nombre=nombre+" ";}
else{ nombre=nombre.substring(0,25); };
//* abriendo archivo */
try {
File archt=new File("c:\\archivo2.dat");
RandomAccessFile archivot=new RandomAccessFile(archt,"rw");
// posicionando en registro a modificar
archivot.seek(clave * treg);
// regrabando
archivot.writeInt(clave);
archivot.writeChars(nombre);
archivot.writeInt(edad);
// cerrando archivo
archivot.close();
} catch(FileNotFoundException fnfe) { /* Archivo no encontrado */ }
catch (IOException ioe) { /* Error al escribir */ }
// avisando
out.println("REGISTRO EDITADO");
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog31.jsp METHOD=post>");
out.println("CLAVE EDITAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=BUSCAR VALUE=buscar ><BR>");
out.println("</FORM>");
%>
http://www.programacionfacil.com/java_jsp/startº

La unica instrucción nueva en este tema es que se usan dos variables de tipo FILE y RANDOMACCESSFILE
una de ellos para controlar la busqueda y la otra para controlar la modificación en disco, asimismo se uso un
campo hidden para pasar la información a el submit EDITAR.

TEMA 9: GRAFICOS JAVA JSP


Campos de graficos o de imagenes se han convertido en elementos importantes de cualquier base de datos.
Para manejar este elemento:
1.- Es un metodo sencillo primero subir las imagenes ( de preferencia jpg) con un ftp normal a tusitio y al folder
principal de el servidor, en este caso ROOT ( para el lws).
2.- Usar el tag <img src> de html EN EL PROGRAMA jsp.
3.- agregar un campo de string llamado fotourl o foto o url a el registro en el archivo secuencial y cargarlo con el
nombre de la imagen por ejemplo pato.jpg, MUCHO OJO este paso exije que se tengan que reconstruir otra vez
todos los programas anteriores para incluir este nuevo campo y volver a crear los archivos de ejemplos.

Prog32.jsp
http://www.programacionfacil.com/java_jsp/startº

<%@ page import="java.io.*" %>


<%
// creando e inicializando los campos del registro
int clave=0;
String nombre="";
int edad=0;
String foto="";
long treg=108;
if(request.getParameter("BUSCAR") != null)
{
// capturando clave de busqueda
int claveb=Integer.parseInt(request.getParameter("CLAVEB"));
// abriendo archivo
try {
File arch=new File("c:\\archivo2.dat");
RandomAccessFile archivo=new RandomAccessFile(arch,"rw");
// moviendo apuntador interno a posicion deseada
archivo.seek(claveb * treg);
// leyendo registro
clave=archivo.readInt();
//leyendo NOMBRE
for(int i = 0; i < 25; ++i)
{ nombre += archivo.readChar(); };
edad=archivo.readInt();
//leyendo FOTO
for(int i = 0; i < 25; ++i)
{ foto += archivo.readChar(); };
//desplegando en tabla html
out.println("<HTML><TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>ESTATURA</th><th>FOTOGRAFIA</TH></TR>");
out.println("<TR>");
out.println("<TD>"+clave+"</TD>");
out.println("<TD>"+nombre+"</TD>");
out.println("<TD>"+edad+"</TD>");
out.println("<TD><img src=http:\\\\localhost\\progs\\"+foto+"></TD>");
out.println("</TR></table>");
// limpiando string
nombre="";
// cerrando archivo
archivo.close();
} catch(FileNotFoundException fnfe) { }
catch (IOException ioe) { }
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog32.jsp METHOD=post>");
out.println("CLAVE BUSCAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=BUSCAR VALUE=buscar ><BR>");
out.println("</FORM>");
%>

nota:
Observar que en img src debe ir la dirección internet del servidor por ejemplo http:\\misitio.com\pato.jpg, sin
embargo en el programa se esta usando http:\\\\localhost\\pato.jpg, en cuanto a localhost se puede sustituir por
el dominio ejemplo laurosoto.com, y en cuanto porque se usaron cuatro \\
recordar que en java dentro de una string las secuencias de escape ( \a, \r etc) van precedidas del simbolo \, por
esa causa para mandar un \ a la pagina se tiene que usar la secuencia de escape y como la dirección incluia
al principio y una diagonal \ al final se mandaron
\\y respectivamente.
http://www.programacionfacil.com/java_jsp/startº

TEMA 3: JAVA JSP MYSQL TABLAS


Una Tabla simple, representa una unidad de información de una entidad física o lógica de información:
ej.:
Tabla Empleado:
 Clave Empleado
 Nombre Empleado
 Dirección Empleado
 Edad Empleado
 Teléfono Empleado
 etc. Empleado
Tabla Proveedor:
 Clave Proveedor
 Nombre Proveedor
 Empresa Proveedor
 Teléfono Proveedor
 Fax Proveedor
 Celular Proveedor
 etc. Proveedor
Tabla Autos:
 Numero de Serie
 Modelo
 Marca
 Tipo
 Color
 Capacidad
 etc.
REGLAS:
Observar que cada tabla empieza con una clave generalmente de tipo numérica.
Todos los elementos de la tabla solo hacen referencia hacia el mismo ente o sujeto de información.
Cada elemento solo representa o debe contener un solo dato de información.
No se respetan o siguen al pie de la letra estos tres postulados y empiezan los problemas al tiempo de
programación.
 Existe una segunda forma o manera de representar las tablas, ejemplo:

Tabla: Camisas
NUMCAMISA MARCA ESTILO MEDIDA COLOR MATERIAL
1 JEANS SPORT GRANDE AZUL ALGODON
2 VOLIS VESTIR MEDIANA NEGRA POLIESTER
3 GENERICA CAMISETA LARGA MORADO RARON
http://www.programacionfacil.com/java_jsp/startº

Tabla: Clientes
NUMCLIENTE NOMCLIENTE DIRCLIENTE TELCLIENTE
1 JUAN PEREZ AV ABA 2233 2345678
2 LUIS SANCHEZ CALLE ZETA 3434 4567899
3 ROSA MARES CALLEJON NORTE 567890

Recordar siempre, una tabla almacena o representa un conjunto de datos del mismo tipo o entidad, la tabla de
alumnos es para almacenar y manipular muchos alumnos, la tabla de productos es para almacenar y manipular
muchos alumnos, en resumen si en un problema de información solo se presenta una instancia o renglón de una
entidad lógica, entonces no es tabla, es un encabezado.
TAREAS PROGRAMACION JAVA JSP
1.-CONSTRUIR EN CUADERNO LAS SIGUIENTES TABLAS, LA MITAD DE ELLAS CON EL PRIMER
FORMATO Y LA SEGUNDA MITAD CON EL SEGUNDO FORMATO.
1.- PACIENTES
2.- PERROS
3.- PLUMAS
4.- MERCANCÍAS
5.- PELÍCULAS
6.- MEDICINAS
7.- MAESTROS
8.- MATERIAS
9.- COMPUTADORAS
10.- BANCOS

TEMA 6: JDBC SQL RESULTSET


EL MODELO DE DATOS DE JAVA DESCANSA EN UNA SERIE DE OBJETOS ESPECIALIZADOS QUE
FACILITAN EL PROCESAMIENTO DE UNA BASE DE DATOS.
Empezando:
El problema es comunicar un programa o aplicación con una base de datos y mas que comunicar se pretende que
el programa o aplicación realize una serie de procesos u operaciones con la base de datos o mejor aun con el
conjunto de tablas que contiene una base de datos.
La primera nota a recordar es que una base de datos puede estar fisicamente en el servidor y en algun folder o
directorio del disco duro de dicha maquina servidora por ejemplo, c:\pfacil\misitio\mibase.mbd, como se observa
la base que se construyo en access (mibase.mbd) se almaceno en el disco c en el folder pfacil y dentro del
subfolder misitio.
Sin embargo tambien es necesario conocer que asi como existen servidores de paginas (web server), servidores
de correo (mail server), servidores de ftp (ftp server), etc, tambien existen servidores de bases de datos (database
server), los mas comunes son el sqlserver de microsoft, oracle, mysql, etc, estos servidores tambien pueden
crear, administrar y procesar una base de datos por supuesto que el procedimiento que se dio para crearla en
access en el tema anterior no se puede usar para crear y cargar una base de datos en un servidor de bases de
datos.
El modo de comunicarse entre nuestro programa o aplicación y la base de datos (ya sea fisica o un dbserver)
implica que ambos manejen un lenguaje de programación comun, es decir no se puede mandar una instrucción
en csharp, o en basic o pascal a la base de datos y ademas esperar que esta ultima la entienda ( para entender
esto, una razon muy sencilla es que la base de datos tendria que conocer o comprender todos los lenguajes de
programación), para resolver este problema de comunicación es que se usa un lenguaje comun de bases de datos
que tanto los lenguajes de programación existentes como las bases de datos entienden, este lenguaje comun de
bases de datos es el SQL (structured query languaje) o lenguaje estructurado de consultas.
En otras palabras ustedes mis estimados lectores tendran que aprender este nuevo lenguaje de programación,
el SQL, la buena noticia es que es un lenguaje con muy pocas instrucciones y ademas existen muy buenos
tutoriales en internet que hay que buscar y estudiar.
Bueno las principales instrucciones de SQL que se usan en este curso son SELECT, INSERT, UPDATE y
DELETE.
La pregunta es ahora como mandamos las instrucciones sql a la base de datos, la respuesta son los
siguientes OBJETOS.
OBJETO JDBCODBCDRIVER:- Objeto que se utiliza para traducir las instrucciones del lenguaje SQL a las
instrucciones del lenguaje original de la base de datos.
http://www.programacionfacil.com/java_jsp/startº

OBJETO CONNECTION:- OBJETO QUE SE UTILIZA PARA ESTABLECER UNA CONECCION O


ENLACE A LA BASE DE DATOS.
OBJETO RESULTSET:- Es la representación en memoria de una de las tablas de la base de datos en disco, se
puede entender como una tabla virtual, recordar que generalmente todos los procesos que se realizen con la tabla
(insertar registros, eliminar registros, etc) se realizaran realmente contra un resulset y no provocaran ningun
cambio en la tabla fisica en disco, resulset tiene un conjunto de metodos muy utiles y muy usados para el proceso
de los renglones de la tabla virtual.
OBJETO STATEMENT:- Este objeto y sus dos metodos executequery(solo para select de sql) y
executeupdate( solo para insert, update y delete de sql) son los metodos que se utilizaran para comunicarse con la
tabla fisica en disco.

Ejemplo:
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String sitiobase = "c:/progfacil/lauro/mibase.mdb";
String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + sitiobase;
try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};

TEMA 7: CONSULTA O DESPLIEGUE O SELECCION JAVA JSP


Existen una serie de operaciones y procesos que son muy comunes contra una tabla en una base de datos en
disco, la mas común es desplegar todos los renglones de la tabla que estan almacenados en disco, a este proceso
le llamaremos SELECCION, consulta o despliegue.
Como se indico anteriormente la comunicación con la base de datos se tendran que dar usando el lenguaje
especializado de bases de datos llamado SQL(structured query language), la instrucción sql que se usa para
resolver este problema tiene el siguiente formato:
SELECT [listacampos, * o ALL] FROM TABLA;
El procedimiento que se intenta seguir cuando se construya un programa asp.net que tenga que manipular una
tabla en disco debera seguir los siguientes pasos:
1.- Crear una conección o enlace a la base de datos.
2.- Abrir la conección a la base de datos.
3.- Crear el enlace y cargarlo con la instruccion sql
4.- Crear el RESULTSET y cargarlo
5.- Cargar un objeto table de html con el RESULTSET
6.- Procesar el table de html
7.- Cerrar rsultset, statement, driver o conección
prog33.jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>
<%
// declarando y creando objetos globales
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String sitiobase = "c:/pfacil/mibase.mdb";
String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + sitiobase;
// detectando y cargando el objeto submit de html
if(request.getParameter("OK") != null)
{
// abriendo canal o enlace en su propio try-catch
try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
http://www.programacionfacil.com/java_jsp/startº

} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};


//leyendo tabla en disco y pasandola al resultset
try { tabla = instruccion.executeQuery("select * from mitabla");
// empezando a construir una tabla html
out.println("<TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>EDAD</th></TR>");
// mandando resultset a una tabla html
// y ciclo de lectura del resultset
while(tabla.next()) {
out.println("<TR>");
out.println("<TD>"+tabla.getString(1)+"</TD>");
out.println("<TD>"+tabla.getString(2)+"</TD>");
out.println("<TD>"+tabla.getString(3)+"</TD>");
out.println("</TR>"); }; // fin while
out.println("</TABLE></CENTER></DIV></HTML>");
// cerrando resultset
tabla.close(); instruccion.close(); canal.close();} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e) {};
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog33.jsp METHOD=post>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=CONSULTA><BR>");
out.println("</FORM>");
%>

notas:
1.- revisar con cuidado el programa, proque como todo buen programa lleva incluida mucha documentación o
explicación.
2.- Se sigue el procedimiento generico para procesar tablas
3.- Observar y siempre incluir los import's indicados.
4.- Se empieza creando las variables globales a ocupar y abriendo la conección a la base de datos, si se les hace
muy grande la string del provedor, pueden cargarla primero en una variable string y carguen la string en el
constructor de la conección, pero esto es opcional.
5.- Tomar nota como se hace una referencia a la base de datos, esto es en c:/pfacil/mibase.mdb ( ojo con las
diagonales)
6.- Se crea el enlace y se carga el resultset(o tabla en memoria) con la instrucción sql y la coneccion, aqui es
necesario entender que existen varias maneras de hacer este proceso.
7.- Luego se crea el resultset(tabla) y se cargo con toda la base de datos en disco
8.- Posteriormente se carga el TABLE DE HTML con el resultset.
9.- Para visitar o procesar todos los renglones de la tabla del dataset se usa un ciclo while, y el metodo
RESULTSET.NEXT() y por el nombre se ve que existen otros metodos utiles para navegar por todos los
renglones de resultset, tales como last(), prior() etc.
10.- Para procesar un dato, celda o columna de un renglon cualesquiera se usa el siguiente metodo
RESULTSET.GETSTRING(numerocolumna o nombrecolumna).
11.- ES MUY IMPORTANTE ESTUDIAR TODOS LOS METODOS DEL RESULTSET PORQUE LES
FACILITARA MUCHOS PORBLEMAS DE MANIPULACION DE TABLAS, CONSULTAR LA
DOCUMENTACION DE SDK DE JAVA.
12.- observar tambien que los objetos resultset, statement y drivermanager(conección), deben cerrarse al final del
programa, y se cierran en el mismo orden como fueron abiertos.
12.1.- como nota aclaratoria al ultimo punto si no se cierran resultset, statement y drivemanager() dentro del
programa, el servidor bloqueara(locking) el acceso a la base de datos y ya no permitira mas uso de la base de
datos, es facil saber cuando esta bloqueada una base de datos porque en el directorio donde se encuentra
mibase.mdb ahora estara un nuevo archivo llamado mibase.ldb y no se puede eliminar con windows, para
eliminarlo de manera normal parar el servidor de java lws y luego abrir mibase.mdb con el access normal y
cerrar, con este proceso ya debera desaparecer la mase bloqueada (mibase.ldb).
12.2- mas claro aún, NO OLVIDAR USAR LOS TRES CLOSE() que puse en el programa ejemplo.
http://www.programacionfacil.com/java_jsp/startº

TEMA 8: INSERCION O ADICION DE REGISTROS SQL INSERT JAVA JSP


Insertar o agregar registros o renglones nuevos a una tabla en disco, es un proceso sencillo que usa la siguiente
instrucción sql:
INSERT INTO TABLA(CAMPO1,CAMPO2..) VALUES(VALOR1,VALOR2..);
Recordar que solo se esta usando lo minimo de cada instrucción sql es conveniente estudiar un tutorial de sql.
Prog34.jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>
<%! int cargarclave(){
// funcion para cargar nueva clave del nuevo registro a insertar
int cla =0;
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String sitiobase = "c:/pfacil/mibase.mdb";
String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + sitiobase;
try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
try {
tabla = instruccion.executeQuery("select * from mitabla");
// solo nos vamos al ultimo registro del resultset
tabla.last();
// y se lee la primera columna del ultimo renglon
cla = Integer.parseInt(tabla.getString(1));
// numreng=tabla.getRow();
tabla.close();instruccion.close(); canal.close();
} catch(SQLException ex){};
// ademas se debera regrasar incrementada en una unidad
return cla+1;
} //fin funcion cargarclave()
%>
<%
if(request.getParameter("GRABAR") != null)
{
// objetos de enlace
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String sitiobase = "c:/pfacil/mibase.mdb";
String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + sitiobase;
// cargando la nueva clave que tendra el registro a insertar
int clave;
clave= cargarclave();
// abriendo otra vez el canal o enlace en su propio try-catch
try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
//cargando los demas campos a grabar
String nombre = request.getParameter("NOMBRE");
int edad = Integer.parseInt(request.getParameter("EDAD"));
// USANDO SQL insert into tabla values(clave, 'nom', edad);
String q="insert into mitabla values(" +clave +",'"+ nombre+"',"+edad+") ";
// cuidado con los apostrofes que debe llevar la string arriba
try {
// agregando renglon (insert)
int n=instruccion.executeUpdate(q);
http://www.programacionfacil.com/java_jsp/startº

//avisando que se hizo la instruccion


out.println("REGISTRO INSERTADO");
} catch(SQLException e) {out.println(e);};
try{
// observar que tabla.close() no se usa aqui porque no se regreso un resultset de la base en disco
// solo usar tabla.close() cuando se usa un SQL SELECT
instruccion.close();
canal.close();
} catch(SQLException e) {out.println(e);};
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog34.jsp METHOD=post>");
out.println("CLAVE :"+cargarclave()+"<BR>");
out.println("NOMBRE :<INPUT TYPE=TEXT NAME=NOMBRE><BR>");
out.println("EDAD :<INPUT TYPE=TEXT NAME=EDAD><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=GRABAR VALUE=INSERTAR ><BR>");
out.println("</FORM>");
%>

prog 33:

El programa esta bien documentado.


se usa el metodo RESULTSET.LAST() para irse al ultimo renglon de la tabla en memoria o RESULTSET.
Luego se lee la primera columna del ultimo renglon de la tabla, para cargar la ultima clave grabada.
El metodo o declaracion devuelve el valor de la ultima clave que esta en el ultimo renglon de la tabla,
incrementada en una unidad.
Se crea la string q, con el formato apropiado sql( como se dijo al principio de este tema).
OBSERVAR QUE EXISTEN DOS METODOS PARA EL OBJETO STATEMENT:
a) STATEMENT.EXECUTEQUERY()→ USARLO PARA SQL SELECT
b) STATEMENT.EXECUTEUPDATE()→ USARLO PARA SQL INSERT, UPDATE, DELETE.

TEMA 9: BUSQUEDA SQL SELECT JAVA JSP


En este tema se analiza la busqueda de un registro o renglón determinado en este proceso el usuario del
programa quiere que se despliegue un y solo un registro de información proporcionando un dato de busqueda
generalmente la clave del registro.
La solucion es sencilla, solo usar otra vez la instruccion select, con el siguiente formato:
SELECT [ *, all, campos] FROM TABLA WHERE clave=claveabuscar;
Y RESULTSET.EXECUTEQUERY().
les recuerdo que deben buscar y estudiar un buen tutorial de sql.

Prog35.jsp
http://www.programacionfacil.com/java_jsp/startº

<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>


<%
// declarando y creando objetos globales
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String sitiobase = "c:/pfacil/mibase.mdb";
String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + sitiobase;
if(request.getParameter("OK") != null)
{
// abriendo canal o enlace en su propio try-catch
try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
// preparando condicion de busqueda
int clave = Integer.parseInt(request.getParameter("CLAVEB"));
// construyendo select con condicion
String q="select * from mitabla where clave="+clave;
// mandando el sql a la base de datos
try { tabla = instruccion.executeQuery(q);
// mandando resultset a tabla html
out.println("<TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>EDAD</th></TR>");
while(tabla.next()) {
out.println("<TR>");
out.println("<TD>"+tabla.getString(1)+"</TD>");
out.println("<TD>"+tabla.getString(2)+"</TD>");
out.println("<TD>"+tabla.getString(3)+"</TD>");
out.println("</TR>"); }; // fin while
out.println("</TABLE></CENTER></DIV></HTML>");
} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e) {};
try {tabla.close();instruccion.close();canal.close();} catch(SQLException e) {};
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog35.jsp METHOD=post>");
out.println("CLAVE BUSCAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=BUSCAR><BR>");
out.println("</FORM>");
%>
nota: no hay nada nuevo es una combinación de los dos programas anteriores con las mismas notas, solo se usa
un input text para pedir la clave, aunque se puede usar cualquier campo para buscar.
Tambien recordar que el resultset despues de la busqueda solo queda cargado con el renglón que el canal se trajo
de la base de datos.
Corrida:
http://www.programacionfacil.com/java_jsp/startº

TEMA 10: FILTROS JAVA JSP


Otro Problema similares al anterior es El de Filtros es Decir en Muchas Ocasiones es necesario Obtener
Información Acerca De las Naciones Unidas subconjunto de renglones de la tabla.
Por EJEMPLO Todos los Estudiantes Que sean Mayores de 17 Años, Todos Los Clientes Que sean de Tijuana,
etc, una ESTO le llamamos o Filtros CONDICIONES.
Tambien en sí Resuelve de Manera similares al anterior, es Decir usando la Instrucción etc seleccionar, a partir
de tabla, donde CONDICION ; RESULTSET.EXECUTEQUERY con ().

Prog36.jsp
<% @ Page import = "java.io. *, java.util .*, java.net .*, java.sql .*"%>

<%
/ / Declarando y Creando Objetos Globales
Canal de conexión = null;
ResultSet tabla = null;
Instrucción sentencia = null;
Sitiobase cadena = "c: / pfacil / mibase.mdb";
Strcon cadena = "jdbc: odbc: Driver = {Microsoft Access Driver (*. mdb)}; DBQ =" + sitiobase;
if (request.getParameter ("OK")! = null)
{
/ / Abriendo el canal o enlace en Su Propio try-catch
try {Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
Canal = DriverManager.getConnection (strcon);
Instrucción canal.createStatement = (ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} Catch (java.lang.ClassNotFoundException e) {} catch (SQLException e) {};
/ / Preparando condicion de busqueda
int Edad = Integer.parseInt (request.getParameter ("Edad"));
Cadena q = "select * from mitabla donde Edad> =" + Edad;
/ / El sql mandando al estilo de la Base de Datos
try {tabla instruccion.executeQuery = (q);
/ / Mandando un conjunto de resultados html tabla
out.println ("<TABLE Border=10 CellPadding=5> <TR>");
out.println ("<th bgcolor=Green> CLAVE </ th> <th bgcolor=White> NOMBRE </ th> <th bgcolor=Red>
EDAD </ td> </ TR>");
while (tabla.next ()) {
out.println ("<TR>");
out.println ("<TD>" + tabla.getString (1 )+"</ TD> ");
out.println ("<TD>" + tabla.getString (2 )+"</ TD> ");
out.println ("<TD>" + tabla.getString (3 )+"</ TD> ");
out.println ("</ TR>");} / / fin mientras
out.println ("</ TABLE> </ CENTER> </ DIV> </ HTML>");
http://www.programacionfacil.com/java_jsp/startº

} / / Fin tratar de no USAR, al final, de dos o mas atrapa


catch (SQLException e) {};
try {tabla.close (); instruccion.close (); canal.close ();} catch (SQLException e) {};
};
/ / Construyendo forma dinamica
out.println ("<FORM ACTION=prog36.jsp METHOD=POST>");
out.println ("EDAD> = <input type=text NAME=EDAD> <BR>");
out.println ("<input type=submit NAME=OK VALUE=FILTRAR> <BR>");
out.println ("</ FORM>");
%>
Nota: Siguen siendo Combinaciones de los Programas Anteriores Pero seria Prudente Mejor USAR dos
combobox Uno párrafo variable de la, Otro Para El Operador Relacional y de las Naciones Unidas Para El dato
de texto y mandar Estós Tres Datos al prog36.jsp Pero ESO Qaeda de Tarea.
Corrida:

TEMA 11: OPERACIONES CON CAMPOS JAVA JSP


Este es tambien un caso comun con elementos de una tabla, sin embargo es tambien facil de resolver.
Es necesario recordar primero algunas cosas elementales:
1.- Recordar que el numero de columna en una tabla empieza en 1, esto es que para realizar alguna operación por
ejemplo la columna edad del ejemplo que estamos siguiendo, su numero de columna es la 2.
2.- La operación que se plantee se puede realizar con todos los renglones de la tabla o con un solo renglon de la
tabla(del resultset).
3.- En el ejemplo se realiza la operación con todos los renglones de la tabla y no olvidar que se tiene que usar
la instruccion sql Update para que la nueva información se actualize en disco, recordar que los cambios que se
hacen a la tabla, es realmente al resultset, que a su vez es una tabla o base de datos en la memoria de la maquina
del cliente o usuario, y estos cambios hay que actualizarlos o pasarlos o UPDATE a la base de datos en disco.
El siguiente programa le aumenta 50 a todas las edades.

Prog37.jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>
<%
if(request.getParameter("OK") != null)
{
// declarando y creando objetos y variables
int edad, clave;
String q;
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
http://www.programacionfacil.com/java_jsp/startº

String sitiobase = "c:/pfacil/mibase.mdb";


String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + sitiobase;
// crando canal o enlace
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
// cargando el resultet
try {
tabla = instruccion.executeQuery("select * from mitabla");
} catch(SQLException e) {};
// operaciones en el resultset
while(tabla.next()){
clave = tabla.getInt(1);
edad =tabla.getInt(3);
edad=edad+50;
// actualizacion
q="update mitabla set edad= "+edad+ " where clave = "+clave+";";
try{
instruccion.executeUpdate(q);
// cargando otra vez el resultset actualizado
tabla = instruccion.executeQuery("select * from mitabla");
// dejando apuntador en renglon apropiado
// absolute() es equivalente a un seek() en c++
tabla.absolute(clave);
}catch(SQLException e) {}; };//fin while
try {canal.close();instruccion.close();tabla.close();} catch(SQLException e) {};
out.println("EDADES AUMENTADAS");
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog37.jsp METHOD=post>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=EDAD+50><BR>");
out.println("</FORM>");
%>
nota: programa autoanotado.
prog.jsp

TEMA 12: BAJA O ELIMINACION SQL DELETE JAVA JSP


Eliminación es Otro Proceso sencillo y comun Con las bases de Datos El Modelo Que ESTAMOS usando liebre
Este Tipo de Operaciones Muy faciles:
La Instrucción sql un USAR es: DELETE FROM TABLA EN CONDICION
Y RESULTSET.EXECUTEUPDATE ()

Prog38.jsp
<% @ Page import = "java.io. *, java.util .*, java.net .*, java.sql .*"%>
<%
/ / Declarando y Creando Objetos Globales
Canal de conexión = null;
http://www.programacionfacil.com/java_jsp/startº

ResultSet tabla = null;


Instrucción sentencia = null;
Sitiobase cadena = "c: / pfacil / mibase.mdb";
Strcon cadena = "jdbc: odbc: Driver = {Microsoft Access Driver (*. mdb)}; DBQ =" + sitiobase;
if (request.getParameter ("OK")! = null)
{
/ / Abriendo el canal o enlace en Su Propio try-catch
try {Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
Canal = DriverManager.getConnection (strcon);
Instrucción = canal.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} Catch (java.lang.ClassNotFoundException e) {} catch (SQLException e) {};
/ / Preparando condicion de eliminacion
int clave = Integer.parseInt (request.getParameter ("CLAVEB"));
/ / Construyendo seleccione Con condicion eliminacion SQL DELETE
Cadena q = "eliminar de mitabla donde clave =" + clave;
/ / SQL mandando una tabla en discoteca
try {instruccion.executeUpdate (q);
/ / Avisando
out.println ("Registro eliminado");
} / / Fin tratar de no USAR, al final, de dos o mas atrapa
catch (SQLException e) {}
catch (java.lang.NullPointerException e) {};
ry {
/ / No cerrar OCUPA tabla ()
instruccion.close (); canal.close ();} catch (SQLException e) {};
};
/ / Construyendo forma dinamica
out.println ("<FORM ACTION=prog38.jsp METHOD=POST>");
out.println ("ELIMINAR CLAVE: <input type=text NAME=CLAVEB> <BR>");
out.println ("<input type=submit NAME=OK VALUE=ELIMINAR> <BR>");
out.println ("</ FORM>");
%>

Prog-← tabla original,

pro38.html

prog33.jsp
http://www.programacionfacil.com/java_jsp/startº

TEMA 13: EDICION DE REGISTROS SQL UPDATE JAVA JSP


Editar registros significa cambiar el contenido de algunos de los campos o columnas por nueva informacíón o
para corregir algun error de captura original o para agregar alguna columna que no existia por modificación de la
tabla o la base de datos.
En general se tiene otro problema de sql UPDATE, sin embargo ahora se tendran que construir dos metodos uno
de busqueda normal y otro de actualizacion estos metodos son:
1.- BUSQUEDA: programa normal de busqueda por clave, pero ahora debera construir una forma.html
dinamica, que contendra un form action apuntando o ejecutandose a si mismo es decir prog39.jsp, ademas
tendra todos los input text necesarios para cargar cada celda del renglon de busqueda.
2.- EDICION: recoje los datos ya modificados de la forma.html dinamica y realiza directamente un sql update en
la base de datos
prog39.jsp
<code>
<%@ page import=“java.io.*, java.util.*, java.net.*, java.sql.*” %>
<%
metodo BUSCAR con forma dinamica if(request.getParameter(“BUSCAR”) != null) {
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String sitiobase = “c:/pfacil/mibase.mdb”; String strcon= “jdbc:odbc:Driver={Microsoft Access Driver
(*.mdb)};DBQ=” + sitiobase;
try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); canal=DriverManager.getConnection(strcon);
instruccion=canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
}
catch(java.lang.ClassNotFoundException e){}
catch(SQLException e) {};
int clave = Integer.parseInt(request.getParameter(“CLAVEB”));
String q=“select * from mitabla where clave=”+clave;
try {
tabla = instruccion.executeQuery(q);
tabla.next();
out.println(”<FORM ACTION=prog39.jsp METHOD=POST>”);
out.println(“CLAVE:<INPUT TYPE=TEXT NAME=CLAVE VALUE=”+ tabla.getString(1)+ ”><BR>”);
out.println(“NOMBRE:<INPUT TYPE=TEXT NAME=NOMBRE VALUE= ”+ tabla.getString(2)+ ”><BR>”);
out.println(“EDAD:<INPUT TYPE=TEXT NAME=EDAD VALUE= ”+ tabla.getString(3)+ ”><BR>”);
out.println(”<INPUT TYPE=SUBMIT NAME=EDITAR VALUE=EDITAR><BR>”);
tabla.close();
instruccion.close();
canal.close();
http://www.programacionfacil.com/java_jsp/startº

} catch(SQLException e) {}
catch(Exception ex){};
};
//fin evento buscar
//evento EDITAR String temp2=request.getParameter(“EDITAR”);
if(temp2==null)temp2=” ”;
if(temp2.compareTo(“EDITAR”)==0) {
String nombre,q ;
int clave, edad;
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String sitiobase = “c:/pfacil/mibase.mdb”; String strcon= “jdbc:odbc:Driver={Microsoft Access Driver
(*.mdb)};DBQ=” + sitiobase;
try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); canal=DriverManager.getConnection(strcon);
instruccion=canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
}
catch(java.lang.ClassNotFoundException e){}
catch(SQLException e) {};
try {
tabla = instruccion.executeQuery(“select * from mitabla”);
} catch(SQLException e) {};
clave = Integer.parseInt(request.getParameter(“CLAVE”));
nombre = request.getParameter(“NOMBRE”);
edad = Integer.parseInt(request.getParameter(“EDAD”));
q = “UPDATE mitabla SET ”+ “NOMBRE='”+ nombre+ ”', EDAD=”+ edad+” WHERE clave=” +
clave+”;”;
try{instruccion.executeUpdate(q);
}catch(SQLException e) {};
try {
tabla.close();
instruccion.close();
canal.close();
} catch(SQLException e) {};
out.println(“REGISTRO EDITADO”);
};
//fin evento editar
construyendo forma out.println(”<FORM ACTION=prog39.jsp METHOD=post>”);
out.println(“CLAVE EDITAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>”);
out.println(”<INPUT TYPE=SUBMIT NAME=BUSCAR VALUE=BUSCAR ><BR>”);
out.println(”</FORM>”); %> <code>
Veamos la corrida completa: (tabla original)
http://www.programacionfacil.com/java_jsp/startº

prog39.jsp
forma dinamica que construye

nueva tabla

TEMA 14: GRAFICOS JAVA JSP


Campos de graficos o de imagenes, se han convertido en elementos importantes de cualquier base de datos.
Para manejar este elemento con java-jsp existen dos maneras:
1.- Agregar un campo BLOB a la tabla en microsoft access y usar componentes especializados en imagenes tanto
para subirlas como para desplegar la imagen.
Este metodo provoca que la base de datos crezca mucho recordar que una imagen aun de tipo jpg ocupa mucho
espacio.
2.- El segundo metodo es mas sencillo, primero subir las imagenes ( de preferencia jpg) con un ftp normal a
tusitio y despues usar el tag <img src> de html y ademas agregar un campo de texto llamado fotourl o foto a
la tabla en access y grabar la direccion http de la imagen en este campo, por
ejemplo http://programacionfacil.com/tusitio/pato.jpg
Despues solo cargar este tag imageurl en la pagina que se construira que no es otra cosa que el programa de
busqueda con el despliegue del campo extra, como lo muestra el programa ejemplo.

Prog40.jsp

<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>


<%
http://www.programacionfacil.com/java_jsp/startº

// declarando y creando objetos globales


Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String sitiobase = "c:/pfacil/mibase.mdb";
String strcon= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + sitiobase;
if(request.getParameter("OK") != null)
{
// abriendo canal o enlace en su propio try-catch
try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
// preparando condicion de busqueda
int clave = Integer.parseInt(request.getParameter("CLAVEB"));
// construyendo select con condicion
String q="select * from mitabla where clave="+clave;
// mandando el sql a la base de datos
try { tabla = instruccion.executeQuery(q);
// mandando resultset a tabla html
out.println("<TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>EDAD</th></TR>");
while(tabla.next()) {
out.println("<TR>");
out.println("<TD>"+tabla.getString(1)+"</TD>");
out.println("<TD>"+tabla.getString(2)+"</TD>");
out.println("<TD>"+tabla.getString(3)+"</TD>");
out.println("<TD><img src=http:\\\\localhost\\progs\\"+tabla.getString(4)+"></TD>");
// y lo del monton de \\\\\ ver el ultimo tema de la unidad anterior
out.println("</TR>"); }; // fin while
out.println("</TABLE></CENTER></DIV></HTML>");
} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e) {};
try {tabla.close();instruccion.close();canal.close();} catch(SQLException e) {};
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog40.jsp METHOD=post>");
out.println("CLAVE BUSCAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=BUSCAR><BR>");
out.println("</FORM>");
%>
Corrida:
http://www.programacionfacil.com/java_jsp/startº

UNIDAD 8: JAVA JSP INT A LAS BASES DE DATOS


TEMA 1: JAVA JSP INTRODUCCIÓN
En este capitulo se analizan en general dos problemas:
a) Variables que permitan almacenar conjuntos de datos como los arreglos pero con distintos tipos de datos, este
primer problema se resolvía en la antigüedad usando las llamadas variables registro.
b) Permanencia de los datos, hasta ahora todos los datos capturados, calculados, creados, etc., al terminar o
cerrarse el programa se pierden y es necesario volver a capturarlos en la siguiente ejecución o corrida del
programa.
Tradicionalmente en programación antigua, este segundo problema se resolvía usando el concepto de archivos,
que son medios permanentes de almacenamiento de datos en dispositivos o periféricos apropiados generalmente
disco, cinta magnética, etc.

TEMA 2: JAVA JSP MODELOS DE ALMACENAMIENTO DE DATOS


En general existen dos modelos de almacenamiento de datos en los sistemas de información.
a) El modelo tradicional de archivos que se construye con los siguientes elementos:
1.- Variables Registros, que como ya se indico son variables que permiten almacenar conjuntos de datos de
diverso tipo.
También se pueden definir como representaciones simbólicas y programáticas de entidades lógicas de
información ejemplos de variables registros son alumnos, empleados, clientes, proveedores, productos, autos,
etc.
Estas variables registros también ocupan programas o rutinas de programas para procesarlas por ejemplo un
procedimiento, modulo o subrutina se encargara de capturar los datos que contendrá la variable registro otro
procedimiento para corregir los datos que ya contiene, otro procedimiento para desplegarlos en pantalla ya
cuando a sido capturada y así sucesivamente.
2.-Archivos, que en principio pueden entenderse como una especie de almacenes o bodegas para
almacenamiento de datos en forma permanente en disco es decir, un archivo de empleados en disco contiene
todos los datos de todos los empleados de una empresa.
Igualmente los archivos ocupan su propios programas o subrutinas o procedimientos especializados por ejemplo,
procedimientos para crear los archivos, para almacenar o dar de altas los registros en el archivo, procedimientos
para buscar un registro determinado, procedimiento para dar de baja un registro, etc.
3.- Una aplicación que es un programa que se encarga de coordinar todos los programas descritos y presentar a
usuarios de manera clara, fácil, accesible y entendible.
Salta a la vista que construir un sistema de información por ejemplo para una tienda de vídeo o para un
refaccionaria etcetera, involucra un gran cantidad de trabajo de programación puesto que hay que programar
muchas variables registros, muchos archivos en disco y construir una o muchas aplicaciones.
Este modelo se usa todavía en la actualidad pero es obvio que mejores maneras, mas rápidas, seguras y eficientes
existen en la actualidad para resolver estos problemas, y esto nos lleva al segundo modelo de datos.
b) Modelo de Bases de Datos Relaciónales: este modelo intenta simplificar la construcción de sistemas de
información como los antes descritos, este modelo solo incluye en forma simple los siguientes elementos:
b.1) Tablas, es una combinación de las variables registro y de los archivos del modelo anterior.
http://www.programacionfacil.com/java_jsp/startº

Es decir cuando un programador moderno define o declara una tabla en un programa realmente esta haciendo
dos cosas por el precio de una es decir, crea una variable registro en memoria que almacenara los datos y al
mismo tiempo ya esta creando un archivo en disco que se llamara igual que la tabla y que automáticamente se
convertirá en un espejo de la tabla en memoria es decir, cuando se cargan los datos en la tabla en memoria
también se estarán cargando en disco.
Otra vez cuando el programador escribe código para capturar los datos y mandarlos a la tabla en pantalla-
memoria, realmente también lo esta haciendo para darlos de alta en disco.
b.2) Aplicación, que tiene la misma función que en el modelo anterior.
No confundir este concepto de tablas en base de datos con el concepto de tablas vistos en el capitulo de arreglos.
Como se observa en este modelo es mas sencillo construir sistemas de información puesto que la parte
programática se reduce ampliamente.
Este curso de Java Jsp recomienda este modelo para la construccion de sistemas de informacion de bases de
datos en internet

TEMA 3: JAVA JSP MYSQL TABLAS


Una Tabla simple, representa una unidad de información de una entidad física o lógica de información:
ej.:
Tabla Empleado:
 Clave Empleado
 Nombre Empleado
 Dirección Empleado
 Edad Empleado
 Teléfono Empleado
 etc. Empleado
Tabla Proveedor:
 Clave Proveedor
 Nombre Proveedor
 Empresa Proveedor
 Teléfono Proveedor
 Fax Proveedor
 Celular Proveedor
 etc. Proveedor
Tabla Autos:
 Numero de Serie
 Modelo
 Marca
 Tipo
 Color
 Capacidad
 etc.
REGLAS:
Observar que cada tabla empieza con una clave generalmente de tipo numérica.
Todos los elementos de la tabla solo hacen referencia hacia el mismo ente o sujeto de información.
Cada elemento solo representa o debe contener un solo dato de información.
No se respetan o siguen al pie de la letra estos tres postulados y empiezan los problemas al tiempo de
programación.
 Existe una segunda forma o manera de representar las tablas, ejemplo:
Tabla: Camisas
NUMCAMISA MARCA ESTILO MEDIDA COLOR MATERIAL
1 JEANS SPORT GRANDE AZUL ALGODON
2 VOLIS VESTIR MEDIANA NEGRA POLIESTER
3 GENERICA CAMISETA LARGA MORADO RARON

Tabla: Clientes
NUMCLIENTE NOMCLIENTE DIRCLIENTE TELCLIENTE
1 JUAN PEREZ AV ABA 2233 2345678
2 LUIS SANCHEZ CALLE ZETA 3434 4567899
3 ROSA MARES CALLEJON NORTE 567890
http://www.programacionfacil.com/java_jsp/startº

Recordar siempre, una tabla almacena o representa un conjunto de datos del mismo tipo o entidad, la tabla de
alumnos es para almacenar y manipular muchos alumnos, la tabla de productos es para almacenar y manipular
muchos alumnos, en resumen si en un problema de información solo se presenta una instancia o renglón de una
entidad lógica, entonces no es tabla, es un encabezado.
TAREAS PROGRAMACION JAVA JSP
1.-CONSTRUIR EN CUADERNO LAS SIGUIENTES TABLAS, LA MITAD DE ELLAS CON EL PRIMER
FORMATO Y LA SEGUNDA MITAD CON EL SEGUNDO FORMATO.
1.- PACIENTES
2.- PERROS
3.- PLUMAS
4.- MERCANCÍAS
5.- PELÍCULAS
6.- MEDICINAS
7.- MAESTROS
8.- MATERIAS
9.- COMPUTADORAS
10.- BANCOS

TEMA 4: JAVA JSP TABLAS (CONTINUACIÓN)


El trabajo correcto con bases de datos relaciónales se divide en dos grandes pasos o etapas bien diferenciadas
entre si:
En la primera etapa se diseña la tabla con sus campos, llaves y condiciones especiales, luego se usa un paquete o
programa de software especializado en la construcción, mantenimiento y administración de la base de datos, este
software se usa para convertir la tabla o tablas ya bien diseñadas en un archivo en disco.
Existe software especializado en bases de datos, los llamados servidores de bases de datos, los tres mas
comunes son SQL-SERVER de Microsoft, ORACLE Server de Oracle, MYSQL Open Source, en estos casos la
base de datos( o conjunto de tablas que tienen relaciones comunes entre si) residen en un servidor de bases de
datos especializado en algun lugar cercano o lejano en una red chica, mediana o grande.
Otros paquetes o software mas pequeños y comunes tambien reciben el nombre de DBMS(DATA BASE
MANAGEMENT SYSTEM) o sistemas administradores de bases de datos.
Este tipo de software se especializa en la creación, mantenimiento, seguridad, privacidad, etc. de un conjunto de
tablas o mejor dicho una base de datos, DBMS comunes son access, postgres, fox, clipper, etc.
Usaremos MYSQL como nuestro generador de bases de datos y recordar que una base de datos es en principio
un conjunto de tablas que tienen y mantienen relaciones entre si.
La segunda etapa consiste en construir la aplicación o aplicaciones que ya tendrán acceso o podrán manipular los
datos contenidos en la tabla, estas aplicaciones se escriben usando ya sea lenguajes clásicos de programación
como CPP, BASIC, PASCAL, COBOL, CBUILDER, DELPHI, JAVA, VBSCRIPT, PERL, JSCRIPT,
CSHARP, etc.
DISEÑO Y CREACIÓN DE UNA TABLA
El primer paso antes de usar el paquete correspondiente a esta tarea, es diseñar la tabla completamente, esto
exige:
a) Nombre apropiado y determinación de atributos y campos correspondientes.
b) Seleccionar y determinar el atributo principal o campo clave o llave primaria que se utilizara como el
identificador único que permite diferenciar cada instancia o renglón diferente dentro de la tabla.
c) También se puede seleccionar otros campos que puedan servir mas adelante para ordenar de manera diferente
la tabla, es decir una tabla en principio ya está ordenada por campo clave por ejemplo, la matricula de un
alumno, el numero de empleado, etc., pero existirán muchas ocasiones, mas adelante donde se puede pedir un
orden diferente, por ejemplo, por ciudad, por carrera, por nombre, por edad, etc., la buena ingeniería de una base
de datos exige tomar en cuenta estos y otros muchos problemas y detalles.
d) A estos atributos o campos especiales se les conoce como claves o llaves secundarias, que internamente
generan otra tabla especial llamada tabla o archivo de índices(tabla o archivo que contiene dos campos, el
primero es la clave secundaria ordenada y el segundo la posición o renglón donde se encuentra en la tabla
original).
e) Escribir restricciones y condiciones apropiadas para ciertos atributos, por ejemplo el número de empleado
deben comenzar en 500, la edad no debe ser mayor de 150 años, etc.
Ya listo el diseño de la tabla, se usara el procedimiento correspondiente para su creación y almacenamiento.
Recordar ademas que todo el trabajo ya sea directamente con la base de datos y la tabla o por medio de un
programa se realizara usando SQL (lenguaje estructurado de consultas), asi que todas las instrucciones raras que
http://www.programacionfacil.com/java_jsp/startº

se analizan en el siguiente tema, estan construidas con SQL, es decir consigan un buen tutorial de SQL y
MYSQL y vayan aprendiendoselo.

TEMA 5: MYSQL JAVA JSP


En este ejercicio construiremos una base de datos llamada mibase que solo contendra una tabla
llamada mitabla con campos clave, nombre, edad, estatura mismos que se estaran usando a lo largo de esta
unidad a manera de ejemplo.
Empezaremos por instalar el sevidor de mysql, bajarlo de www.mysql.org e intalarlo en el directorio de
default (c:\mysql).
Antes de empezar a usarlo, es conveniente notar que mysql incluye varios servidores distintos, en general los dos
mas importantes es un servidor standalone para windows 98,me,2000,xp(mysqld.exe) y un servidor
especializado para servicios nt(mysqld-nt.exe), es decir para windows 2000,xp, en este curso usaremos el
standalone porque muchos de los alumnos estan usando versiones 98, me, 2000 de windows.
El procedimiento a seguir para arrancar el servidor, crear los usuarios ROOT y usuario1, asi como para
crear y cargar nuestra base de datos y finalmente apagar el servidor es:
1.- Usando una sesion de DOS o command prompt, navegar hasta c:\mysql\bin ejemplo:

Aqui vienen los diferentes servidores MYSQL y algunas utilerias de administración del servidor, por favor no
ejecuten ninguna de ellas sobre todo las de administración porque entonces se instalara por defaul el servidor nt
de mysql como un servicio mas de windows ( si como de costumbre no hacen caso al maestro y lo arrancan,
recordar que los servicios de nt y xp se arrancan y paran con start, control panel, administrative services).
2.-Arrancar el servidor standalone con la orden:
mysqld –console
ejemplo:

Ustedes tendran una ventana un poco diferente, porque primero tendra que crear e inicializar unos default's del
servidor mysql, pero al final de su pantalla deberan estar los dos ultimos renglones de la pantalla que esta arriba
de ejemplo.
Para este caso el servidor ya esta andando y DEBERAN MINIMIZAR ESTA VENTANA.
3.- EN OTRA SESION o ventana del msdos o Command prompt volver a navegar hasta c:\mysql\bin
4.- Iniciar ahora una sesion tipo cliente con el servidor mysql dando la orden:
mysql -uroot mysql
ejemplo:
http://www.programacionfacil.com/java_jsp/startº

El mysql> es el promt del servidor, es aqui donde se pueden mandar todos los comandos o instrucciones que
tiene MYSQL.
Y observar que todas las ordenes terminan con (;) o \g, por cierto para terminar la sesion usar \q;
UN ELEMENTO IMPORTANTE A ENTENDER, es que arrancamos tanto el servidor como la sesion cliente
usando el usuario principal ROOT y esta es una mala practica de seguridad, el primer problema es que MYSQL
para windows tiene al usuario (-u)ROOT sin ningun PASSWORD, es por eso que se pudo arrancar tanto el
servidor como el cliente.
4.- Crear un password para ROOT con la orden:
mysql>set password for root@localhost=password('minuevopassword');
ejemplo:

Recordar que de ahora en adelante para parar el servidor (no el cliente que estamos usando) se debera incluir el
password correspondiente.
5.- Crearemos ahora un usuario normal (NO ROOT), para que sea dicho usuario quien maneje su propia base de
datos, este procedimiento se hara con las siguientes dos ordenes:
mysql> grant all privileges on *.* to usuario1@localhost identified by 'passwordusuario' with grant option;
mysql> grant all privileges on *.* to usuario1@'%' identified by 'passwordusuario' with grant option;
ejemplo:
http://www.programacionfacil.com/java_jsp/startº

Observar que se ha creado ahora un usuario comun (lauro) con password laurosoto y el usuario principal ROOT
tambien tiene el mismo password, por favor no usen ustedes el mismo password para los dos usuarios.
6.- Terminar la sesion del cliente ROOT con la orden:
mysql> QUIT;
Observar el bye y que desaparece el promt de mysql.
7.- Recordar que es diferente el servidor mysql (mysqld.exe)que se tiene andando en memoria y el
cliente(mysql.exe) que se acabade apagar.
8.- Si todavia tienen una ventana msdos abierta ( si no la tienen abran otra sesion msdos y navegar a
cd\mysql\bin) apagaremos el servidor MYSQLD con la orden:
mysqladmin -uroot -plaurosoto shutdown
Si abren la ventana que estaba minimizada observar que se paro el servidor mysqld, ejemplo

Observar que para pararlo se tuvo que usar usuario -uROOT y password
-plaurosoto
9.- ARRANCAR otra ves el servidor mysqld con la orden normal (paso 2) y minimizar su propia ventana.
10.-Ahora estableceremos una nueva sesion cliente, pero usando el usuario lauro, para crear la base de datos, las
tablas de las bases, y cargar algunos renglones de pruebas en las tablas.
11.- ABRIR otra ventana msdos y dar la orden:
mysql -unombreusuario -ppassword
Esto con el fin de abrirnos una sesion de mysql, como lo muestra el siguiente ejemplo:

Con este paso ya estaremos dentro del prompt de mysql. (MYSQL>)


12.- El paso que sigue es mandar instrucciones sql apropiadas ( ya leyeron el tutorial de sql) para crear nuestra
base de datos, para este ejercicio usaremos la instruccion:
create database mibase;
–>observar que todas las instrucciones de sql terminan con ;
http://www.programacionfacil.com/java_jsp/startº

13.- Se uso ademas la instruccion show databases; para ver cuantas bases de datos tenemos construidas en
nuestro sitio observar que el sistema crea una default llamada test.
14.- El paso que sigue es seleccionar la base de datos a trabajar con la instruccion sql (ya leyeron el tutorial):
use mibase;
y luego construiremos nuestra primera tabla, llamada mitabla con la instruccion sql(ya leyeron el tutorial):
create table mitabla (
clave mediumint auto_increment,
nombre varchar(30),
edad int,
estatura float,
primary key(clave) );

Los tipos de datos que pueden usar en mysql son: TINYINT, SMALLINT, MEDIUMINT, INT, INTEGER,
BIGINT, REAL, DOUBLE, FLOAT, DECIMAL, NUMERIC, CHAR, VARCHAR, DATE, TIME,
TIMESTAMP, DATETIME, TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB, TINYTEXT, TEXT,
MEDIUMTEXT, LONGTEXT,ENUM(value1,value2,value3,…), SET(value1,value2,value3,…),MySQL
Reference Manual (C) 2002 MySQL AB
En cuanto a autoincrement se usa para que mysql vaya asignando la clave automaticamente y primary key(clave)
es para indicarle a mysql que clave es el campo llave o principal de la tabla (ver mi tutorial de mysql en
programacionfacil en cuento este listo :)
15.- Ahora se cargan algunos renglones de prueba en la tabla con la instrucción sql(ya leyeron el tutorial de sql);
mysql> insert into mitabla (nombre,edad,estatura) values(“oso”,10,1.67);
http://www.programacionfacil.com/java_jsp/startº

16.- agregar uno dos o tres renglones para pruebas a la tabla, para finalizar revisar como quedo cargada la tabla
con la instrucción sql:
mysql>select * from mitabla;

8.- Usar QUIT para terminar la sesion de mysql.

TEMA 6: JDBC SQL RESULTSET JAVA JSP


EL MODELO DE DATOS DE JAVA DESCANSA EN UNA SERIE DE OBJETOS ESPECIALIZADOS
QUE FACILITAN EL PROCESAMIENTO DE UNA BASE DE DATOS.
Empezando:
El problema es comunicar un programa o aplicación con una base de datos y mas que comunicar se pretende que
el programa o aplicación realize una serie de procesos u operaciones con la base de datos o mejor aun con el
conjunto de tablas que contiene una base de datos.
La primera nota a recordar es que una base de datos puede estar fisicamente en el servidor y en algun folder o
directorio del disco duro de dicha maquina servidora por ejemplo, c:\pfacil\misitio\mibase.mbd, como se observa
la base que se construyo en access (mibase.mbd) se almaceno en el disco c en el folder pfacil y dentro del
subfolder misitio.
Sin embargo tambien es necesario conocer que asi como existen servidores de paginas (web server), servidores
de correo (mail server), servidores de ftp (ftp server), etc, tambien existen servidores de bases de datos (database
server), los mas comunes son el sqlserver de microsoft, oracle, mysql, etc, estos servidores tambien pueden
crear, administrar y procesar una base de datos por supuesto que el procedimiento que se dio para crearla en
access en el tema anterior no se puede usar para crear y cargar una base de datos en un servidor de bases de
datos.
El modo de comunicarse entre nuestro programa o aplicación y la base de datos (ya sea fisica o un dbserver)
implica que ambos manejen un lenguaje de programación comun, es decir no se puede mandar una instrucción
en csharp, o en basic o pascal a la base de datos y ademas esperar que esta ultima la entienda ( para entender
esto, una razon muy sencilla es que la base de datos tendria que conocer o comprender todos los lenguajes de
programación), para resolver este problema de comunicación es que se usa un lenguaje comun de bases de datos
que tanto los lenguajes de programación existentes como las bases de datos entienden, este lenguaje comun de
bases de datos es el SQL (structured query languaje) o lenguaje estructurado de consultas.
En otras palabras ustedes mis estimados lectores tendran que aprender este nuevo lenguaje de programación,
el SQL, la buena noticia es que es un lenguaje con muy pocas instrucciones y ademas existen muy buenos
tutoriales en internet que hay que buscar y estudiar.
Bueno las principales instrucciones de SQL que se usan en este curso son SELECT, INSERT, UPDATE y
DELETE.
La pregunta es ahora como mandamos las instrucciones sql a la base de datos, la respuesta son los
siguientes OBJETOS.
MYSQL CONNECTORJ.- ES un objeto(clase) especializado que se utiliza para enlazar e intercambiar
informacion entre MYSQL y JAVA.
Esta clase la deberan de bajar de http://dev.mysql.com/downloads/connector/j/3.0.html
Abrirlo con el winzip y solo buscar y sacar una clase que se llama MYSQL-CONNECTOR-JAVA-3.0.11-
STABLE-BIN.JAR
Este archivo .jar ponerlo en su servidor lws en el direcorio C:\lws\common\lib
Es muy importante que este paso lo realizen de la manera mas completa posible.
OBJETO CONNECTION:- Objeto que se utiliza para establecer la conección o enlaze entre el programa jsp y la
base de datos en mysql.
http://www.programacionfacil.com/java_jsp/startº

OBJETO RESULTSET:- Es la representación en memoria de las tablas de la base de datos en disco, se puede
entender como una tabla virtual, recordar que generalmente todos los procesos que se realizen con la tabla
(insertar registros, eliminar registros, etc) se realizaran realmente contra un resulset y no provocaran ningun
cambio en la tabla fisica en disco, resulset tiene un conjunto de metodos muy utiles y muy usados para el proceso
de los renglones de la tabla virtual.
OBJETO STATEMENT:- Este objeto y sus dos metodos executequery(solo para select de sql) y
executeupdate( solo para insert, update y delete de sql) son los metodos que se utilizaran para comunicarse con la
tabla fisica en disco.
Ejemplo:
// declarando y creando objetos globales
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto";
// abriendo canal o enlace en su propio try-catch
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};

TEMA 7: JAVA JSP MYSQL CONSULTA O DESPLIEGUE O SELECCION


Existen una serie de operaciones y procesos que son muy comunes contra una tabla en una base de datos en
disco, la mas común es desplegar todos los renglones de la tabla que estan almacenados en disco, a este proceso
le llamaremos SELECCION, consulta o despliegue.
Como se indico anteriormente la comunicación con la base de datos se tendran que dar usando el lenguaje
especializado de bases de datos llamado SQL(structured query language), la instrucción sql que se usa para
resolver este problema tiene el siguiente formato:
SELECT [listacampos, * o ALL] FROM TABLA;
El procedimiento que se intenta seguir cuando se construya un programa jsp que tenga que manipular una tabla
en disco debera seguir los siguientes pasos:
1.- Crear una conección o enlace a la base de datos.
2.- Abrir la conección a la base de datos.
3.- Crear el enlace y cargarlo con la instruccion sql
4.- Crear el RESULTSET y cargarlo
5.- Cargar un objeto table de html con el RESULTSET
6.- Procesar el table de html
7.- Cerrar rsultset, statement, driver o conección

prog41 jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>
<%
// declarando y creando objetos globales
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto";
if(request.getParameter("OK") != null)
{
// abriendo canal o enlace en su propio try-catch
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
//leyendo tabla en disco y pasandola al resultset
http://www.programacionfacil.com/java_jsp/startº

try { tabla = instruccion.executeQuery("select * from mitabla");


// mandando resultset a una tabla html
out.println("<TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>EDAD</th></TR>");
// ciclo de lectura del resultset
while(tabla.next()) {
out.println("<TR>");
out.println("<TD>"+tabla.getString(1)+"</TD>");
out.println("<TD>"+tabla.getString(2)+"</TD>");
out.println("<TD>"+tabla.getString(3)+"</TD>");
out.println("<TD>"+tabla.getString(4)+"</TD>");
out.println("</TR>"); }; // fin while
out.println("</TABLE></CENTER></DIV></HTML>");
// cerrando resultset
tabla.close(); instruccion.close();canal.close();} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e) {};
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog41.jsp METHOD=post>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=CONSULTA><BR>");
out.println("</FORM>");
%>

notas:
1.- revisar con cuidado el programa, proque como todo buen programa lleva incluida mucha documentación o
explicación.
2.- Se sigue el procedimiento generico para procesar tablas
3.- Observar y siempre incluir los import's indicados.
4.- Se empieza creando las variables globales a ocupar y abriendo la conección a la base de datos,
5.- Se crea el enlace y se carga el resultset(o tabla en memoria) con la instrucción sql y la coneccion, aqui es
necesario entender que existen varias maneras de hacer este proceso.
6.- Luego se crea el resultset(tabla) y se cargo con toda la base de datos en disco
7.- Posteriormente se carga el TABLE DE HTML con el resultset.
8.- Para visitar o procesar todos los renglones de la tabla del dataset se usa un ciclo while, y el metodo
RESULTSET.NEXT() y por el nombre se ve que existen otros metodos utiles para navegar por todos los
renglones de resultset, tales como last(), prior() etc.
9.- Para procesar un dato, celda o columna de un renglon cualesquiera se usa el siguiente metodo
RESULTSET.GETSTRING(numerocolumna o nombrecolumna).
10.- ES MUY IMPORTANTE ESTUDIAR TODOS LOS METODOS DEL RESULTSET PORQUE LES
FACILITARA MUCHOS PORBLEMAS DE MANIPULACION DE TABLAS, CONSULTAR LA
DOCUMENTACION DE SDK DE JAVA.
http://www.programacionfacil.com/java_jsp/startº

11.- observar tambien que los objetos resultset, statement y drivermanager(conección), deben cerrarse al final del
programa, y se cierran en el mismo orden como fueron abiertos.
12- mas claro aún, NO OLVIDAR USAR LOS TRES CLOSE() que puse en el programa ejemplo.

TEMA 8: INSERCION O ADICION DE REGISTROS SQL INSERT JAVA JSP


Insertar o agregar registros o renglones nuevos a una tabla en disco, es un proceso sencillo que usa la siguiente
instrucción sql:
INSERT INTO TABLA(CAMPO1,CAMPO2..) VALUES(VALOR1,VALOR2..);
Recordar que solo se esta usando lo minimo de cada instrucción sql es conveniente estudiar un tutorial de sql.

p rog42.jsp

<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>


<%
if(request.getParameter("GRABAR") != null)
{
// objetos de enlace
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto";
// abriendo canal o enlace en su propio try-catch
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
//cargando los campos a grabar
// excepto clave porque en mysql es de tipo auto-increment
String nombre = request.getParameter("NOMBRE");
int edad = Integer.parseInt(request.getParameter("EDAD"));
float estatura =Float.parseFloat(request.getParameter("ESTATURA"));
// insert into tabla(nombre,edad,estatura) values('juan', 15, 1.88);
String q="insert into mitabla(nombre,edad,estatura) values(\"" +nombre+"\","+edad+","+estatura+"); ";
try {
// agregando renglon (insert)
int n=instruccion.executeUpdate(q);
//avisando que se hizo la instruccion
out.println("REGISTRO INSERTADO");
} catch(SQLException e) {out.println(e);};
try{
// tabla.close();
instruccion.close();
canal.close();
} catch(SQLException e) {out.println(e);};
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog42.jsp METHOD=post>");
out.println("NOMBRE :<INPUT TYPE=TEXT NAME=NOMBRE><BR>");
out.println("EDAD :<INPUT TYPE=TEXT NAME=EDAD><BR>");
out.println("ESTATURA:<INPUT TYPE=TEXT NAME=ESTATURA><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=GRABAR VALUE=INSERTAR ><BR>");
out.println("</FORM>");
%>
http://www.programacionfacil.com/java_jsp/startº

prog41.jsp(consulta)

El programa esta bien documentado.


Solo crear la string q con el formato apropiado sql( como se dijo al principio de este tema).
OBSERVAR QUE EXISTEN DOS METODOS PARA EL OBJETO STATEMENT:
a) STATEMENT.EXECUTEQUERY()→ USARLO PARA SQL SELECT
b) STATEMENT.EXECUTEUPDATE()→ USARLO PARA SQL INSERT, UPDATE, DELETE.

TEMA 9: BUSQUEDA SQL SELECT JAVA JSP


En este tema se analiza la busqueda de un registro o renglón determinado en este proceso el usuario del
programa quiere que se despliegue un y solo un registro de información proporcionando un dato de busqueda
generalmente la clave del registro.
La solucion es sencilla, solo usar otra vez la instruccion select, con el siguiente formato:
SELECT [ *, all, campos] FROM TABLA WHERE clave=claveabuscar;
Y RESULTSET.EXECUTEQUERY().
les recuerdo que deben buscar y estudiar un buen tutorial de sql.
Prog43.jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>
<%
// declarando y creando objetos globales
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto";
if(request.getParameter("OK") != null)
{
// abriendo canal o enlace en su propio try-catch
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
// preparando condicion de busqueda
int clave = Integer.parseInt(request.getParameter("CLAVEB"));
// construyendo select con condicion
String q="select * from mitabla where clave="+clave;
// mandando el sql a la base de datos
try { tabla = instruccion.executeQuery(q);
http://www.programacionfacil.com/java_jsp/startº

// mandando resultset a tabla html


out.println("<TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>EDAD</th></TR>");
while(tabla.next()) {
out.println("<TR>");
out.println("<TD>"+tabla.getString(1)+"</TD>");
out.println("<TD>"+tabla.getString(2)+"</TD>");
out.println("<TD>"+tabla.getString(3)+"</TD>");
out.println("</TR>"); }; // fin while
out.println("</TABLE></CENTER></DIV></HTML>");
} //fin try no usar ; al final de dos o mas catchs
catch(SQLException e) {};
try {tabla.close();instruccion.close();canal.close();} catch(SQLException e) {};
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog43.jsp METHOD=post>");
out.println("CLAVE BUSCAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=BUSCAR><BR>");
out.println("</FORM>");
%>
nota: no hay nada nuevo es una combinación de los dos programas anteriores con las mismas notas, solo se usa
un input text para pedir la clave, aunque se puede usar cualquier campo para buscar.
Tambien recordar que el resultset despues de la busqueda solo queda cargado con el renglón que el canal se trajo
de la base de datos.
Corrida:

Observar que aunque el resultset tenga cuatro campos se pueden desplegar solo los que se ocupen.

TEMA 10: FILTROS JAVA JSP


Otro Problema similares al anterior es El de Filtros es Decir en Muchas Ocasiones es necesario Obtener
Información Acerca De las Naciones Unidas subconjunto de renglones de la tabla.
Por EJEMPLO Todos los Estudiantes Que sean Mayores de 17 Años, Todos Los Clientes Que sean de Tijuana,
etc, una ESTO le llamamos o Filtros CONDICIONES.
Tambien en sí Resuelve de Manera similares al anterior, es Decir usando la Instrucción etc seleccionar, a partir
de tabla, donde CONDICION ; RESULTSET.EXECUTEQUERY con ().

Prog44.jsp
<% @ Page import = "java.io. *, java.util .*, java.net .*, java.sql .*"%>
<%
/ / Declarando y Creando Objetos Globales
Canal de conexión = null;
ResultSet tabla = null;
http://www.programacionfacil.com/java_jsp/startº

Instrucción sentencia = null;


Strcon cadena = "jdbc: mysql: / / localhost / mibase user = lauro & password = laurosoto";
if (request.getParameter ("OK")! = null)
{
/ / Abriendo el canal o enlace en Su Propio try-catch
try {
. Class.forName ("com.mysql.jdbc.Driver") newInstance ();
Canal = DriverManager.getConnection (strcon);
Instrucción = canal.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} Catch (java.lang.ClassNotFoundException e) {} catch (SQLException e) {};
/ / Preparando condicion de busqueda
int Edad = Integer.parseInt (request.getParameter ("Edad"));
Cadena q = "select * from mitabla donde Edad> =" + Edad;
/ / El sql mandando al estilo de la Base de Datos
try {tabla instruccion.executeQuery = (q);
/ / Mandando un conjunto de resultados html tabla
out.println ("<TABLE Border=10 CellPadding=5> <TR>");
out.println ("<th bgcolor=Green> CLAVE </ th> <th bgcolor=White> NOMBRE </ th> <th bgcolor=Red>
EDAD </ td> </ TR>");
while (tabla.next ()) {
out.println ("<TR>");
out.println ("<TD>" + tabla.getString (1 )+"</ TD> ");
out.println ("<TD>" + tabla.getString (2 )+"</ TD> ");
out.println ("<TD>" + tabla.getString (3 )+"</ TD> ");
out.println ("</ TR>");} / / fin mientras
out.println ("</ TABLE> </ CENTER> </ DIV> </ HTML>");
} / / Fin tratar de no USAR, al final, de dos o mas atrapa
catch (SQLException e) {};
try {tabla.close (); instruccion.close (); canal.close ();} catch (SQLException e) {};
};
/ / Construyendo forma dinamica
out.println ("<FORM ACTION=prog44.jsp METHOD=POST>");
out.println ("EDAD> = <input type=text NAME=EDAD> <BR>");
out.println ("<input type=submit NAME=OK VALUE=FILTRAR> <BR>");
out.println ("</ FORM>");
%>
Nota: Siguen siendo Combinaciones de los Programas Anteriores Pero seria Prudente Mejor USAR dos
combobox Uno párrafo variable de la, Otro Para El Operador Relacional y de las Naciones Unidas Para El dato
de texto y mandar Estós Tres Datos al prog36.jsp Pero ESO Qaeda de Tarea.
Corrida:

TEMA 11: OPERACIONES CON CAMPOS JAVA JSP


http://www.programacionfacil.com/java_jsp/startº

Este es tambien un caso comun con elementos de una tabla, sin embargo es tambien facil de resolver.
Es necesario recordar primero algunas cosas elementales:
1.- Recordar que el numero de columna en una tabla empieza en 1, esto es que para realizar alguna operación por
ejemplo la columna edad del ejemplo que estamos siguiendo, su numero de columna es la 2.
2.- La operación que se plantee se puede realizar con todos los renglones de la tabla o con un solo renglon de la
tabla(del resultset).
3.- En el ejemplo se realiza la operación con todos los renglones de la tabla y no olvidar que se tiene que usar
la instruccion sql Update para que la nueva información se actualize en disco, recordar que los cambios que se
hacen a una tabla es realmente al resultset, que a su vez es una tabla o base de datos en la memoria de la maquina
del cliente o usuario es por esta RAZON QUE LOS cambios hay que actualizarlos o pasarlos con UPDATE a la
base de datos en disco.
El siguiente programa le aumenta 50 a todas las edades.
Prog45.jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>
<%
if(request.getParameter("OK") != null)
{
// declarando y creando objetos y variables
int edad, clave;
String q;
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto";
// crando canal o enlace
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
// cargando el resultet
try {
tabla = instruccion.executeQuery("select * from mitabla");
} catch(SQLException e) {};
// operaciones en el resultset
while(tabla.next()){
clave = tabla.getInt(1);
edad =tabla.getInt(3);
edad=edad+50;
// actualizacion a la tabla en disco con update
q="update mitabla set edad= "+edad+ " where clave = "+clave+";";
try{
instruccion.executeUpdate(q);
// cargando nuevo resultset actualizado
tabla = instruccion.executeQuery("select * from mitabla");
// dejando apuntador en renglon apropiado, recordar que volvimos a releer la tabla y por tanto
// hay que poner el apuntador en el renglon apropiado
tabla.absolute(clave);
}catch(SQLException e) {}; };//fin while
// cerrando todo
try {canal.close();instruccion.close();tabla.close();} catch(SQLException e) {};
out.println("EDADES AUMENTADAS");
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog45.jsp METHOD=post>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=EDAD+50><BR>");
out.println("</FORM>");
%>
http://www.programacionfacil.com/java_jsp/startº

nota: programa autoanotado.

TEMA 12: BAJA O ELIMINACION SQL DELETE


Eliminación es Otro Proceso sencillo y comun Con las bases de Datos El Modelo Que ESTAMOS usando liebre
Este Tipo de Operaciones Muy faciles:
La Instrucción sql un USAR es: DELETE FROM TABLA EN CONDICION
Y RESULTSET.EXECUTEUPDATE ()
Prog46.jsp
<% @ Page import = "java.io. *, java.util .*, java.net .*, java.sql .*"%>
<%
/ / Declarando y Creando Objetos Globales
Canal de conexión = null;
ResultSet tabla = null;
Instrucción sentencia = null;
Strcon cadena = "jdbc: mysql: / / localhost / mibase user = lauro & password = laurosoto";
if (request.getParameter ("OK")! = null)
{
/ / Abriendo el canal o enlace en Su Propio try-catch
try {
. Class.forName ("com.mysql.jdbc.Driver") newInstance ();
Canal = DriverManager.getConnection (strcon);
Instrucción = canal.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} Catch (java.lang.ClassNotFoundException e) {} catch (SQLException e) {};
/ / Preparando condicion de eliminacion
int clave = Integer.parseInt (request.getParameter ("CLAVEB"));
/ / Construyendo seleccione Con condicion eliminacion SQL DELETE
Cadena q = "eliminar de mitabla donde clave =" + clave;
/ / SQL mandando una tabla en discoteca
try {instruccion.executeUpdate (q);
/ / Avisando
out.println ("Registro eliminado");
} / / Fin tratar de no USAR, al final, de dos o mas atrapa
catch (SQLException e) {}
catch (java.lang.NullPointerException e) {};
try {
/ / No cerrar OCUPA tabla (), no en sí Leyo (seleccionar) un conjunto de resultados
/ / La eliminacion FUE Directa en discoteca
instruccion.close (); canal.close ();} catch (SQLException e) {};
};
/ / Construyendo forma dinamica
out.println ("<FORM ACTION=prog46.jsp METHOD=POST>");
out.println ("ELIMINAR CLAVE: <input type=text NAME=CLAVEB> <BR>");
out.println ("<input type=submit NAME=OK VALUE=ELIMINAR> <BR>");
out.println ("</ FORM>");
http://www.programacionfacil.com/java_jsp/startº

%>
Corridas:

Prog-← tabla original, pro46.jsp

prog41.jsp

TEMA 13: EDICION DE REGISTROS SQL UPDATE


Editar registros significa cambiar el contenido de algunos de los campos o columnas por nueva informacíón o
para corregir algun error de captura original o para agregar alguna columna que no existia por modificación de la
tabla o la base de datos.
En general se tiene otro problema de sql UPDATE, sin embargo ahora se tendran que construir dos metodos uno
de busqueda normal y otro de actualizacion estos metodos son:
1.- BUSQUEDA: programa normal de busqueda por clave, pero ahora debera construir una forma.html
dinamica, que contendra un form action apuntando o ejecutandose a si mismo es decir prog47.jsp, ademas
tendra todos los input text necesarios para cargar cada celda del renglon de busqueda.
2.- EDICION: recoje los datos ya modificados de la forma.html dinamica y realiza directamente un sql update en
la base de datos.
prog47.jsp
http://www.programacionfacil.com/java_jsp/startº

<%@ page import="java.io.*, java.util.*, java.net.*, java.sql.*" %>

<%! int clave=0; %>


<%
// codigo del evento BUSQUEDA y recordar construir una nueva forma dinamica
if(request.getParameter("BUSCAR") != null)
{
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto";
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
clave = Integer.parseInt(request.getParameter("CLAVEB"));
String q="select * from mitabla where clave="+clave;
try { tabla = instruccion.executeQuery(q);
tabla.next();
out.println("<FORM ACTION=prog47.jsp METHOD=POST>");
out.println("NOMBRE:<INPUT TYPE=TEXT NAME=NOMBRE VALUE= "+ tabla.getString(2)+ "><BR>");
out.println("EDAD:<INPUT TYPE=TEXT NAME=EDAD VALUE= "+ tabla.getString(3)+ "><BR>");
out.println("ESTATURA:<INPUT TYPE=TEXT NAME=ESTATURA VALUE= "+ tabla.getString(4)+
"><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=EDITAR VALUE=EDITAR><BR>");
tabla.close();instruccion.close();canal.close();
} catch(SQLException e) {} catch(Exception ex){};
}; // fin evento buscar
// codigo de evento EDICION
String temp2=request.getParameter("EDITAR");
if(temp2==null)temp2=" ";
if(temp2.compareTo("EDITAR")==0)
{
String nombre,q ;
int edad; float estatura;
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto";
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
try {
tabla = instruccion.executeQuery("select * from mitabla");
} catch(SQLException e) {};
nombre = request.getParameter("NOMBRE");
edad = Integer.parseInt(request.getParameter("EDAD"));
estatura = Float.parseFloat(request.getParameter("ESTATURA"));
q = "UPDATE mitabla SET "+ "NOMBRE='"+ nombre+ "', EDAD="+ edad+",estatura="+estatura+" WHERE
clave=" + clave+";";
try{instruccion.executeUpdate(q); }catch(SQLException e) {};
try {tabla.close();instruccion.close();canal.close();} catch(SQLException e) {};
out.println("REGISTRO EDITADO");
}; // fin evento editar
// construyendo forma dinamica
http://www.programacionfacil.com/java_jsp/startº

out.println("<FORM ACTION=prog47.jsp METHOD=post>");


out.println("CLAVE EDITAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=BUSCAR VALUE=BUSCAR ><BR>");
out.println("</FORM>");
%>
Veamos la corrida completa:
(tabla original)

forma dinamica que construye prog47.jsp continua prog47.jsp

nueva tabla
http://www.programacionfacil.com/java_jsp/startº

TEMA 14: GRAFICOS JAVA JSP


Campos de graficos o de imagenes, se han convertido en elementos importantes de cualquier base de datos.
Para manejar este elemento con java jsp existen dos maneras:
1.- Agregar un campo BLOB a la tabla en MYSQL y usar componentes especializados en imagenes tanto para
subirlas como para desplegar la imagen.
Este metodo provoca que la base de datos crezca mucho recordar que una imagen aun de tipo jpg ocupa mucho
espacio.
2.- El segundo metodo es mas sencillo, primero subir las imagenes ( de preferencia jpg) con un ftp normal a
tusitio y despues usar el tag <img src> de html y ademas agregar un campo de texto llamado fotourl o foto a
la tabla en access y grabar la direccion http de la imagen en este campo, por
ejemplo http://programacionfacil.com/tusitio/pato.jpg
Despues solo cargar este tag imageurl en la pagina que se construira que no es otra cosa que el programa de
busqueda con el despliegue del campo extra, como lo muestra el programa ejemplo.

Prog48.jsp
<%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %>
<%
// declarando y creando objetos globales
Connection canal = null;
ResultSet tabla= null;
Statement instruccion=null;
String strcon = "jdbc:mysql://localhost/mibase?user=lauro&password=laurosoto";
if(request.getParameter("OK") != null)
{
// abriendo canal o enlace en su propio try-catch
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
canal=DriverManager.getConnection(strcon);
instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {};
// preparando condicion de busqueda
int clave = Integer.parseInt(request.getParameter("CLAVEB"));
// construyendo select con condicion
String q="select * from mitabla where clave="+clave;
// mandando el sql a la base de datos
try { tabla = instruccion.executeQuery(q);
// mandando resultset a tabla html
out.println("<TABLE Border=10 CellPadding=5><TR>");
out.println("<th bgcolor=Green>CLAVE</th><th bgcolor=White>NOMBRE</th><th
bgcolor=Red>EDAD</th></TR>");
http://www.programacionfacil.com/java_jsp/startº

while(tabla.next()) {
out.println("<TR>");
out.println("<TD>"+tabla.getString(1)+"</TD>");
out.println("<TD>"+tabla.getString(2)+"</TD>");
out.println("<TD>"+tabla.getString(3)+"</TD>");
out.println("<TD><img src=http:\\\\localhost\\progs\\"+tabla.getString(5)+"></TD>");
out.println("</TR>"); }; // fin while
out.println("</TABLE></CENTER></DIV></HTML>");
tabla.close(); } //fin try no usar ; al final de dos o mas catchs
catch(SQLException e) {};
try {canal.close();} catch(SQLException e) {};
};
// construyendo forma dinamica
out.println("<FORM ACTION=prog48.jsp METHOD=post>");
out.println("CLAVE BUSCAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>");
out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=BUSCAR><BR>");
out.println("</FORM>");
%>

También podría gustarte