Aplicación para la gestión de empleados

Informática. Protocolo de comunicación. Cliente. Fuentes. Base de datos. Servidor Java. Aplicaciones. Programación HTML (Hypertext Markup Language)

  • Enviado por: Mingao
  • Idioma: castellano
  • País: España España
  • 71 páginas
publicidad

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.

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;

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();

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);

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" );

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();

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);

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 );

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() );

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 );

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) );

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);

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);

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");

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--------------------

//----------------------------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");

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);

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();

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);

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){

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();

}

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);

}

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();

}

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());

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){

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();

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) {

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();

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;

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);

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 );

}

//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...");

}

}

}

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) {

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

//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+"%'";

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);

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);

}

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);

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));

}

}

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>

</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 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 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;

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();

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);

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);

}

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() );

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);

}

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 );

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) );

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 );

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());

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" );

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);

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);

// 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-------------------------------

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);

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);

}

}

//---------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");

}

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 ){

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");

}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++){

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){

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++){

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();

}

}

} 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]);

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]);

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", "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() );

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;

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);

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

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...");

}

}

}

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) {

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

//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+"%'";

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);

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);

}

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);

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));

}

}

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

Aplicación para la gestión de empleados

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

Aplicación para la gestión de empleados

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

Aplicación para la gestión de empleados

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.

Aplicación para la gestión de empleados

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

Aplicación para la gestión de empleados

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:

Aplicación para la gestión de empleados

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

Aplicación para la gestión de empleados

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

Aplicación para la gestión de empleados

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

Aplicación para la gestión de empleados

  • 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).

Aplicación para la gestión de empleados

  • 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.

Aplicación para la gestión de empleados

Aplicación para la gestión de empleados
Aplicación para la gestión de empleados

Aplicación para la gestión de empleados

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>