import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
import java.util.GregorianCalendar;
/*---------------------------------------------------------------*/
/**
* En este servlet implementamos el formulario Persona, el cual
* nos permite movernos por los distintos registros de la tabla
* persona, 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 Persona 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;
/**
*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;
/*---------------------------------------------------------------*/
/**
* 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");
//Mostramos el título de la página y la tabla con los resultados
tituloHTML(out,"Datos Persona",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="";
//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 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 la tupla en la BD
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+"' )");
conexion.commit();
} catch (SQLException e2) {
tituloHTML(out,"No se ha podido insertar el registro:"+e2.getMessage(),true);
}
//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 la tupla
try {
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);
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 persona
res=s.executeQuery("SELECT count(pid) FROM persona");
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 pid,nombre,apellido1,apellido2, "+
" direccion,cp,localidad,provincia, "+
" telefono,email,lugarNacimiento, "+
" fechaNacimiento,nif,sexo,nacionalidad "+
"FROM persona");
//Busco el registro número this.num y lo guardo
n=1;
while (res.next() && n<=this.num) {
if (n==num) {
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="";
}
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");
}//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("
");
}//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("");
}//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(""+
""+
""+
""+
""+
""+
""+
""+
""+
"");
}//fin método pieHTML
/*---------------------------------------------------------------*/
}//Fin clase Persona