import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.sql.*; import java.util.GregorianCalendar; /*---------------------------------------------------------------*/ /** * En este servlet implementamos el formulario Alumno, el cual * nos permite movernos por los distintos registros de las tablas * persona y alumno, pudiéndo modificar los datos,borrar o añadir nuevos * registros. * * Created: 10/05/2006 * * @author Fco. Javier García Castellano fjgc@decsai.ugr.es * @version 1.0 */ public class Alumno extends HttpServlet { //Propiedades de la clase /** *Acción a realizar por el servlet */ String accion; /** * Número de registro que está mostrando el servlet */ int num; /* DATOS tabla Persona*/ /** *Identificador de persona */ int pid; /** *Nombre de la persona */ String nombre; /** *Primer apellido de la persona */ String apellido1; /** *Segundo apellido de la persona */ String apellido2; /** *Direccion de la persona, calle, plaza, piso, puerta, escalera, portal, etc. */ String direccion; /** *Codigo postal de la direccion de una persona */ String cp; /** *Localidad de la direccion de una persona */ String localidad; /** *Provincia de la direccion de una persona */ String provincia; /** *Telefono de contacto de una persona */ String telefono; /** *Correo electronico de una persona */ String email; /** *Lugar de nacimiento de una persona */ String lugarNacimiento; /** *Fecha de nacimento de una persona */ Date fechaNacimiento; /** *Numero de Identificacion Fiscal (DNI+ letra) */ String nif; /** *Sexo de la persona: Hombre (H) o mujer (M) */ String sexo; /** *Nacionalidad de una persona */ String nacionalidad; /* DATOS tabla Alumno*/ /** *Nombre de usuario para acceder al sistema */ String login; /** *Contraseña para acceder al sistema */ String password; /** *Si es familia numerosa (S) o no(N) */ String familiaNumerosa; /** *Centro de procedencia del alumno */ String centroProcedencia; /** *Año de acceso del alumno */ int acceso; /** *Nota de acceso del alumno */ float notaAcceso; /*---------------------------------------------------------------*/ /** * Este método implementa el método init por defecto * @param conf Variable con la configuración del servlet */ public void init(ServletConfig conf) throws ServletException { super.init(conf); } /*---------------------------------------------------------------*/ /** * Este método implementa el método doGet que se encargará de * conectarse a la base de datos extraer los datos, mostrar el * formulario y rellenarlo o no dependiendo de la acción que se le * pase como parámetro * @param req Variable para la llamada al servlet * @param res Variable para la respuesta al servlet */ public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { //Variables para usr la BD Connection conexion = null; //Objeto para la conexión a la BD Statement sentencia = null; //Objeto para la ejecutar una sentencia ResultSet resultados = null;//Objeto para guardar los resultados //Variables de la conexión String cadenaConexion2="jdbc:oracle:thin:@oracle0.ugr.es:1521:PRACTBD"; String cadenaConexion="jdbc:oracle:thin:@localhost:1521:PROGBD2"; String usuario="fjgarcia"; String clave="claveSecreta"; //La salida será una página HTML res.setContentType("text/html"); PrintWriter out = res.getWriter(); //Cogemos los parámetros del servlet cogeParametros(req); //Imprimimos la cabecera HTML cabeceraHTML(out,"FORMULARIO Persona-Alumno"); //Mostramos el título de la página y la tabla con los resultados tituloHTML(out,"Datos Alumno",false); try { //Leemos el driver de Oracle Class.forName("oracle.jdbc.driver.OracleDriver"); //Nos conectamos a la BD conexion = DriverManager.getConnection (cadenaConexion,usuario,clave); //Creamos una sentencia a partir de la conexión sentencia=conexion.createStatement(); } catch (ClassNotFoundException e1) { //Muestro el mensaje de error del driver String mensaje="No encuentro el driver de la BD: "+e1.getMessage(); tituloHTML(out,mensaje,true); } catch (SQLException e2) { //Muestro el mensaje de error SQL tituloHTML(out,"Fallo en la conexión: "+e2.getMessage(),true); } //Dependiendo de la acción hacemos una cosa u otra if (this.accion.equals("Nuevo")) { //ACCION=Nuevo //Obtenemos el PID del nuevo registro a añadir this.pid=0; try { //Hago la consulta, busco el pid máximo más uno resultados=sentencia.executeQuery("SELECT max(pid)+1 FROM persona"); //Me voy al primer resultado resultados.next(); //Me quedo con el pid máximo más uno this.pid=resultados.getInt(1); } catch (SQLException e2) { tituloHTML(out,"Fallo al obtener el PID: "+e2.getMessage(),true); } //Dejamos todas las variables vacías this.nombre=this.apellido1=this.apellido2=this.direccion=""; this.cp=this.localidad=this.provincia=this.telefono=""; this.email=this.lugarNacimiento=""; this.fechaNacimiento=null; this.nif=this.sexo=this.nacionalidad=""; this.login=this.password=this.familiaNumerosa=""; this.centroProcedencia=""; this.acceso=0; this.notaAcceso=(float)0.0; //Mostramos el formulario vacío muestraFormulario(out); //mostramos la barra de herramientas para añadir registros barraHerramientasNuevo(out); } else if (this.accion.equals("Siguiente")) { //ACCION=Siguiente //Nos vamos al siguiente registro this.num=this.num+1; } else if (this.accion.equals("Anterior")) { //ACCION=Anterior //Nos vamos al anterior registro this.num=this.num-1; } else if (this.accion.equals("Borrar")) { //ACCION=BORRAR //Borramos el registro actual try { sentencia.executeUpdate("DELETE FROM alumno WHERE (pid="+this.pid+")"); sentencia.executeUpdate("DELETE FROM persona WHERE (pid="+this.pid+")"); conexion.commit(); } catch (SQLException e2) { tituloHTML(out,"No se ha podido borrar el registro:"+e2.getMessage(),true); } //Nos vamos al registro anterior this.num=this.num-1; } else if (this.accion.equals("Crear")) { //ACCION=Crear //Creamos la nueva tupla try { //Paso la fecha de nacimiento a cadena GregorianCalendar cal=new GregorianCalendar(); cal.setTime(this.fechaNacimiento); String fechaBD=cal.get(cal.DATE)+"/"+(cal.get(cal.MONTH)+1)+"/"+cal.get(cal.YEAR); //inserto una tupla en la tabla Persona sentencia.executeUpdate("INSERT INTO Persona VALUES("+this.pid+", '"+this.nombre+"', '"+ this.apellido1+"', '"+this.apellido2+"', '"+this.direccion+"', '"+ this.cp+"', '"+this.localidad+"', '"+this.provincia+"', '"+ this.telefono+"', '"+this.email+"', '"+this.lugarNacimiento+"', '"+ fechaBD+"', '"+this.nif+"', '"+this.sexo+"', '"+ this.nacionalidad+"' )"); //inserto la otra en la tabla Alumno sentencia.executeUpdate("INSERT INTO Alumno VALUES("+this.pid+", '"+this.login+"', '"+ this.password+"', '"+this.familiaNumerosa+"', '"+ this.centroProcedencia+"', '"+ this.acceso+"', "+this.notaAcceso+" )"); conexion.commit(); } catch (SQLException e2) { tituloHTML(out,"No se ha podido insertar el registro:"+e2.getMessage(),true); //Como puede darse el caso de haberse insertado en Persona, pero no en alumno //intento borrar el de Persona try{ sentencia.executeUpdate("DELETE FROM persona WHERE (pid="+this.pid+")"); conexion.commit(); } catch (SQLException ignora) {} } //Obtenemos la posicion del nuevo registro para mostrarlo try { //cogemos el último PID de la base de datos resultados=sentencia.executeQuery("SELECT count(pid) FROM persona"); resultados.next(); this.num=(resultados.getInt(1))+1; } catch (SQLException e2) { tituloHTML(out,"Fallo al obtener el número de registros: "+e2.getMessage(),true); } } else { //ACCION=Modificar //Pasamos la fecha a cadena GregorianCalendar cal=new GregorianCalendar(); cal.setTime(this.fechaNacimiento); String fechaBD=cal.get(cal.DATE)+"/"+(cal.get(cal.MONTH)+1)+"/"+cal.get(cal.YEAR); //Modificamos las dos tuplas try { //Los datos de persona sentencia.executeUpdate("UPDATE persona SET nombre ='"+this.nombre+ "', apellido1='"+this.apellido1+"', apellido2='"+this.apellido2+ "', direccion='"+this.direccion+"', cp='"+this.cp+ "', localidad='"+this.localidad+"', provincia='"+this.provincia+ "', telefono='"+this.telefono+"', email='"+this.email+ "', lugarNacimiento='"+this.lugarNacimiento+ "', fechaNacimiento='"+fechaBD+ "', nif='"+this.nif+"', sexo='"+this.sexo+ "', nacionalidad='"+this.nacionalidad+"' "+ "WHERE pid="+this.pid); //Los datos de alumno sentencia.executeUpdate("UPDATE alumno SET login ='"+this.login+ "', password='"+this.password+ "', familiaNumerosa='"+this.familiaNumerosa+ "', centroProcedencia='"+this.centroProcedencia+ "', acceso='"+this.acceso+ "', notaAcceso="+this.notaAcceso+" "+ "WHERE pid="+this.pid); conexion.commit(); } catch (SQLException e2) { tituloHTML(out,"No se ha podido modificar el registro:"+e2.getMessage(),true); } } //Si no estamos en rellenar un nuevo registro, mostramos el formulario //relleno de los valores de la tupla correspondiente if (!this.accion.equals("Nuevo")) { //cogemos el registro a mostrar cogeRegistro(sentencia,out); //Mostramos el formulario con el registro muestraFormulario(out); //mostramos la barra de herramientas normal barraHerramientas(out); } //Muestro el pie de página HTML pieHTML(out); //Cerramos la conexión a la base de datos try { if (conexion!=null) conexion.close(); }catch (SQLException e3) { //Muestro el mensaje de error SQL tituloHTML(out,"Fallo al desconectar SQL: "+e3.getMessage(),true); } }//fin método doGet /*---------------------------------------------------------------*/ /** * Este método implementa el método doPost, simplemente haciendo una * rellamada a doGet. * @param req Variable para la llamada al servlet * @param res Variable para la respuesta al servlet */ public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { doGet(req, res); } /*---------------------------------------------------------------*/ /** * En este método se recogen los parámetro del formulario. * @param s clase para realiza la sentencia de consulta * @param out salida del servlet donde escribir */ public void cogeRegistro(Statement s,PrintWriter out){ int n=0; ResultSet res; try { //Miro el numero de registros que hay en la tabla alumno res=s.executeQuery("SELECT count(pid) FROM alumno"); res.next(); n=res.getInt(1); //Si estamos al final, nos vamos al principio y viceversa if (this.num>n) this.num=1; else if (this.num<1) this.num=n; //Hago la consulta res=s.executeQuery("SELECT persona.pid,nombre,apellido1,apellido2, "+ " direccion,cp,localidad,provincia, "+ " telefono,email,lugarNacimiento, "+ " fechaNacimiento,nif,sexo,nacionalidad, "+ " login,password,familiaNumerosa, "+ " centroProcedencia,acceso,notaAcceso "+ "FROM persona, alumno WHERE (persona.pid = alumno.pid)"); //Busco el registro número this.num y lo guardo n=1; while (res.next() && n<=this.num) { if (n==num) { //Cogemos los datos de la persona this.pid=res.getInt(1); this.nombre=res.getString(2); if (res.wasNull()) this.nombre=""; this.apellido1=res.getString(3); if (res.wasNull()) this.apellido1=""; this.apellido2=res.getString(4); if (res.wasNull()) this.apellido2=""; this.direccion=res.getString(5); if (res.wasNull()) this.direccion=""; this.cp=res.getString(6); if (res.wasNull()) this.cp=""; this.localidad=res.getString(7); if (res.wasNull()) this.localidad=""; this.provincia=res.getString(8); if (res.wasNull()) this.provincia=""; this.telefono=res.getString(9); if (res.wasNull()) this.telefono=""; this.email=res.getString(10); if (res.wasNull()) this.email=""; this.lugarNacimiento=res.getString(11); if (res.wasNull()) this.lugarNacimiento=""; this.fechaNacimiento=res.getDate(12); if (res.wasNull()) this.fechaNacimiento=null; this.nif=res.getString(13); if (res.wasNull()) this.nif=""; this.sexo=res.getString(14); if (res.wasNull()) this.sexo="H"; this.nacionalidad=res.getString(15); if (res.wasNull()) this.nacionalidad=""; //Cogemos los datos del alumno this.login=res.getString(16); if (res.wasNull()) this.login=""; this.password=res.getString(17); if (res.wasNull()) this.password=""; this.familiaNumerosa=res.getString(18); if (res.wasNull()) this.familiaNumerosa=""; this.centroProcedencia=res.getString(19); if (res.wasNull()) this.centroProcedencia=""; this.acceso=res.getInt(20); if (res.wasNull()) this.acceso=0; this.notaAcceso=res.getFloat(21); if (res.wasNull()) this.notaAcceso=(float)0.0; } n++; }//end while } catch (SQLException e2) { tituloHTML(out,"Fallo al consultar un registro: "+e2.getMessage()+"\n"+e2.toString(),true); } }//fin metodo cogeRegistro /*---------------------------------------------------------------*/ /** * En este método se recogen los parámetro del formulario. * @param req Variable para la llamada al servlet */ public void cogeParametros(HttpServletRequest req) { //Obtengo accion y num this.accion=req.getParameter("accion"); if (this.accion==null ) this.accion="Siguiente"; String aux=req.getParameter("num"); try { this.num=Integer.parseInt(aux); }catch (NumberFormatException nfe) { this.num=0; } if (this.accion.equals("Cancelar") ) { this.accion="Siguiente"; this.num=0; } //Obtenemos el PID aux=req.getParameter("pid"); try { this.pid=Integer.parseInt(aux); }catch (NumberFormatException nfe) { this.pid=0; } //Obtenemos nombre y apellidos this.nombre=req.getParameter("nombre"); this.apellido1=req.getParameter("apellido1"); this.apellido2=req.getParameter("apellido2"); //Obtenemos datos de contacto this.direccion=req.getParameter("direccion"); this.cp=req.getParameter("cp"); this.localidad=req.getParameter("localidad"); this.provincia=req.getParameter("provincia"); this.telefono=req.getParameter("telefono"); this.email=req.getParameter("email"); //Obtenemos lugar de nacimiento this.lugarNacimiento=req.getParameter("lugarNacimiento"); //Obtenemos la fecha de nacimiento int anio=0; int mes=0; int dia=0; try { anio=Integer.parseInt(req.getParameter("anio")); mes=Integer.parseInt(req.getParameter("mes")); dia=Integer.parseInt(req.getParameter("dia")); }catch (NumberFormatException ignorada) {} GregorianCalendar cal=new GregorianCalendar(anio, mes, dia); this.fechaNacimiento=new Date(cal.getTimeInMillis()); //Obtenemos nif, sexo y nacionalidad this.nif=req.getParameter("nif"); this.sexo=req.getParameter("sexo"); if ( (this.sexo!=null) && this.sexo.equals("Hombre") ) this.sexo="H"; else this.sexo="M"; this.nacionalidad=req.getParameter("nacionalidad"); //Obtenemos los datos de alumno: login, clave y centroProcedencia this.login=req.getParameter("login"); this.password=req.getParameter("password"); this.centroProcedencia=req.getParameter("centroProcedencia"); this.familiaNumerosa=req.getParameter("familiaNumerosa"); //Obtenemos si es familia numerosa o no if ( (this.familiaNumerosa!=null) && this.familiaNumerosa.equals("Si") ) this.familiaNumerosa="S"; else this.familiaNumerosa="N"; //Obtenemos el año de acceso try { this.acceso=Integer.parseInt(req.getParameter("acceso")); }catch (NumberFormatException nfe) { this.acceso=0; } //Obtenemos la nota de acceso if (req.getParameter("notaAcceso")==null) this.notaAcceso=(float)0.0; else try { this.notaAcceso=Float.parseFloat(req.getParameter("notaAcceso")); }catch (NumberFormatException nfe) { this.notaAcceso=(float)0.0; } }//Fin método cogeParametros /*---------------------------------------------------------------*/ /** * Este método escribe una tabla HTML con un formulario que muestra * la tupla en memoria, para consultar/crear/introducir/modificar * los datos de la tabla Persona. * @param out salida del servlet donde escribir */ public void muestraFormulario(PrintWriter out) { //Estilos usados para atributos y contenidos String atrib="style=\"text-align: right; color: white; background-color:#547cb4 ;\""; String cont="style=\"text-align: left;color: black; background-color:white;\""; //Escribimos el principio del formulario como una tabla out.println("
"+ "
"+ ""); //Escribimos el pid,nombre, apellidos y datos de contacto out.println(""+ ""+ ""+ ""+ ""+ ""+ ""+ ""); //Mostramos nacionalidad y nif out.println(""); //mostramos el sexo como una lista deplegable out.println( ""); //Fin de la tabla out.println( "
PID:"+ this.pid+"
Nombre:
Apellidos: 
Direccion:Código Postal:
Localidad:Provincia:
Teléfono:Correo Electrónico:
Lugar de Nacimiento:Fecha de Nacimiento:"); //Mostramos las listas de año,mes y día para la fecha de nacimiento GregorianCalendar cal=new GregorianCalendar(); if (this.fechaNacimiento!=null) cal.setTime(this.fechaNacimiento); else cal.setTimeInMillis(System.currentTimeMillis()); //Mostramos los días out.println(" Dia:"); //Mostramos los meses out.println(" Mes:"); //Mostramos los años (desde el actual al 1900) GregorianCalendar cal2=new GregorianCalendar(); cal2.setTimeInMillis(System.currentTimeMillis()); out.println(" Año:
NIF:Nacionalidad:
sexo:"); out.println( "
"); out.println( "
"); //Escribimos el principio del formulario como una tabla out.println(""); //Mostramos los datos de Alumno //Mostramos Usario y contraseña out.println(""); //mostramos el familiaNumerosa como una lista deplegable out.println( ""); //mostramos el centro de procedencia out.println(""+ ""); //mostramos la nota de acceso out.println(""); //Fin de la tabla out.println( "
Usuario:Contraseña:
Familia Numerosa:"); out.println( "Centro de Procedencia:
"); //mostramos el año de acceso out.println(" Año de Acceso:: Nota de Acceso:
"); }//fin metodo muestraFormulario /*---------------------------------------------------------------*/ /** * En este método se añade a la página la barra de herramientas, es * decir, el botón de anterior, siguiente, modificar, borrar y nuevo * @param out salida del servlet donde escribir */ public void barraHerramientas(PrintWriter out) { out.println("

"); out.println("
"); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); out.println("
"); out.println("

"); out.println("
"); }//Fin metodo barraHerramientas /*---------------------------------------------------------------*/ /** * En este método se añade a la página la barra de herramientas cuando * se va a añadir un nuevo registro, sólo hay dos acciones Crear y Cancelar * @param out salida del servlet donde escribir */ public void barraHerramientasNuevo(PrintWriter out) { out.println("

"); out.println("
"); out.println(""); out.println(""); out.println(""); out.println("
"); out.println("

"); out.println(""); }//Fin metodo barraHerramientasNuevo /*---------------------------------------------------------------*/ /** * Este método escribe la cabecera HTML de la página web. * @param out salida del servlet donde escribir * @param titulo titulo de la página HTML */ public void cabeceraHTML(PrintWriter out, String titulo) { out.println(""+ ""+ ""+ ""+ ""+titulo+""+ ""+ ""+ ""); }//fin método cabeceraHTML /*---------------------------------------------------------------*/ /** * Este método escribe el titulo de la página HTML aunque también * sirve para mostrar un posible error de la BD. * @param out salida del servlet donde escribir * @param mensaje titulo o mensaje de error de la página HTML * @param volver nos dice si poner el enlace de volver o no */ public void tituloHTML(PrintWriter out, String mensaje, boolean volver) { out.println(""+ ""+ ""+ "


"+mensaje+"
 

"); if (volver) out.println("


VOLVER
 


"); }//fin método tituloHTML /*---------------------------------------------------------------*/ /** * Este método escribe el pie HTML de la página web. * @param out salida del servlet donde escribir */ public void pieHTML(PrintWriter out) { out.println(""+ ""+ ""+ "
"+ ""+ ""+ "
 "+ "

fjgc@decsai.ugr.es

"+ "
 
"+ "
"+ ""+ ""+ ""+ ""+ ""+ ""); }//fin método pieHTML /*---------------------------------------------------------------*/ }//Fin clase Alumno