Manual de Java JSP
Manual de Java JSP
Manual de Java JSP
com/java_jsp/startº
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
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:
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:
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.
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:
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º
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).
prog13.jsp
<%!
int base=0; double altura=0; double area=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º
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.
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;
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.
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
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.
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.
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º
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"()"
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>");
%>
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
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º
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
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º
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º
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º
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.
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.
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º
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).
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º
%>
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>");
%>
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.
Prog32.jsp
http://www.programacionfacil.com/java_jsp/startº
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º
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
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) {};
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º
prog 33:
Prog35.jsp
http://www.programacionfacil.com/java_jsp/startº
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º
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º
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º
pro38.html
prog33.jsp
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
Prog40.jsp
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
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
se analizan en el siguiente tema, estan construidas con SQL, es decir consigan un buen tutorial de SQL y
MYSQL y vayan aprendiendoselo.
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:
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;
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) {};
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º
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.
p rog42.jsp
prog41.jsp(consulta)
Observar que aunque el resultset tenga cuatro campos se pueden desplegar solo los que se ocupen.
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º
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º
%>
Corridas:
prog41.jsp
nueva tabla
http://www.programacionfacil.com/java_jsp/startº
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>");
%>