Aplicación para la gestión de empleados

Anuncio
El protocolo de comunicación entre el cliente y el servidor es el siguiente:
Del cliente al servidor:
• El cliente envía un 1 para solicitar que el servidor valide en la BD los datos de autenticación.
• El cliente envía un 2 al servidor para realizar una primera consulta realizada por el usuario en la cual
se cargará en otro formulario una lista con todos los nombre de empleados que cumplan los criterios
de búsqueda seleccionados para que el usuario elija uno de ellos y ver así el detalle de su ficha.
• El cliente envía un 3 para que el servidor pida a la BD los nombres de departamentos existentes y
cargarlos en el choice de applet cuando el cliente quiere dar un alta. De este modo, el cliente solo
podrá elegir entre los departamentos ya existentes a la hora de crear un nuevo empleado
• El cliente envía un 4 cuando el usuario quiere dar de alta un nuevo empleado una vez rellenados todos
sus campos.
• El cliente envía un 5 al servidor para que busque en la BD el registro correspondiente al departamento
asociado al nuevo empelado que ha dado de alta el usuario.
• El cliente envía un 6 cuando el usuario ha seleccionado un empleado concreto en la lista y quiere ver
el detalle de su condulta.
• El cliente envía un 7 al servidor cuando quiere cerrar la aplicación y de ese modo solicita la
desconexión con el servidor matando el hilo.
La clase Hilo.class generada por el servidor evalua en un while true (hasta que se desconecte el cliente)
mediante un switch el número que le mande el cliente para tratar de forma correcta su petición.
Del servidor al cliente:
• El Servidor envía un 1 al cliente cuando su solicitud ha sido procesada con éxito.
• El servidor envía un número distinto de 1 cuando se ha producido algún error en su solicitud.
De esta forma, el cliente siempre sabe si su petición al servidor ha sido o no satisfactoria.
GESTIÓN DE EMPLEADOS
La aplicación consiste en una herramienta a la que se tendrá acceso desde Internet o dentro de una red local
orientada a business to business capaz de realizar búsquedas de la localización de empleados dentro de una
empresa mostrando información relativa al cargo que ocupa en la empresa, así como su localización
geográfica dentro la misma, es decir, la planta y el departamento en el que se encuentra.
También se podrá dar de alta nuevos empleados en la base de datos asignándole un código de empleado y su
localización geográfica correspondiente.
Todo esto se realizará tras una previa identificación con usuario y password ya que sólo tendrán acceso a la
aplicación los usuarios registrados.
El usuario dispondrá de diversas pantallas para realizar las búsquedas y ejecutar altas. Tras identificarse como
usuario registrado, tendrá dos opciones: o bien puede dar de alta un nuevo empleado, o bien puede realizar
una consulta por código de empleado ,por nombre de empleado, o por ambos campos juntos. De esta consulta
pueden salir varios empleados que cumplan los criterios de búsqueda, por ello, todos los empleados
resultantes de dicha búsqueda, apareceran en una lista para que el usuario seleccione pinchando en el que le
interesa, mostrándose así los datos personales de dicho empleado.
1
Para realizar un alta, deberá rellenar los campos que se le solicitan y elegir ,de entre varios posibles, el
departamento en el que desea ubicarlo.
El usuario podrá abandonar la aplicación en el momento que lo desee tan solo pulsando un botón.
FUENTES
Inicio.java
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class Inicio extends Applet implements ActionListener{
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−VARIABLES
GLOBALES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Frame ventana;
Panel panelSur, panelMedio, panelNorte, panelCentro;
Button botonAceptar, botonSalir, botonBuscar, botonBuscarEmpleado, botonNuevoEmpleado, botonAlta,
botonVerDatos;
Panel panelA, panelAs, panelC, panelS, panelS2, panelBsur, panelBusqueda, panelNuevo, panelResultado,
panelLista, panelLsur;
CardLayout cambioPanelCentro = new CardLayout();
CardLayout cambioPanelSur = new CardLayout();
Label etiquetaLogin, etiquetaPass, etiquetaTitulo, etiquetaCodigo, etiquetaNombre, etiquetaCargo,
etiquetaPlanta, etiquetaDepartamento, etiquetaCDepartamento, etiquetaLista, etiquetaTodos;
TextField textoLogin, textoPass, textoCodigo, textoNombre, textoCargo, textoPlanta, textoDepartamento,
textoCDepartamento;
MenuBar barraMenu;
Menu menuGestion, menuSalir;
MenuItem opcionAlta, opcionConsulta, opcionSalir;
Socket conexion = null;
2
DataInputStream flujoEntradaFormato = null;
DataOutputStream flujoSalidaDatos = null;
Choice cajaCDepartamento;
List listaEmpleados;
int resultado;
String[] choice;
String[] datos;
boolean conectado = false;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE VARIABLES
GLOBALES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// CREAMOS UN OBJETO FRAME
public void init() {
ventana = new Frame("Aplicacion Gestion de Empleados");
this.metodoInicio();
}
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−CONSTRUIMOS LA
VENTANA−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
public void metodoInicio() {
this.construirVentana();
}
public void construirVentana() {
panelNorte = new Panel();
panelCentro = new Panel();
panelMedio = new Panel();
panelSur = new Panel();
this.crearComponentes();
this.construirPanelNorte();
3
this.construirPanelMedio();
this.construirPanelSur();
this.construirMenu();
cambioPanelCentro.show( panelMedio, "id" );
cambioPanelSur.show( panelSur, "log" );
ventana.setLayout( new BorderLayout() );
ventana.add(panelNorte, "North");
ventana.add(panelMedio, "Center");
ventana.add(panelSur, "South");
ventana.setMenuBar(barraMenu);
ventana.setSize(600,400);
ventana.setVisible(true);
ventana.setResizable(false);
}
public void construirMenu() {
barraMenu = new MenuBar();
menuGestion = new Menu("Gestión");
menuSalir = new Menu("Salir");
opcionAlta = new MenuItem("Nuevo Empleado");
opcionConsulta = new MenuItem("Buscar Empleado");
opcionSalir = new MenuItem("Salir");
menuGestion.add(opcionAlta);
menuGestion.add(opcionConsulta);
menuSalir.add(opcionSalir);
barraMenu.add(menuGestion);
barraMenu.add(menuSalir);
4
opcionAlta.setEnabled(false);
opcionConsulta.setEnabled(false);
opcionAlta.addActionListener( this);
opcionConsulta.addActionListener( this);
opcionSalir.addActionListener( this);
}
public void construirPanelNorte() {
etiquetaTitulo = new Label("GESTION DE EMPLEADOS");
etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) );
etiquetaTitulo.setAlignment (Label.CENTER);
panelNorte.setLayout( new FlowLayout() );
panelNorte.add( etiquetaTitulo );
}
public void construirPanelMedio() {
Label etiquetaArroba = new Label("@");
etiquetaArroba.setFont ( new Font ("Verdana", Font.BOLD, 72) );
etiquetaArroba.setAlignment (Label.CENTER);
panelC = new Panel();
botonSalir = new Button("Salir");
panelC.setLayout(new FlowLayout() );
panelC.add( botonSalir );
panelMedio.setLayout( cambioPanelCentro );
panelCentro.setLayout( new BorderLayout() );
panelCentro.setBackground(Color.yellow);
panelCentro.add( etiquetaArroba, "Center");
panelCentro.add( panelC, "South" );
5
panelMedio.add( panelCentro, "id" );
botonSalir.addActionListener( this);
}
public void construirPanelSur() {
panelSur.setLayout( cambioPanelSur );
panelS = new Panel();
panelS.setLayout( new FlowLayout() );
etiquetaLogin = new Label("Login:");
etiquetaPass = new Label("Password:");
textoLogin = new TextField();
textoPass = new TextField();
textoLogin.setColumns(15);
textoPass.setColumns(15);
botonAceptar = new Button("Aceptar");
panelS.add(etiquetaLogin);
panelS.add(textoLogin);
panelS.add(etiquetaPass);
panelS.add(textoPass);
panelS.add(botonAceptar);
panelSur.add( panelS, "log" );
botonAceptar.addActionListener( this);
}
public void construirPanelBusqueda() {
panelBusqueda = new Panel();
panelBusqueda.setLayout( new BorderLayout() );
panelBsur = new Panel();
6
botonBuscar = new Button("Buscar");
panelBsur.setLayout(new FlowLayout() );
panelBsur.add( botonBuscar );
Panel panelB = new Panel();
panelB.setLayout( new GridLayout(3,1) );
Panel panelB1 = new Panel();
panelB1.setLayout( new FlowLayout());
Panel panelB2 = new Panel();
panelB2.setLayout( new FlowLayout());
Panel panelBaux = new Panel();
panelBaux.setLayout( new FlowLayout());
panelBaux.add( etiquetaTodos );
panelB1.add( etiquetaCodigo );
panelB1.add( textoCodigo );
panelB2.add( etiquetaNombre );
panelB2.add( textoNombre );
panelB.add( panelBaux );
panelB.add( panelB1 );
panelB.add( panelB2 );
panelBusqueda.add( panelB, "Center" );
panelBusqueda.add( panelBsur, "South" );
panelMedio.add( panelBusqueda, "buscar" );
cambioPanelCentro.show( panelMedio, "buscar" );
etiquetaTitulo.setText("BÚSQUEDA DE EMPLEADOS");
etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) );
etiquetaTitulo.setAlignment (Label.CENTER);
7
botonBuscar.addActionListener( this);
}
public void construirPanelAlta() {
panelA = new Panel();
panelA.setLayout( new BorderLayout() );
Panel panelAsur;
panelAsur = new Panel();
panelAsur.setLayout(new FlowLayout() );
botonAlta = new Button("Dar de Alta");
panelAsur.add( botonAlta );
Panel panelA2 = new Panel();
panelA2.setLayout( new GridLayout(5,1) );
Panel panelA3 = new Panel();
panelA3.setLayout( new FlowLayout());
Panel panelA4 = new Panel();
panelA4.setLayout( new FlowLayout());
Panel panelA5 = new Panel();
panelA5.setLayout( new FlowLayout());
Panel panelA6 = new Panel();
panelA6.setLayout( new FlowLayout());
Panel panelA8 = new Panel();
panelA8.setLayout( new FlowLayout());
Panel panelAaux = new Panel();
panelAaux.setLayout( new FlowLayout());
panelA3.add( etiquetaCodigo );
panelA3.add( textoCodigo );
8
panelA4.add( etiquetaNombre );
panelA4.add( textoNombre );
panelA5.add( etiquetaCargo );
panelA5.add( textoCargo );
panelA8.add( etiquetaCDepartamento );
panelA8.add( cajaCDepartamento );
panelA2.add( panelAaux );
panelA2.add( panelA3 );
panelA2.add( panelA4 );
panelA2.add( panelA5 );
panelA2.add( panelA8 );
panelA.add( panelA2, "Center" );
panelA.add( panelAsur, "South" );
panelMedio.add( panelA, "alta" );
cambioPanelCentro.show( panelMedio, "alta" );
etiquetaTitulo.setText("ALTA DE EMPLEADOS");
etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) );
etiquetaTitulo.setAlignment (Label.CENTER);
botonAlta.addActionListener( this);
}
public void construirPanelDatos() {
panelA = new Panel();
panelA.setLayout( new BorderLayout() );
Panel panelAsur;
panelAsur = new Panel();
panelAsur.setLayout(new FlowLayout() );
9
Panel panelA2 = new Panel();
panelA2.setLayout( new GridLayout(7,1) );
Panel panelA3 = new Panel();
panelA3.setLayout( new FlowLayout());
Panel panelA4 = new Panel();
panelA4.setLayout( new FlowLayout());
Panel panelA5 = new Panel();
panelA5.setLayout( new FlowLayout());
Panel panelA6 = new Panel();
panelA6.setLayout( new FlowLayout());
Panel panelA7 = new Panel();
panelA7.setLayout( new FlowLayout());
Panel panelA8 = new Panel();
panelA8.setLayout( new FlowLayout());
Panel panelAaux = new Panel();
panelAaux.setLayout( new FlowLayout());
panelA3.add( etiquetaCodigo );
panelA3.add( textoCodigo );
panelA4.add( etiquetaNombre );
panelA4.add( textoNombre );
panelA5.add( etiquetaCargo );
panelA5.add( textoCargo );
panelA6.add( etiquetaPlanta );
panelA6.add( textoPlanta );
panelA7.add( etiquetaDepartamento );
panelA7.add( textoDepartamento );
10
panelA8.add( etiquetaCDepartamento );
panelA8.add( textoCDepartamento );
panelA2.add( panelAaux );
panelA2.add( panelA3 );
panelA2.add( panelA4 );
panelA2.add( panelA5 );
panelA2.add( panelA6 );
panelA2.add( panelA7 );
panelA2.add( panelA8 );
panelA.add( panelA2, "Center" );
panelA.add( panelAsur, "South" );
panelMedio.add( panelA, "alta" );
cambioPanelCentro.show( panelMedio, "alta" );
etiquetaTitulo.setText("RESULTADO");
etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) );
etiquetaTitulo.setAlignment (Label.CENTER);
}
public void construirPanelLista() {
panelLista = new Panel();
panelLista.setLayout( new BorderLayout() );
panelLsur = new Panel();
botonVerDatos = new Button("Ver Datos");
panelLsur.setLayout(new FlowLayout() );
panelLsur.add( botonVerDatos );
Panel panelL = new Panel();
panelL.setLayout( new GridLayout(2,1) );
11
Panel panelL1 = new Panel();
panelL1.setLayout( new FlowLayout());
Panel panelLaux = new Panel();
panelLaux.setLayout( new FlowLayout());
etiquetaLista = new Label("Seleccione un elemento de la lista");
panelL1.add( etiquetaLista );
panelL1.add( listaEmpleados );
panelL.add( panelLaux );
panelL.add( panelL1 );
panelLista.add( panelL, "Center" );
panelLista.add( panelLsur, "South" );
panelMedio.add( panelLista, "listar" );
cambioPanelCentro.show( panelMedio, "listar" );
etiquetaTitulo.setText("RESULTADO CONSULTA");
etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) );
etiquetaTitulo.setAlignment (Label.CENTER);
botonVerDatos.addActionListener(this);
listaEmpleados.addActionListener(this);
}
public void construirMenuInferior() {
panelS2 = new Panel();
panelS2.setLayout( new FlowLayout() );
botonBuscarEmpleado = new Button("Buscar Empleado");
botonNuevoEmpleado = new Button("Nuevo Empleado");
panelS2.add(botonBuscarEmpleado);
panelS2.add(botonNuevoEmpleado);
12
panelS2.add(botonSalir);
panelSur.add( panelS2, "normal" );
cambioPanelSur.show( panelSur, "normal" );
botonBuscarEmpleado.addActionListener( this );
botonNuevoEmpleado.addActionListener( this );
this.EvaluarBotones("resultado");
}
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE CONSTRUIR LA
VENTANA−−−−−−−−−−−−−−−−−−−−−−−−−−
//−−−−−−−−−−−−−−−−−−−−−−−−EVALUAMOS LOS BOTONES PARA HABILITARLOS O
DESHABILITARLOS−−−−−−−−−−−−−
public void EvaluarBotones(String tipo) {
if(tipo.equals("busqueda")){
textoCodigo.setEditable(true);
textoNombre.setEditable(true);
textoCargo.setEditable(true);
textoPlanta.setEditable(true);
textoDepartamento.setEditable(true);
textoCDepartamento.setEditable(true);
botonBuscarEmpleado.setEnabled(false);
botonNuevoEmpleado.setEnabled(true);
opcionAlta.setEnabled(true);
opcionConsulta.setEnabled(false);
}else if(tipo.equals("alta")){
textoCodigo.setEditable(true);
textoNombre.setEditable(true);
textoCargo.setEditable(true);
13
textoPlanta.setEditable(true);
textoDepartamento.setEditable(true);
textoCDepartamento.setEditable(true);
botonNuevoEmpleado.setEnabled(false);
botonBuscarEmpleado.setEnabled(true);
opcionAlta.setEnabled(false);
opcionConsulta.setEnabled(true);
}else if(tipo.equals("resultado")){
textoCodigo.setEditable(false);
textoNombre.setEditable(false);
textoCargo.setEditable(false);
textoPlanta.setEditable(false);
textoDepartamento.setEditable(false);
textoCDepartamento.setEditable(false);
botonNuevoEmpleado.setEnabled(true);
botonBuscarEmpleado.setEnabled(true);
opcionAlta.setEnabled(true);
opcionConsulta.setEnabled(true);
}
}
//−−−−−−−−−−−−−−−−−FIN DE EVALUAMOS LOS BOTONES PARA HABILITARLOS O
DESHABILITARLOS−−−−−−−−−−−−−
//−−−−−−−−−−−−−−−−−−−−−−−CREAMOS (SOLO 1 VEZ) LOS COMPONENTES DE LA
VENTANA−−−−−−−−−−−−−−−−−−−−
public void crearComponentes(){
// CODIGO
etiquetaCodigo = new Label("Código");
14
textoCodigo = new TextField();
textoCodigo.setColumns(10);
// NOMBRE
etiquetaNombre = new Label("Nombre");
textoNombre = new TextField();
textoNombre.setColumns(35);
// CARGO
etiquetaCargo = new Label("Cargo");
textoCargo = new TextField();
textoCargo.setColumns(35);
// CODIGO DEPARTAMENTO
etiquetaCDepartamento = new Label("Código de Departamento");
textoCDepartamento = new TextField();
textoCDepartamento.setColumns(5);
// DEPARTAMENTO
etiquetaDepartamento = new Label("Departamento");
textoDepartamento = new TextField();
textoDepartamento.setColumns(35);
// PLANTA
etiquetaPlanta = new Label("Planta");
textoPlanta = new TextField();
textoPlanta.setColumns(5);
// ETIQUETA TODOS
etiquetaTodos = new Label("Para seleccionar todos los empleados, deje los campos en blanco");
}
//−−−−−−−−−−−−−−−−−−−FIN DE CREAMOS (SOLO 1 VEZ) LOS COMPONENTES DE LA
VENTANA−−−−−−−−−−−−−−−−−−−−
15
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−ESCUCHAMOS LOS EVENTOS DE LOS
BOTONES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
public void actionPerformed( ActionEvent event ) {
String etiqueta = event.getActionCommand();
if ( etiqueta.equals("Aceptar") ) this.Conectar();
if ( etiqueta.equals("Salir") ) this.Salir();
if ( etiqueta.equals("Nuevo Empleado") ) this.Alta();
if ( etiqueta.equals("Buscar Empleado") ) this.Buscar();
if ( etiqueta.equals("Buscar") ) this.DatosBuscar();
if ( etiqueta.equals("Dar de Alta") ) this.DatosAlta();
if ( etiqueta.equals("Ver Datos") ) this.MostrarEmpleado();
}
//−−−−−−−−−−−−−−−−−−−−−−−−FIN DE ESCUCHAMOS LOS EVENTOS DE LOS
BOTONES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
//−−−−−−−−−−−−CONECTAMOS CON EL SERVIDOR EN LA DIRECCION "127.0.0.1" Y EN EL
PUERTO "1234"−−−−−−−−−−−−−−
public void realizarConexion() {
String ipDestino = "127.0.0.1";
int puerto = 1234;
InetAddress direccion = null;
try {
//InetAdress especifica el servidor al que nos queremos conectar
direccion = InetAddress.getByName(ipDestino);
} catch (UnknownHostException uhe) {
System.err.println("Host no encontrado..." + uhe);
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Servidor no Encontrado", "Intentelo de nuevo más tarde",
"Aceptar");
16
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}
try {
conexion = new Socket(direccion, puerto);
//Creamos los flujos
OutputStream flujoDatos = conexion.getOutputStream();
InputStream flujoEntrada = conexion.getInputStream();
//Recubrimos los flujos
flujoSalidaDatos = new DataOutputStream(flujoDatos);
flujoEntradaFormato = new DataInputStream(flujoEntrada);
// Estamos conectados
conectado = true;
} catch (IOException io) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error de comunicaciones", "Servidor fuera de servicio",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al establecer la comunicación", "Vuelva a intentarlo
más tarde", "Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
17
dErrorUsuario.setVisible(true);
}
}
//−−−−−−−−−FIN DE CONECTAMOS CON EL SERVIDOR EN LA DIRECCION "127.0.0.1" Y EN EL
PUERTO "1234"−−−−−−−−−−−−−−
//−−−−−−−−−−−−−−−−−−−−−−−−−TRATAMOS LOS BOTONES QUE PULSA EL
USUARIO−−−−−−−−−−−−−−−−−−−−−−−−−−−−
public void Conectar() {
if(conectado==false){
this.realizarConexion();
}
if(conectado==true){
this.autenticarse();
if ( resultado == 1 ){
this.construirMenuInferior();
} else {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error de Autenticacion", "Revise los datos", "Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}
}
}
public void Alta() {
this.crearComponentes();
this.cargarChoice();
18
this.construirPanelAlta();
this.EvaluarBotones("alta");
}
public void Buscar() {
this.crearComponentes();
this.construirPanelBusqueda();
this.EvaluarBotones("busqueda");
}
public void DatosAlta() {
this.enviarAlta();
if ( resultado==1 ){
this.enviarResultadoAlta();
this.construirPanelDatos();
this.EvaluarBotones("resultado");
} else if( resultado==0 ){
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "No puede dejar campos en blanco",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
} else if( resultado==10 ){
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "Ya existe un empleado con ese
código", "Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
19
dErrorUsuario.setVisible(true);
} else if( resultado==20 ){
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "El código debe ser de 5 caracteres",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}
}
public void DatosBuscar() {
this.enviarConsulta();
if(resultado!=0){
this.construirPanelLista();
this.EvaluarBotones("resultado");
}else{
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Su consulta no obtuvo resultado",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}
}
public void MostrarEmpleado() {
this.enviarEmpleadoConsulta();
if(resultado==1){
20
this.construirPanelDatos();
this.EvaluarBotones("resultado");
}else if(resultado==10){
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Debe seleccionar un empelado",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}else if(resultado==0){
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Su consulta no obtuvo resultado",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}
}
public void cargarChoice() {
try {
flujoSalidaDatos.writeInt(3);
resultado = flujoEntradaFormato.readInt();
choice = new String[resultado];
if(resultado!=0){
for(int i = 0; i<resultado; i++){
choice[i] = flujoEntradaFormato.readUTF();
}
21
cajaCDepartamento = new Choice();
for(int a = 0; a<resultado; a++){
cajaCDepartamento.add(choice[a]);
}
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void autenticarse() {
try {
datos = new String[2];
datos[0] = textoLogin.getText();
datos[1] = textoPass.getText();
for(int i=0; i<datos.length; i++){
if(datos[i].equals("")){
resultado = 0;
} else {
if(i==0){
flujoSalidaDatos.writeInt(1);
}
22
flujoSalidaDatos.writeUTF(datos[i]);
if(i==1){
resultado = flujoEntradaFormato.readInt();
}
}
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void enviarConsulta() {
try {
flujoSalidaDatos.writeInt(2);
flujoSalidaDatos.writeUTF(textoNombre.getText());
flujoSalidaDatos.writeUTF(textoCodigo.getText());
resultado = flujoEntradaFormato.readInt();
datos = new String[resultado];
if(resultado!=0){
for(int i = 0; i<resultado; i++){
datos[i] = flujoEntradaFormato.readUTF();
}
23
listaEmpleados = new List(5);
for(int a = 0; a<resultado; a++){
listaEmpleados.add(datos[a]);
}
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void enviarAlta() {
try {
if(textoCodigo.getText().equals("") || textoNombre.getText().equals("") || textoCargo.getText().equals("")){
resultado = 0;
} else {
if(textoCodigo.getText().length() != 5){
resultado = 20;
} else {
flujoSalidaDatos.writeInt(4);
flujoSalidaDatos.writeUTF(textoCodigo.getText());
flujoSalidaDatos.writeUTF(textoNombre.getText());
flujoSalidaDatos.writeUTF(textoCargo.getText());
24
flujoSalidaDatos.writeUTF(cajaCDepartamento.getSelectedItem());
resultado = flujoEntradaFormato.readInt();
}
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void enviarEmpleadoConsulta() {
try {
flujoSalidaDatos.writeInt(6);
if(listaEmpleados.getSelectedIndex()==−1){
resultado = 10;
} else {
flujoSalidaDatos.writeUTF(listaEmpleados.getSelectedItem());
datos = new String[6];
for(int i=0; i<datos.length; i++){
datos[i] = flujoEntradaFormato.readUTF();
}
resultado = flujoEntradaFormato.readInt();
if(resultado!=0){
25
textoCodigo.setText(datos[0]);
textoNombre.setText(datos[1]);
textoCargo.setText(datos[2]);
textoCDepartamento.setText(datos[3]);
textoDepartamento.setText(datos[4]);
textoPlanta.setText(datos[5]);
}
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void enviarResultadoAlta() {
try {
flujoSalidaDatos.writeInt(5);
flujoSalidaDatos.writeUTF(cajaCDepartamento.getSelectedItem());
datos = new String[3];
for(int i=0; i<datos.length; i++){
datos[i] = flujoEntradaFormato.readUTF();
}
resultado = flujoEntradaFormato.readInt();
26
if(resultado==1){
textoCDepartamento.setText(datos[0]);
textoDepartamento.setText(datos[1]);
textoPlanta.setText(datos[2]);
textoCodigo.setText(textoCodigo.getText());
textoNombre.setText(textoNombre.getText());
textoCargo.setText(textoCargo.getText());
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void Salir(){
try {
if(conectado==false){
ventana.dispose();
}else{
flujoSalidaDatos.writeInt(7);
ventana.dispose();
}
} catch (Exception e) {
27
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
//−−−−−−−−−−−−−−−−−−−−−FIN DE TRATAMOS LOS BOTONES QUE PULSA EL
USUARIO−−−−−−−−−−−−−−−−−−−−−−−−−−−−
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE LA APLICACION
CLIENTE−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
}
DialogoInformativo.java
import java.awt.*;
import java.awt.event.*;
public class DialogoInformativo extends Dialog implements ActionListener {
String mensaje, etiqueta;
public DialogoInformativo(Frame ventana, String titulo, String mensaje, String etiqueta) {
super(ventana, titulo);
this.mensaje = mensaje;
this.etiqueta = etiqueta;
this.construirDialogo();
}
public void construirDialogo() {
Label etiquetaMensaje = new Label(mensaje);
Panel panelEtiqueta = new Panel();
28
panelEtiqueta.setLayout( new FlowLayout() );
panelEtiqueta.add( etiquetaMensaje);
Button boton = new Button(etiqueta);
boton.addActionListener( this );
Panel panelBoton = new Panel();
panelBoton.setLayout( new FlowLayout() );
panelBoton.add( boton);
this.setLayout( new GridLayout(2,1) );
this.add( panelEtiqueta );
this.add( panelBoton );
}
public void actionPerformed(ActionEvent event ) {
this.dispose();
}
}
Servidor.java
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.sql.*;
import java.lang.*;
public class Servidor extends Frame implements ActionListener {
//Variables Globales
Label etiquetaIP, etiquetaNClientes, etiquetaEstado, etiquetaContenido;
TextField textoIP, textoNClientes, textoEstado;
29
TextArea txaContenido;
Button botonApagar;
public Servidor() {
super("Servidor de Gestion de Empleados");
}
public static void main(String args[] ) {
Servidor obj = new Servidor();
obj.inicio();
}
public void inicio() {
etiquetaIP = new Label("Dirección IP local...");
textoIP = new TextField(30);
textoIP.setEnabled(false);
etiquetaNClientes = new Label("Nº de clientes autenticados...");
textoNClientes = new TextField(10);
textoNClientes.setEnabled(false);
etiquetaEstado = new Label("Estado de la comunicación...");
textoEstado = new TextField(20);
textoEstado.setEnabled(false);
etiquetaContenido = new Label("Datos recibidos del cliente...");
txaContenido = new TextArea(4,15);
txaContenido.setEnabled(false);
botonApagar = new Button("Apagar Servidor");
botonApagar.addActionListener(this);
this.setLayout( new GridLayout(6,2) );
this.add(etiquetaIP);
30
this.add(textoIP);
this.add(etiquetaNClientes);
this.add(textoNClientes);
this.add(etiquetaEstado);
this.add(textoEstado);
this.add(etiquetaContenido);
this.add(txaContenido);
this.add(botonApagar);
this.pack();
this.setSize(400,400);
this.setVisible(true);
//Buscar y visualizar la dirección IP local donde se ejecuta este programa
try {
InetAddress servidor = InetAddress.getLocalHost();
String cadenaDireccion = servidor.toString();
textoIP.setText(cadenaDireccion);
} catch (UnknownHostException uhe ) {
System.err.println("No se ha podido saber la dirección local: " + uhe );
}
//Abrimos el socket en el puerto 1234
ServerSocket conector = null;
try {
conector = new ServerSocket(1234);
} catch (IOException io) {
System.err.println("Se ha producido un error al abrir el Socket: " + io );
}
31
//Conexion a la base de datos
Connection conexionBD=null;
try {
Class.forName("org.gjt.mm.mysql.Driver");
conexionBD = DriverManager.getConnection("jdbc:mysql://localhost/empleados?user=&password=");
} catch (ClassNotFoundException e){
System.err.println("Clase no encontrada" + e);
} catch (SQLException e) {
System.err.println("Base de datos no encontrada" + e);
}
//Hilo
int numeroClientes = 0;
while(true) {
try {
textoEstado.setText("Esperando conexión con algún cliente...");
Socket conexion = conector.accept();
textoEstado.setText("La conexión se ha establecido con el cliente...");
numeroClientes ++;
textoNClientes.setText("" + numeroClientes);
//Creamos el hilo para un cliente
Hilo h = new Hilo(conexion, conexionBD, txaContenido);
h.start();
} catch (Exception e) {
System.err.println("Se ha producido un error...");
}
}
32
}
public void actionPerformed (ActionEvent event) {
String cadena = event.getActionCommand();
if(cadena.equals("Apagar Servidor")) System.exit(0);
}
}
Hilo.java
import java.awt.*;
import java.net.*;
import java.io.*;
import java.sql.*;
import java.lang.*;
public class Hilo extends Thread {
Socket conexion;
TextArea txaContenido;
Connection conexionBD;
Statement envio = null;
int protocolo = 0;
int salida = 0;
int i = 0;
DataInputStream flujoEntradaDatos = null;
DataOutputStream flujoSalidaFormato = null;
String sql = "";
ResultSet resultado = null;
ResultSet resultado_aux = null;
boolean salir = true;
33
public Hilo ( Socket conexion, Connection conexionBD, TextArea txaContenido) {
super();
this.conexion = conexion;
this.txaContenido = txaContenido;
this.conexionBD = conexionBD;
}
public void run() {
try {
//Creamos un flujo de entrada asociado al socket entre el cliente y el servidor
InputStream flujoDatos = conexion.getInputStream();
// Creamos el envoltorio para el flujo
flujoEntradaDatos = new DataInputStream( flujoDatos );
//Creamos un flujo de salida asociado al socket entre el cliente y el servidor
OutputStream flujoSalida = conexion.getOutputStream();
// Creamos el envoltorio para el flujo
flujoSalidaFormato = new DataOutputStream( flujoSalida );
} catch (Exception e) {
System.err.println("Se ha producido un error" + e);
}
while (true) {
try {
envio = conexionBD.createStatement();
//Se lee el primer dato recibido para saber
//lo que quiere hacer el cliente
protocolo = flujoEntradaDatos.readInt();
switch(protocolo){
34
case 1: // AUTENTICARSE
//Leemos los dos parámetros que nos envía el cliente
String login = flujoEntradaDatos.readUTF();
String password = flujoEntradaDatos.readUTF();
//Visualizamos lo que hemos recibido
txaContenido.append("Login: " + login + "Pass: " + password+ "\n");
//Validamos en la BD
sql = "SELECT * FROM usuarios WHERE login = '"+login+"' AND pass = '"+password+"'";
resultado = envio.executeQuery(sql);
System.err.println(sql);
//Si todo va bien, devolvemos un 1,
//en caso contrario un 0
if (resultado.next()) {
salida = 1;
} else {
salida = 0;
}
//Enviamos el resultado
flujoSalidaFormato.writeInt(salida);
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 2: // CONSULTA 1 DATOS A LISTA
String nombre = flujoEntradaDatos.readUTF();
String codigo = flujoEntradaDatos.readUTF();
//Validamos en la BD
35
sql = "SELECT nombre_empleado FROM empleado WHERE codigo_empleado like '%"+codigo+"%' AND
nombre_empleado like '%"+nombre+"%'";
resultado = envio.executeQuery(sql);
System.err.println(sql);
i = 0;
while(resultado.next()){
i++;
}
resultado = envio.executeQuery(sql);
//Enviamos el resultado, el int es el numero de registros
flujoSalidaFormato.writeInt(i);
while(resultado.next()){
flujoSalidaFormato.writeUTF(resultado.getString(1));
}
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 3: // CARGAR CHOICE
//Validamos en la BD
sql = "SELECT nombre_dpto FROM departamento";
resultado = envio.executeQuery(sql);
i = 0;
while(resultado.next()){
i++;
}
resultado = envio.executeQuery(sql);
//Enviamos el resultado un uno si no hay error
36
flujoSalidaFormato.writeInt(i);
while(resultado.next()){
flujoSalidaFormato.writeUTF(resultado.getString(1));
}
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 4: //INSERTAR UN NUEVO EMPLEADO
int alta;
String cod_dep = "";
String[] campos = new String[4];
for(int c=0; c<campos.length; c++){
campos[c] = flujoEntradaDatos.readUTF();
}
//Preguntamos si ya existe un empleado
//con ese codigo
sql = "SELECT * from empleado WHERE codigo_empleado = '"+campos[0]+"'";
resultado = envio.executeQuery(sql);
if(resultado.next()){ //si ya existe...
alta = 10;
} else { //si no existe...
// Realizamos el alta
sql = "SELECT codigo_dpto FROM departamento WHERE nombre_dpto = '"+campos[3]+"'";
resultado = envio.executeQuery(sql);
while(resultado.next()){
cod_dep = resultado.getString(1);
37
}
sql = "INSERT INTO empleado (codigo_empleado, nombre_empleado, cargo_empleado, codigo_dpto)
VALUES ('"+campos[0]+"', '"+campos[1]+"', '"+campos[2]+"', '"+cod_dep+"')";
System.err.println(sql);
alta = envio.executeUpdate(sql);
}
flujoSalidaFormato.writeInt(alta);
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 5: //Consulta a departamento para mostrar
//los datos de un alta
String cod_depto = "";
String cod = flujoEntradaDatos.readUTF();
sql = "SELECT codigo_dpto FROM departamento WHERE nombre_dpto = '"+cod+"'";
System.err.println(sql);
resultado = envio.executeQuery(sql);
while(resultado.next()){
cod_depto = resultado.getString(1);
}
sql = "SELECT * FROM departamento WHERE codigo_dpto = '"+cod_depto+"'";
resultado = envio.executeQuery(sql);
while(resultado.next()){
flujoSalidaFormato.writeUTF(resultado.getString(1));
flujoSalidaFormato.writeUTF(resultado.getString(2));
flujoSalidaFormato.writeUTF(resultado.getString(3));
}
38
flujoSalidaFormato.writeInt(1);
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 6: //RESULTADO CONSULTA FINAL
String emp = flujoEntradaDatos.readUTF();
String departamento = "";
int p = 0;
sql = "SELECT * FROM empleado WHERE nombre_empleado = '"+emp+"'";
resultado = envio.executeQuery(sql);
System.err.println(sql);
while(resultado.next()){
p++;
flujoSalidaFormato.writeUTF(resultado.getString(1));
flujoSalidaFormato.writeUTF(resultado.getString(2));
flujoSalidaFormato.writeUTF(resultado.getString(3));
departamento = resultado.getString(4);
flujoSalidaFormato.writeUTF(departamento);
}
if(p!=0){
sql = "SELECT nombre_dpto, planta_dpto FROM departamento WHERE codigo_dpto =
'"+departamento+"'";
resultado = envio.executeQuery(sql);
System.err.println(sql);
while(resultado.next()){
flujoSalidaFormato.writeUTF(resultado.getString(1));
flujoSalidaFormato.writeUTF(resultado.getString(2));
39
}
}
flujoSalidaFormato.writeInt(p);
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 7: //MATAR EL HILO
System.err.println("Un cliente menos");
this.stop();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
}//fin del switch
} catch (SQLException e) {
System.err.println("Error de SQL..." + e);
} catch (EOFException e) {
System.err.println("Error de fin de fichero..." + e);
} catch (Exception e) {
System.err.println("Error al recibir o enviar datos en el hilo..."+e);
}
}
}
}
Inicio.html
<html>
<head>
<title></title>
40
</head>
<body>
<center><h1></h1></center>
<applet code=Inicio.class width=0 height=0>
Su Navegador no soporta applets en Java
</applet>
</body>
</html>
FUNCIONAMIENTO DE LA APLICACIÓN
La aplicación para la gestión de empleados es una aplicación a tres capas clinete − servidor − base de datos.
Para la base de datos he utilizado el servidor MySQL y la bse de datos queda reflejada al principio de este
documento en el modelo de datos.
El Cliente está desarrollado en un applet que abre un Frame, ahí es donde el usuario podrá interactuar con el
sistema.
Al estar integrado en un applet, el usuario posrá acceder vía web a la aplicación estando el applet en un
servidor web (Personal Web Server en este caso).
El applet es una clase llamada Inicio.class donde se crea un frame y se construyen todos los componentes de
la ventana. Tras construir los componentes, la clase Inicio.class se queda esperando una acción del usuario en
el método actionPerformed. Tras recibir dicha acción (pulsar algún botón) el applet, lo primero que hace es
intentar conectarse con el servidor en la dirección IP en la que se encuantra corriendo y en el puerto 1234 que
es el puerto por el que está escuchando peticiones de clientes. Si la conexión se realiza satisfactoriamente y se
crea bien el socket de comunicaciones entre el Cliente y el Servidor, se crean los flujos de entrada y salida
para los datos que intercambien el cliente y el servidor (DataOutputStream y DataInputStream). Cada posible
petición del usuario la procesa un método en el applet y utiliza los flujos de entrada y salida para comunicarse
con el servidor mediante un protocolo para que cada uno de ellos sepa que es lo que tiene que hacer en cada
acción del usuario.
El protocolo de comunicación entre el cliente y el servidor es el siguiente:
Del cliente al servidor:
• El cliente envía un 1 para solicitar que el servidor valide en la BD los datos de autenticación.
• El cliente envía un 2 al servidor para realizar una primera consulta realizada por el usuario en la cual
se cargará en otro formulario una lista con todos los nombre de empleados que cumplan los criterios
de búsqueda seleccionados para que el usuario elija uno de ellos y ver así el detalle de su ficha.
• El cliente envía un 3 para que el servidor pida a la BD los nombres de departamentos existentes y
cargarlos en el choice de applet cuando el cliente quiere dar un alta. De este modo, el cliente solo
podrá elegir entre los departamentos ya existentes a la hora de crear un nuevo empleado
• El cliente envía un 4 cuando el usuario quiere dar de alta un nuevo empleado una vez rellenados todos
41
sus campos.
• El cliente envía un 5 al servidor para que busque en la BD el registro correspondiente al departamento
asociado al nuevo empelado que ha dado de alta el usuario.
• El cliente envía un 6 cuando el usuario ha seleccionado un empleado concreto en la lista y quiere ver
el detalle de su condulta.
• El cliente envía un 7 al servidor cuando quiere cerrar la aplicación y de ese modo solicita la
desconexión con el servidor matando el hilo.
La clase Hilo.class generada por el servidor evalua en un while true (hasta que se desconecte el cliente)
mediante un switch el número que le mande el cliente para tratar de forma correcta su petición.
Del servidor al cliente:
• El Servidor envía un 1 al cliente cuando su solicitud ha sido procesada con éxito.
• El servidor envía un número distinto de 1 cuando se ha producido algún error en su solicitud.
De esta forma, el cliente siempre sabe si su petición al servidor ha sido o no satisfactoria.
Para informar al usuario de los posibles errores que se produzcan minetras ejecuta la aplicación, he creado una
clase llamada DialogoInformativo.class que hereda de Frame y su cometido es crear una ventana auxiliar a la
aplicación mostrando el texto que se le diga al crear un objeto de dicha clase en el constructor. El constructor
de dicha clase recibe tres parámetros, Titulo de la ventana, Texto de la ventana y Texto del botón de la
ventana. Esta clase se utiliza para advertir al usuario de posibles errores como que no debe dejar campos en
blanco, que los datos introducidos son incorrectos, que se ha perdido la conexión con el servidor, ....
La clse Servidor.class hereda de la clase Frame ya que abre una ventana para mostrar datos específicos acerca
de la conexión de los distintos clientes que accedan a él. Tras construir los componentes de la ventana, abre un
socket de comunicación en el puerto 1234 que es el puerto donde estará escuchando peticiones por parte de
los clientes. Luego realiza la conexión con la base de datos de MySQL (DriverManager.getConnection). Tras
realizar la conexión con la BD, ejecuta el método accept() de la clase Socket y se queda esperando la conexión
de posibles clientes. Por cada cliente que entra por el accept(), el Servidor abre un hilo para que procese todas
las peticiones del cliente, de esta forma la aplicación se convierte en mulhilo, es decir, puede atender a tantos
clientes como entren. La clase Servidor.class finaliza cuando se pulsa sobre el botón de la pantalla de dicha
clse Apagar Servidor.
Para abrir el hilo, me he creado una case Hilo.class la cual recibe tres parámetros en su constructor cuando la
invoca el Servidor. Estos parámetros son: El socket de comunicación con entre el cliente y el servidor ( para
que sea el hilo quien continue la comunicación con el cliente), La conexión con la base de datos ( para que sea
el hilo quien hable con la BD a la hora de hacer consultas, etc), y el tercer parámetro es un componente, es un
textArea de la clase Servidor.class donde el hilo escribirá información pertinente al cliente que se ha
conectado.
La clase Hilo.class hereda de la clase Thread, por lo que estamos obligados a sobreescribir su método run().
En el método run() nos creamos, al igal en la clase Inicio.class, los flujos de entrada y salida de datos a través
de los cuales se comunicarán el hilo y el applet (DataOutputStream y DataInputStream). Tras ello, nos
metemos en un bucle infinito while(true) que mantendrá una conexión permanente con el cliente hasta que
uno de los dos finalice la conexión. Dentro, nos creamos un Statement (envio =
conexionBD.createStatement();) que ejecutará las peticiones a la base de datos de MySQL, y tras ello,
recibimos mediante el flujo de entrada creado en el hilo, un entero que determinará el protocolo y por lo tanto
la acción a realizar solicitada por el cliente, protocolo = flujoEntradaDatos.readInt(); esa variable la
evaluamos en un switch y dependiendo de su valor ejecutamos una u ortra acción siguiendo el protocolo
42
descrito anteriormente en este documento (switch(protocolo)).
FUENTES
Inicio.java
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class Inicio extends Applet implements ActionListener{
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−VARIABLES
GLOBALES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Frame ventana;
Panel panelSur, panelMedio, panelNorte, panelCentro;
Button botonAceptar, botonSalir, botonBuscar, botonBuscarEmpleado, botonNuevoEmpleado, botonAlta,
botonVerDatos;
Panel panelA, panelAs, panelC, panelS, panelS2, panelBsur, panelBusqueda, panelNuevo, panelResultado,
panelLista, panelLsur;
CardLayout cambioPanelCentro = new CardLayout();
CardLayout cambioPanelSur = new CardLayout();
Label etiquetaLogin, etiquetaPass, etiquetaTitulo, etiquetaCodigo, etiquetaNombre, etiquetaCargo,
etiquetaPlanta, etiquetaDepartamento, etiquetaCDepartamento, etiquetaLista, etiquetaTodos;
TextField textoLogin, textoPass, textoCodigo, textoNombre, textoCargo, textoPlanta, textoDepartamento,
textoCDepartamento;
MenuBar barraMenu;
Menu menuGestion, menuSalir;
MenuItem opcionAlta, opcionConsulta, opcionSalir;
Socket conexion = null;
DataInputStream flujoEntradaFormato = null;
DataOutputStream flujoSalidaDatos = null;
43
Choice cajaCDepartamento;
List listaEmpleados;
int resultado;
String[] choice;
String[] datos;
boolean conectado = false;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE VARIABLES
GLOBALES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// CREAMOS UN OBJETO FRAME
public void init() {
ventana = new Frame("Aplicacion Gestion de Empleados");
this.metodoInicio();
}
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−CONSTRUIMOS LA
VENTANA−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
public void metodoInicio() {
this.construirVentana();
}
public void construirVentana() {
panelNorte = new Panel();
panelCentro = new Panel();
panelMedio = new Panel();
panelSur = new Panel();
this.crearComponentes();
this.construirPanelNorte();
this.construirPanelMedio();
this.construirPanelSur();
44
this.construirMenu();
cambioPanelCentro.show( panelMedio, "id" );
cambioPanelSur.show( panelSur, "log" );
ventana.setLayout( new BorderLayout() );
ventana.add(panelNorte, "North");
ventana.add(panelMedio, "Center");
ventana.add(panelSur, "South");
ventana.setMenuBar(barraMenu);
ventana.setSize(600,400);
ventana.setVisible(true);
ventana.setResizable(false);
}
public void construirMenu() {
barraMenu = new MenuBar();
menuGestion = new Menu("Gestión");
menuSalir = new Menu("Salir");
opcionAlta = new MenuItem("Nuevo Empleado");
opcionConsulta = new MenuItem("Buscar Empleado");
opcionSalir = new MenuItem("Salir");
menuGestion.add(opcionAlta);
menuGestion.add(opcionConsulta);
menuSalir.add(opcionSalir);
barraMenu.add(menuGestion);
barraMenu.add(menuSalir);
opcionAlta.setEnabled(false);
opcionConsulta.setEnabled(false);
45
opcionAlta.addActionListener( this);
opcionConsulta.addActionListener( this);
opcionSalir.addActionListener( this);
}
public void construirPanelNorte() {
etiquetaTitulo = new Label("GESTION DE EMPLEADOS");
etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) );
etiquetaTitulo.setAlignment (Label.CENTER);
panelNorte.setLayout( new FlowLayout() );
panelNorte.add( etiquetaTitulo );
}
public void construirPanelMedio() {
Label etiquetaArroba = new Label("@");
etiquetaArroba.setFont ( new Font ("Verdana", Font.BOLD, 72) );
etiquetaArroba.setAlignment (Label.CENTER);
panelC = new Panel();
botonSalir = new Button("Salir");
panelC.setLayout(new FlowLayout() );
panelC.add( botonSalir );
panelMedio.setLayout( cambioPanelCentro );
panelCentro.setLayout( new BorderLayout() );
panelCentro.setBackground(Color.yellow);
panelCentro.add( etiquetaArroba, "Center");
panelCentro.add( panelC, "South" );
panelMedio.add( panelCentro, "id" );
botonSalir.addActionListener( this);
46
}
public void construirPanelSur() {
panelSur.setLayout( cambioPanelSur );
panelS = new Panel();
panelS.setLayout( new FlowLayout() );
etiquetaLogin = new Label("Login:");
etiquetaPass = new Label("Password:");
textoLogin = new TextField();
textoPass = new TextField();
textoLogin.setColumns(15);
textoPass.setColumns(15);
botonAceptar = new Button("Aceptar");
panelS.add(etiquetaLogin);
panelS.add(textoLogin);
panelS.add(etiquetaPass);
panelS.add(textoPass);
panelS.add(botonAceptar);
panelSur.add( panelS, "log" );
botonAceptar.addActionListener( this);
}
public void construirPanelBusqueda() {
panelBusqueda = new Panel();
panelBusqueda.setLayout( new BorderLayout() );
panelBsur = new Panel();
botonBuscar = new Button("Buscar");
panelBsur.setLayout(new FlowLayout() );
47
panelBsur.add( botonBuscar );
Panel panelB = new Panel();
panelB.setLayout( new GridLayout(3,1) );
Panel panelB1 = new Panel();
panelB1.setLayout( new FlowLayout());
Panel panelB2 = new Panel();
panelB2.setLayout( new FlowLayout());
Panel panelBaux = new Panel();
panelBaux.setLayout( new FlowLayout());
panelBaux.add( etiquetaTodos );
panelB1.add( etiquetaCodigo );
panelB1.add( textoCodigo );
panelB2.add( etiquetaNombre );
panelB2.add( textoNombre );
panelB.add( panelBaux );
panelB.add( panelB1 );
panelB.add( panelB2 );
panelBusqueda.add( panelB, "Center" );
panelBusqueda.add( panelBsur, "South" );
panelMedio.add( panelBusqueda, "buscar" );
cambioPanelCentro.show( panelMedio, "buscar" );
etiquetaTitulo.setText("BÚSQUEDA DE EMPLEADOS");
etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) );
etiquetaTitulo.setAlignment (Label.CENTER);
botonBuscar.addActionListener( this);
}
48
public void construirPanelAlta() {
panelA = new Panel();
panelA.setLayout( new BorderLayout() );
Panel panelAsur;
panelAsur = new Panel();
panelAsur.setLayout(new FlowLayout() );
botonAlta = new Button("Dar de Alta");
panelAsur.add( botonAlta );
Panel panelA2 = new Panel();
panelA2.setLayout( new GridLayout(5,1) );
Panel panelA3 = new Panel();
panelA3.setLayout( new FlowLayout());
Panel panelA4 = new Panel();
panelA4.setLayout( new FlowLayout());
Panel panelA5 = new Panel();
panelA5.setLayout( new FlowLayout());
Panel panelA6 = new Panel();
panelA6.setLayout( new FlowLayout());
Panel panelA8 = new Panel();
panelA8.setLayout( new FlowLayout());
Panel panelAaux = new Panel();
panelAaux.setLayout( new FlowLayout());
panelA3.add( etiquetaCodigo );
panelA3.add( textoCodigo );
panelA4.add( etiquetaNombre );
panelA4.add( textoNombre );
49
panelA5.add( etiquetaCargo );
panelA5.add( textoCargo );
panelA8.add( etiquetaCDepartamento );
panelA8.add( cajaCDepartamento );
panelA2.add( panelAaux );
panelA2.add( panelA3 );
panelA2.add( panelA4 );
panelA2.add( panelA5 );
panelA2.add( panelA8 );
panelA.add( panelA2, "Center" );
panelA.add( panelAsur, "South" );
panelMedio.add( panelA, "alta" );
cambioPanelCentro.show( panelMedio, "alta" );
etiquetaTitulo.setText("ALTA DE EMPLEADOS");
etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) );
etiquetaTitulo.setAlignment (Label.CENTER);
botonAlta.addActionListener( this);
}
public void construirPanelDatos() {
panelA = new Panel();
panelA.setLayout( new BorderLayout() );
Panel panelAsur;
panelAsur = new Panel();
panelAsur.setLayout(new FlowLayout() );
Panel panelA2 = new Panel();
panelA2.setLayout( new GridLayout(7,1) );
50
Panel panelA3 = new Panel();
panelA3.setLayout( new FlowLayout());
Panel panelA4 = new Panel();
panelA4.setLayout( new FlowLayout());
Panel panelA5 = new Panel();
panelA5.setLayout( new FlowLayout());
Panel panelA6 = new Panel();
panelA6.setLayout( new FlowLayout());
Panel panelA7 = new Panel();
panelA7.setLayout( new FlowLayout());
Panel panelA8 = new Panel();
panelA8.setLayout( new FlowLayout());
Panel panelAaux = new Panel();
panelAaux.setLayout( new FlowLayout());
panelA3.add( etiquetaCodigo );
panelA3.add( textoCodigo );
panelA4.add( etiquetaNombre );
panelA4.add( textoNombre );
panelA5.add( etiquetaCargo );
panelA5.add( textoCargo );
panelA6.add( etiquetaPlanta );
panelA6.add( textoPlanta );
panelA7.add( etiquetaDepartamento );
panelA7.add( textoDepartamento );
panelA8.add( etiquetaCDepartamento );
panelA8.add( textoCDepartamento );
51
panelA2.add( panelAaux );
panelA2.add( panelA3 );
panelA2.add( panelA4 );
panelA2.add( panelA5 );
panelA2.add( panelA6 );
panelA2.add( panelA7 );
panelA2.add( panelA8 );
panelA.add( panelA2, "Center" );
panelA.add( panelAsur, "South" );
panelMedio.add( panelA, "alta" );
cambioPanelCentro.show( panelMedio, "alta" );
etiquetaTitulo.setText("RESULTADO");
etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) );
etiquetaTitulo.setAlignment (Label.CENTER);
}
public void construirPanelLista() {
panelLista = new Panel();
panelLista.setLayout( new BorderLayout() );
panelLsur = new Panel();
botonVerDatos = new Button("Ver Datos");
panelLsur.setLayout(new FlowLayout() );
panelLsur.add( botonVerDatos );
Panel panelL = new Panel();
panelL.setLayout( new GridLayout(2,1) );
Panel panelL1 = new Panel();
panelL1.setLayout( new FlowLayout());
52
Panel panelLaux = new Panel();
panelLaux.setLayout( new FlowLayout());
etiquetaLista = new Label("Seleccione un elemento de la lista");
panelL1.add( etiquetaLista );
panelL1.add( listaEmpleados );
panelL.add( panelLaux );
panelL.add( panelL1 );
panelLista.add( panelL, "Center" );
panelLista.add( panelLsur, "South" );
panelMedio.add( panelLista, "listar" );
cambioPanelCentro.show( panelMedio, "listar" );
etiquetaTitulo.setText("RESULTADO CONSULTA");
etiquetaTitulo.setFont ( new Font ("TimesRoman", Font.BOLD, 16) );
etiquetaTitulo.setAlignment (Label.CENTER);
botonVerDatos.addActionListener(this);
listaEmpleados.addActionListener(this);
}
public void construirMenuInferior() {
panelS2 = new Panel();
panelS2.setLayout( new FlowLayout() );
botonBuscarEmpleado = new Button("Buscar Empleado");
botonNuevoEmpleado = new Button("Nuevo Empleado");
panelS2.add(botonBuscarEmpleado);
panelS2.add(botonNuevoEmpleado);
panelS2.add(botonSalir);
panelSur.add( panelS2, "normal" );
53
cambioPanelSur.show( panelSur, "normal" );
botonBuscarEmpleado.addActionListener( this );
botonNuevoEmpleado.addActionListener( this );
this.EvaluarBotones("resultado");
}
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE CONSTRUIR LA
VENTANA−−−−−−−−−−−−−−−−−−−−−−−−−−
//−−−−−−−−−−−−−−−−−−−−−−−−EVALUAMOS LOS BOTONES PARA HABILITARLOS O
DESHABILITARLOS−−−−−−−−−−−−−
public void EvaluarBotones(String tipo) {
if(tipo.equals("busqueda")){
textoCodigo.setEditable(true);
textoNombre.setEditable(true);
textoCargo.setEditable(true);
textoPlanta.setEditable(true);
textoDepartamento.setEditable(true);
textoCDepartamento.setEditable(true);
botonBuscarEmpleado.setEnabled(false);
botonNuevoEmpleado.setEnabled(true);
opcionAlta.setEnabled(true);
opcionConsulta.setEnabled(false);
}else if(tipo.equals("alta")){
textoCodigo.setEditable(true);
textoNombre.setEditable(true);
textoCargo.setEditable(true);
textoPlanta.setEditable(true);
textoDepartamento.setEditable(true);
54
textoCDepartamento.setEditable(true);
botonNuevoEmpleado.setEnabled(false);
botonBuscarEmpleado.setEnabled(true);
opcionAlta.setEnabled(false);
opcionConsulta.setEnabled(true);
}else if(tipo.equals("resultado")){
textoCodigo.setEditable(false);
textoNombre.setEditable(false);
textoCargo.setEditable(false);
textoPlanta.setEditable(false);
textoDepartamento.setEditable(false);
textoCDepartamento.setEditable(false);
botonNuevoEmpleado.setEnabled(true);
botonBuscarEmpleado.setEnabled(true);
opcionAlta.setEnabled(true);
opcionConsulta.setEnabled(true);
}
}
//−−−−−−−−−−−−−−−−−FIN DE EVALUAMOS LOS BOTONES PARA HABILITARLOS O
DESHABILITARLOS−−−−−−−−−−−−−
//−−−−−−−−−−−−−−−−−−−−−−−CREAMOS (SOLO 1 VEZ) LOS COMPONENTES DE LA
VENTANA−−−−−−−−−−−−−−−−−−−−
public void crearComponentes(){
// CODIGO
etiquetaCodigo = new Label("Código");
textoCodigo = new TextField();
textoCodigo.setColumns(10);
55
// NOMBRE
etiquetaNombre = new Label("Nombre");
textoNombre = new TextField();
textoNombre.setColumns(35);
// CARGO
etiquetaCargo = new Label("Cargo");
textoCargo = new TextField();
textoCargo.setColumns(35);
// CODIGO DEPARTAMENTO
etiquetaCDepartamento = new Label("Código de Departamento");
textoCDepartamento = new TextField();
textoCDepartamento.setColumns(5);
// DEPARTAMENTO
etiquetaDepartamento = new Label("Departamento");
textoDepartamento = new TextField();
textoDepartamento.setColumns(35);
// PLANTA
etiquetaPlanta = new Label("Planta");
textoPlanta = new TextField();
textoPlanta.setColumns(5);
// ETIQUETA TODOS
etiquetaTodos = new Label("Para seleccionar todos los empleados, deje los campos en blanco");
}
//−−−−−−−−−−−−−−−−−−−FIN DE CREAMOS (SOLO 1 VEZ) LOS COMPONENTES DE LA
VENTANA−−−−−−−−−−−−−−−−−−−−
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−ESCUCHAMOS LOS EVENTOS DE LOS
BOTONES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
56
public void actionPerformed( ActionEvent event ) {
String etiqueta = event.getActionCommand();
if ( etiqueta.equals("Aceptar") ) this.Conectar();
if ( etiqueta.equals("Salir") ) this.Salir();
if ( etiqueta.equals("Nuevo Empleado") ) this.Alta();
if ( etiqueta.equals("Buscar Empleado") ) this.Buscar();
if ( etiqueta.equals("Buscar") ) this.DatosBuscar();
if ( etiqueta.equals("Dar de Alta") ) this.DatosAlta();
if ( etiqueta.equals("Ver Datos") ) this.MostrarEmpleado();
}
//−−−−−−−−−−−−−−−−−−−−−−−−FIN DE ESCUCHAMOS LOS EVENTOS DE LOS
BOTONES−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
//−−−−−−−−−−−−CONECTAMOS CON EL SERVIDOR EN LA DIRECCION "127.0.0.1" Y EN EL
PUERTO "1234"−−−−−−−−−−−−−−
public void realizarConexion() {
String ipDestino = "127.0.0.1";
int puerto = 1234;
InetAddress direccion = null;
try {
//InetAdress especifica el servidor al que nos queremos conectar
direccion = InetAddress.getByName(ipDestino);
} catch (UnknownHostException uhe) {
System.err.println("Host no encontrado..." + uhe);
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Servidor no Encontrado", "Intentelo de nuevo más tarde",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
57
dErrorUsuario.setVisible(true);
}
try {
conexion = new Socket(direccion, puerto);
//Creamos los flujos
OutputStream flujoDatos = conexion.getOutputStream();
InputStream flujoEntrada = conexion.getInputStream();
//Recubrimos los flujos
flujoSalidaDatos = new DataOutputStream(flujoDatos);
flujoEntradaFormato = new DataInputStream(flujoEntrada);
// Estamos conectados
conectado = true;
} catch (IOException io) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error de comunicaciones", "Servidor fuera de servicio",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al establecer la comunicación", "Vuelva a intentarlo
más tarde", "Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}
58
}
//−−−−−−−−−FIN DE CONECTAMOS CON EL SERVIDOR EN LA DIRECCION "127.0.0.1" Y EN EL
PUERTO "1234"−−−−−−−−−−−−−−
//−−−−−−−−−−−−−−−−−−−−−−−−−TRATAMOS LOS BOTONES QUE PULSA EL
USUARIO−−−−−−−−−−−−−−−−−−−−−−−−−−−−
public void Conectar() {
if(conectado==false){
this.realizarConexion();
}
if(conectado==true){
this.autenticarse();
if ( resultado == 1 ){
this.construirMenuInferior();
} else {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error de Autenticacion", "Revise los datos", "Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}
}
}
public void Alta() {
this.crearComponentes();
this.cargarChoice();
this.construirPanelAlta();
this.EvaluarBotones("alta");
59
}
public void Buscar() {
this.crearComponentes();
this.construirPanelBusqueda();
this.EvaluarBotones("busqueda");
}
public void DatosAlta() {
this.enviarAlta();
if ( resultado==1 ){
this.enviarResultadoAlta();
this.construirPanelDatos();
this.EvaluarBotones("resultado");
} else if( resultado==0 ){
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "No puede dejar campos en blanco",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
} else if( resultado==10 ){
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "Ya existe un empleado con ese
código", "Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
} else if( resultado==20 ){
60
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error en el alta", "El código debe ser de 5 caracteres",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}
}
public void DatosBuscar() {
this.enviarConsulta();
if(resultado!=0){
this.construirPanelLista();
this.EvaluarBotones("resultado");
}else{
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Su consulta no obtuvo resultado",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}
}
public void MostrarEmpleado() {
this.enviarEmpleadoConsulta();
if(resultado==1){
this.construirPanelDatos();
this.EvaluarBotones("resultado");
61
}else if(resultado==10){
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Debe seleccionar un empelado",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}else if(resultado==0){
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Consulta Finalizada", "Su consulta no obtuvo resultado",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
}
}
public void cargarChoice() {
try {
flujoSalidaDatos.writeInt(3);
resultado = flujoEntradaFormato.readInt();
choice = new String[resultado];
if(resultado!=0){
for(int i = 0; i<resultado; i++){
choice[i] = flujoEntradaFormato.readUTF();
}
cajaCDepartamento = new Choice();
for(int a = 0; a<resultado; a++){
62
cajaCDepartamento.add(choice[a]);
}
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void autenticarse() {
try {
datos = new String[2];
datos[0] = textoLogin.getText();
datos[1] = textoPass.getText();
for(int i=0; i<datos.length; i++){
if(datos[i].equals("")){
resultado = 0;
} else {
if(i==0){
flujoSalidaDatos.writeInt(1);
}
flujoSalidaDatos.writeUTF(datos[i]);
if(i==1){
63
resultado = flujoEntradaFormato.readInt();
}
}
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void enviarConsulta() {
try {
flujoSalidaDatos.writeInt(2);
flujoSalidaDatos.writeUTF(textoNombre.getText());
flujoSalidaDatos.writeUTF(textoCodigo.getText());
resultado = flujoEntradaFormato.readInt();
datos = new String[resultado];
if(resultado!=0){
for(int i = 0; i<resultado; i++){
datos[i] = flujoEntradaFormato.readUTF();
}
listaEmpleados = new List(5);
for(int a = 0; a<resultado; a++){
64
listaEmpleados.add(datos[a]);
}
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void enviarAlta() {
try {
if(textoCodigo.getText().equals("") || textoNombre.getText().equals("") || textoCargo.getText().equals("")){
resultado = 0;
} else {
if(textoCodigo.getText().length() != 5){
resultado = 20;
} else {
flujoSalidaDatos.writeInt(4);
flujoSalidaDatos.writeUTF(textoCodigo.getText());
flujoSalidaDatos.writeUTF(textoNombre.getText());
flujoSalidaDatos.writeUTF(textoCargo.getText());
flujoSalidaDatos.writeUTF(cajaCDepartamento.getSelectedItem());
resultado = flujoEntradaFormato.readInt();
65
}
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void enviarEmpleadoConsulta() {
try {
flujoSalidaDatos.writeInt(6);
if(listaEmpleados.getSelectedIndex()==−1){
resultado = 10;
} else {
flujoSalidaDatos.writeUTF(listaEmpleados.getSelectedItem());
datos = new String[6];
for(int i=0; i<datos.length; i++){
datos[i] = flujoEntradaFormato.readUTF();
}
resultado = flujoEntradaFormato.readInt();
if(resultado!=0){
textoCodigo.setText(datos[0]);
textoNombre.setText(datos[1]);
66
textoCargo.setText(datos[2]);
textoCDepartamento.setText(datos[3]);
textoDepartamento.setText(datos[4]);
textoPlanta.setText(datos[5]);
}
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void enviarResultadoAlta() {
try {
flujoSalidaDatos.writeInt(5);
flujoSalidaDatos.writeUTF(cajaCDepartamento.getSelectedItem());
datos = new String[3];
for(int i=0; i<datos.length; i++){
datos[i] = flujoEntradaFormato.readUTF();
}
resultado = flujoEntradaFormato.readInt();
if(resultado==1){
textoCDepartamento.setText(datos[0]);
67
textoDepartamento.setText(datos[1]);
textoPlanta.setText(datos[2]);
textoCodigo.setText(textoCodigo.getText());
textoNombre.setText(textoNombre.getText());
textoCargo.setText(textoCargo.getText());
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
public void Salir(){
try {
if(conectado==false){
ventana.dispose();
}else{
flujoSalidaDatos.writeInt(7);
ventana.dispose();
}
} catch (Exception e) {
DialogoInformativo dErrorUsuario;
dErrorUsuario = new DialogoInformativo(ventana, "Error al conectar con el servidor", "Vuelva a conectarse",
68
"Aceptar");
dErrorUsuario.setModal( true );
dErrorUsuario.setSize(200,150);
dErrorUsuario.setVisible(true);
ventana.dispose();
}
}
//−−−−−−−−−−−−−−−−−−−−−FIN DE TRATAMOS LOS BOTONES QUE PULSA EL
USUARIO−−−−−−−−−−−−−−−−−−−−−−−−−−−−
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−FIN DE LA APLICACION
CLIENTE−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
}
DialogoInformativo.java
import java.awt.*;
import java.awt.event.*;
public class DialogoInformativo extends Dialog implements ActionListener {
String mensaje, etiqueta;
public DialogoInformativo(Frame ventana, String titulo, String mensaje, String etiqueta) {
super(ventana, titulo);
this.mensaje = mensaje;
this.etiqueta = etiqueta;
this.construirDialogo();
}
public void construirDialogo() {
Label etiquetaMensaje = new Label(mensaje);
Panel panelEtiqueta = new Panel();
panelEtiqueta.setLayout( new FlowLayout() );
69
panelEtiqueta.add( etiquetaMensaje);
Button boton = new Button(etiqueta);
boton.addActionListener( this );
Panel panelBoton = new Panel();
panelBoton.setLayout( new FlowLayout() );
panelBoton.add( boton);
this.setLayout( new GridLayout(2,1) );
this.add( panelEtiqueta );
this.add( panelBoton );
}
public void actionPerformed(ActionEvent event ) {
this.dispose();
}
}
Servidor.java
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.sql.*;
import java.lang.*;
public class Servidor extends Frame implements ActionListener {
//Variables Globales
Label etiquetaIP, etiquetaNClientes, etiquetaEstado, etiquetaContenido;
TextField textoIP, textoNClientes, textoEstado;
TextArea txaContenido;
70
Button botonApagar;
public Servidor() {
super("Servidor de Gestion de Empleados");
}
public static void main(String args[] ) {
Servidor obj = new Servidor();
obj.inicio();
}
public void inicio() {
etiquetaIP = new Label("Dirección IP local...");
textoIP = new TextField(30);
textoIP.setEnabled(false);
etiquetaNClientes = new Label("Nº de clientes autenticados...");
textoNClientes = new TextField(10);
textoNClientes.setEnabled(false);
etiquetaEstado = new Label("Estado de la comunicación...");
textoEstado = new TextField(20);
textoEstado.setEnabled(false);
etiquetaContenido = new Label("Datos recibidos del cliente...");
txaContenido = new TextArea(4,15);
txaContenido.setEnabled(false);
botonApagar = new Button("Apagar Servidor");
botonApagar.addActionListener(this);
this.setLayout( new GridLayout(6,2) );
this.add(etiquetaIP);
this.add(textoIP);
71
this.add(etiquetaNClientes);
this.add(textoNClientes);
this.add(etiquetaEstado);
this.add(textoEstado);
this.add(etiquetaContenido);
this.add(txaContenido);
this.add(botonApagar);
this.pack();
this.setSize(400,400);
this.setVisible(true);
//Buscar y visualizar la dirección IP local donde se ejecuta este programa
try {
InetAddress servidor = InetAddress.getLocalHost();
String cadenaDireccion = servidor.toString();
textoIP.setText(cadenaDireccion);
} catch (UnknownHostException uhe ) {
System.err.println("No se ha podido saber la dirección local: " + uhe );
}
//Abrimos el socket en el puerto 1234
ServerSocket conector = null;
try {
conector = new ServerSocket(1234);
} catch (IOException io) {
System.err.println("Se ha producido un error al abrir el Socket: " + io );
}
//Conexion a la base de datos
72
Connection conexionBD=null;
try {
Class.forName("org.gjt.mm.mysql.Driver");
conexionBD = DriverManager.getConnection("jdbc:mysql://localhost/empleados?user=&password=");
} catch (ClassNotFoundException e){
System.err.println("Clase no encontrada" + e);
} catch (SQLException e) {
System.err.println("Base de datos no encontrada" + e);
}
//Hilo
int numeroClientes = 0;
while(true) {
try {
textoEstado.setText("Esperando conexión con algún cliente...");
Socket conexion = conector.accept();
textoEstado.setText("La conexión se ha establecido con el cliente...");
numeroClientes ++;
textoNClientes.setText("" + numeroClientes);
//Creamos el hilo para un cliente
Hilo h = new Hilo(conexion, conexionBD, txaContenido);
h.start();
} catch (Exception e) {
System.err.println("Se ha producido un error...");
}
}
}
73
public void actionPerformed (ActionEvent event) {
String cadena = event.getActionCommand();
if(cadena.equals("Apagar Servidor")) System.exit(0);
}
}
Hilo.java
import java.awt.*;
import java.net.*;
import java.io.*;
import java.sql.*;
import java.lang.*;
public class Hilo extends Thread {
Socket conexion;
TextArea txaContenido;
Connection conexionBD;
Statement envio = null;
int protocolo = 0;
int salida = 0;
int i = 0;
DataInputStream flujoEntradaDatos = null;
DataOutputStream flujoSalidaFormato = null;
String sql = "";
ResultSet resultado = null;
ResultSet resultado_aux = null;
boolean salir = true;
public Hilo ( Socket conexion, Connection conexionBD, TextArea txaContenido) {
74
super();
this.conexion = conexion;
this.txaContenido = txaContenido;
this.conexionBD = conexionBD;
}
public void run() {
try {
//Creamos un flujo de entrada asociado al socket entre el cliente y el servidor
InputStream flujoDatos = conexion.getInputStream();
// Creamos el envoltorio para el flujo
flujoEntradaDatos = new DataInputStream( flujoDatos );
//Creamos un flujo de salida asociado al socket entre el cliente y el servidor
OutputStream flujoSalida = conexion.getOutputStream();
// Creamos el envoltorio para el flujo
flujoSalidaFormato = new DataOutputStream( flujoSalida );
} catch (Exception e) {
System.err.println("Se ha producido un error" + e);
}
while (true) {
try {
envio = conexionBD.createStatement();
//Se lee el primer dato recibido para saber
//lo que quiere hacer el cliente
protocolo = flujoEntradaDatos.readInt();
switch(protocolo){
case 1: // AUTENTICARSE
75
//Leemos los dos parámetros que nos envía el cliente
String login = flujoEntradaDatos.readUTF();
String password = flujoEntradaDatos.readUTF();
//Visualizamos lo que hemos recibido
txaContenido.append("Login: " + login + "Pass: " + password+ "\n");
//Validamos en la BD
sql = "SELECT * FROM usuarios WHERE login = '"+login+"' AND pass = '"+password+"'";
resultado = envio.executeQuery(sql);
System.err.println(sql);
//Si todo va bien, devolvemos un 1,
//en caso contrario un 0
if (resultado.next()) {
salida = 1;
} else {
salida = 0;
}
//Enviamos el resultado
flujoSalidaFormato.writeInt(salida);
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 2: // CONSULTA 1 DATOS A LISTA
String nombre = flujoEntradaDatos.readUTF();
String codigo = flujoEntradaDatos.readUTF();
//Validamos en la BD
sql = "SELECT nombre_empleado FROM empleado WHERE codigo_empleado like '%"+codigo+"%' AND
nombre_empleado like '%"+nombre+"%'";
76
resultado = envio.executeQuery(sql);
System.err.println(sql);
i = 0;
while(resultado.next()){
i++;
}
resultado = envio.executeQuery(sql);
//Enviamos el resultado, el int es el numero de registros
flujoSalidaFormato.writeInt(i);
while(resultado.next()){
flujoSalidaFormato.writeUTF(resultado.getString(1));
}
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 3: // CARGAR CHOICE
//Validamos en la BD
sql = "SELECT nombre_dpto FROM departamento";
resultado = envio.executeQuery(sql);
i = 0;
while(resultado.next()){
i++;
}
resultado = envio.executeQuery(sql);
//Enviamos el resultado un uno si no hay error
flujoSalidaFormato.writeInt(i);
77
while(resultado.next()){
flujoSalidaFormato.writeUTF(resultado.getString(1));
}
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 4: //INSERTAR UN NUEVO EMPLEADO
int alta;
String cod_dep = "";
String[] campos = new String[4];
for(int c=0; c<campos.length; c++){
campos[c] = flujoEntradaDatos.readUTF();
}
//Preguntamos si ya existe un empleado
//con ese codigo
sql = "SELECT * from empleado WHERE codigo_empleado = '"+campos[0]+"'";
resultado = envio.executeQuery(sql);
if(resultado.next()){ //si ya existe...
alta = 10;
} else { //si no existe...
// Realizamos el alta
sql = "SELECT codigo_dpto FROM departamento WHERE nombre_dpto = '"+campos[3]+"'";
resultado = envio.executeQuery(sql);
while(resultado.next()){
cod_dep = resultado.getString(1);
}
78
sql = "INSERT INTO empleado (codigo_empleado, nombre_empleado, cargo_empleado, codigo_dpto)
VALUES ('"+campos[0]+"', '"+campos[1]+"', '"+campos[2]+"', '"+cod_dep+"')";
System.err.println(sql);
alta = envio.executeUpdate(sql);
}
flujoSalidaFormato.writeInt(alta);
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 5: //Consulta a departamento para mostrar
//los datos de un alta
String cod_depto = "";
String cod = flujoEntradaDatos.readUTF();
sql = "SELECT codigo_dpto FROM departamento WHERE nombre_dpto = '"+cod+"'";
System.err.println(sql);
resultado = envio.executeQuery(sql);
while(resultado.next()){
cod_depto = resultado.getString(1);
}
sql = "SELECT * FROM departamento WHERE codigo_dpto = '"+cod_depto+"'";
resultado = envio.executeQuery(sql);
while(resultado.next()){
flujoSalidaFormato.writeUTF(resultado.getString(1));
flujoSalidaFormato.writeUTF(resultado.getString(2));
flujoSalidaFormato.writeUTF(resultado.getString(3));
}
flujoSalidaFormato.writeInt(1);
79
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 6: //RESULTADO CONSULTA FINAL
String emp = flujoEntradaDatos.readUTF();
String departamento = "";
int p = 0;
sql = "SELECT * FROM empleado WHERE nombre_empleado = '"+emp+"'";
resultado = envio.executeQuery(sql);
System.err.println(sql);
while(resultado.next()){
p++;
flujoSalidaFormato.writeUTF(resultado.getString(1));
flujoSalidaFormato.writeUTF(resultado.getString(2));
flujoSalidaFormato.writeUTF(resultado.getString(3));
departamento = resultado.getString(4);
flujoSalidaFormato.writeUTF(departamento);
}
if(p!=0){
sql = "SELECT nombre_dpto, planta_dpto FROM departamento WHERE codigo_dpto =
'"+departamento+"'";
resultado = envio.executeQuery(sql);
System.err.println(sql);
while(resultado.next()){
flujoSalidaFormato.writeUTF(resultado.getString(1));
flujoSalidaFormato.writeUTF(resultado.getString(2));
}
80
}
flujoSalidaFormato.writeInt(p);
envio.close();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
case 7: //MATAR EL HILO
System.err.println("Un cliente menos");
this.stop();
break;
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
}//fin del switch
} catch (SQLException e) {
System.err.println("Error de SQL..." + e);
} catch (EOFException e) {
System.err.println("Error de fin de fichero..." + e);
} catch (Exception e) {
System.err.println("Error al recibir o enviar datos en el hilo..."+e);
}
}
}
}
MANUAL DE USUARIO
La aplicación para la gestión de empleados es una potente herramienta diseñada para que cualquier usuario
sea capaz de utilizarla.
En primer lugar, el usuario deberá autenticarse en el sistema mediante login y password
81
Solo los usuarios registrados podrán utilizar la aplicación. De manera que si un usuario introduce datos
incorrectos el sistema no le permitirá conectarse con el servidor.
En el caso de el usuario se autentifique satisfactoriamente entrará en la pantalla principal donde podrá elegir
las acciones a realizar
82
En la pantalla principal, el usuario podrá realizar las distintas acciones pulsando tanto en los botones
habilitados para ello como utilizando el menu ubicado en la barra de menús. Dichas acciones son dar de alta
un nuevo empleado o consultar los datos de un empleado ya existente.
Si el usuario selecicona dar de alta un empleado le aparecerá el siguinete formulario
Para dar de alta a un nuevo empleado, el usuario debará introducir los datos del empleado y seleciconar uno
de entre los posibles departamentos que se le ofrezca en la opción de código de departamento. Para que el alta
se haga efectiva, no debe existir el código de empleado que seleccione el usuario y no se debe dejar ningún
campo en blanco. Tras rellenar el formulario se pulsará sobre el botón Dar de Alta para confirmar los datos,
apareciendo la siguiente pantalla.
83
Tras confirmar los datos, se le presentará al usuario la pantalla de la imagen anterior con todo el detalle del
empleado que han insertado en la base de datos.
Si el usuario selecicona la opción de buscar empleado, le aparecerá la siguiente pantalla para que introduzca
los criterios de su búsqueda
84
La búsqueda se puede hacer mediante el código del empleado, mediante el nombre del empleado o mediante
ambos. Si el usuario no sabe con exactitud el nombre o el código no importa, porque la aplicación buscará
todos los empleados cuyo nombre o cuyo código contengan los caracteres que introduzca el usuario en los
criterios de su búsqueda. Por ejemplo, si el usuario introduce en el campo nombre `ill' el resultado de su
búsqueda serán todos los empleados cuyo nombre contenga la cadena `ill'.
Para seleccionar todos los empleados disponibles, el usuario debará los dos campos en blanco y pulsar el
botón Buscar.
Tras pulsar el botón Buscar, se le mostrará al usuario una nueva pantalla con el siguiente formato:
La pantalla contendrá una lista con los nombres de todos los empleados que coincidan con los criterios de
búsqueda que ha introducido el usuario, pudiendose seleccionar uno de ellos para mostrar todo el detalle de
sus datos dentro de la empresa. Tras pulsar en el botón Ver Datos aparecerá la siguiente pantalla
85
En ella se muestran todos los datos del empleado seleccionado en la pantalla anterior.
El usuario podrá realizar todas estas operaciones las veces que crea oportuno, y para salir de ala aplicación tan
solo tendrá que pulsar el botón Salir en cualquiera de las pantallas o en el menú de la barra de menús.
Del lado del servidor, aparece la siguiente Interfaz gráfica con datos acerca del número de clientes conectados,
el login y password del último cliente conectado, ...
El servidor debe estar arrancado desde el principio para que el cliente pueda conectarse vía web. En el caso de
que se cayera el sevidor mientras hay conectados clientes, le aparecerá un mensaje de error al cliente
diciéndole que debe volver a conectarse porque se ha perdido la comunicación con el servidor.
El interfaz del servidor es el siguiente
86
Para apager el srvidor, el administrador del sistema solo debará pulsar en el botón Apagar Servidor.
Y este es el funcionamiento de la herramienta para la Gestión de Empleados.
MODELO DE DATOS
La base de datos empleados está formada por tres tablas: empleado, usuarios y departamentos.
• La tabla ususarios es independiente de las otras dos y se utiliza para verificar que un usuasrio está
registrado a la hora de conectarse al servidor y contiene dos campos: login(PK) y pass
87
• La tabla empelado contiene la información correspondiente a los empleados de la empresa y tiene
una relación n − 1 con la tabla departamentos. Sus campos son: codigo_empleado (PK),
nombre_empleado, cargo_empleado y codigo_dpto(SK).
88
• La tabla departamentos contiene la información correspondiente la ubicación de cada uno de los
departamentos de la empresa y tiene una relación 1 − n con la tabla empleado. Sus campos son:
codigo_dpto(PK), nombre_dpto y planta_dpto.
89
90
91
92
Inicio.html
<html>
<head>
<title></title>
</head>
<body>
<center><h1></h1></center>
<applet code=Inicio.class width=0 height=0>
Su Navegador no soporta applets en Java
</applet>
</body>
</html>
93
Descargar