Documente Academic
Documente Profesional
Documente Cultură
El problema
Se solicita desarrollar un sistema de administración de usuarios con
un CRUD (Create, Read, Update, Delete) básico nos advierten que la
aplicación es un prototipo inicial el cual esta propenso a cambios, pues aún
no se tienen definidas las ventanas con las que se va a trabajar ni la
información requerida, por le momento se trabajará con una BD MySql,
pero posiblemente se tenga que migrar a otro sistema gestor.
La solución
Se aplica el MVC permitiendo independizar la lógica y la parte visual del
sistema usando para eso un controlador que administra los procesos
sirviendo como puente entre estos.
La Aplicación
El Sistema está desarrollado como un proyecto Eclipse, en la siguiente
imagen vemos que se crearon tres paquetes principales y de esta forma se
tiene independiente la parte de la vista, el modelo y el controlador, el
paquete modelo posee los paquetes conexión, DAO y VO ya que aunque
pertenecen al modelo y la lógica de negocio debe establecerse también su
independencia con respecto a las operaciones, es decir, las clases VO por
ejemplo no poseen métodos de operaciones asociadas a la lógica de
negocio, tan solo deben representar las tablas de la BD, entonces en el
paquete vo se agruparán todas las clases equivalente a entidades.
El proyecto tiene los directorios db y conector, estos directorios se crearon
solamente para agregar el script de creación de la BD y el mysql connector.
</1>
Ejemplo Modelo Vista Controlador
USE ` basecita`;
</2>
Ejemplo Modelo Vista Controlador
El Modelo
Como se mencionó, en el modelo tenemos la lógica de negocio, serán todas
las clases vinculadas con el CRUD a nivel interno, que en últimas es en lo
que gira nuestro sistema.
Clase Lógica
</3>
Ejemplo Modelo Vista Controlador
package modelo;
import javax.swing.JOptionPane;
import modelo.dao.PersonaDAO;
import modelo.vo.PersonaVO;
import controlador.Coordinador;
}else{
JOptionPane.showMessageDialog(null,"El documento de
la persona debe ser más de 3
digitos","Advertencia",JOptionPane.WARNING_MESSAGE);
}
}
}else{
JOptionPane.showMessageDialog(null,"El
documento de la persona debe ser mas de 3
digitos","Advertencia",JOptionPane.WARNING_MESSAGE);
consultaPersona=false;
}
}catch(NumberFormatException e){
JOptionPane.showMessageDialog(null,"Debe ingresar un
dato numerico","Error",JOptionPane.ERROR_MESSAGE);
consultaPersona=false;
}catch(Exception e){
JOptionPane.showMessageDialog(null,"Se ha presentado
un Error","Error",JOptionPane.ERROR_MESSAGE);
consultaPersona=false;
</4>
Ejemplo Modelo Vista Controlador
}
return null;
}
Clase Conexión
package modelo.conexion;
import java.sql.*;
public class Conexion {
static String bd = "basecita";
static String login = "root";
static String password = "";
static String url = "jdbc:mysql://localhost/"+bd;
</5>
Ejemplo Modelo Vista Controlador
if (conn!=null){
System.out.println("Conección a base de datos "+bd+" OK");
}
}
catch(SQLException e){
System.out.println(e);
}catch(ClassNotFoundException e){
System.out.println(e);
}catch(Exception e){
System.out.println(e);
}
}
/**Permite retornar la conexión*/
public Connection getConnection(){
return conn;
}
Clase PersonaVo
</6>
Ejemplo Modelo Vista Controlador
package modelo.vo;
public class PersonaVO {
private Integer idPersona;
private String nombrePersona;
private Integer edadPersona;
private String profesionPersona;
private Integer telefonoPersona;
Clase PersonaDao
</7>
Ejemplo Modelo Vista Controlador
package modelo.dao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import controlador.Coordinador;
import modelo.conexion.Conexion;
import modelo.vo.PersonaVO;
/**
* Clase que permite el acceso a la base de datos
*/
public class PersonaDAO {
public void registrarPersona(PersonaVO miPersona){
Conexion conex= new Conexion();
try {
Statement estatuto = conex.getConnection().createStatement();
estatuto.executeUpdate("INSERT INTO persona VALUES
('"+miPersona.getIdPersona()+"', '"+miPersona.getNombrePersona()+"',
'"+miPersona.getEdadPersona()+"', '"+miPersona.getProfesionPersona()+"',
'"+miPersona.getTelefonoPersona()+"')");
JOptionPane.showMessageDialog(null, "Se ha registrado
Exitosamente","Información",JOptionPane.INFORMATION_MESSAGE);
estatuto.close();
conex.desconectar();
} catch (SQLException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "No se Registró");
}
}
persona.setIdPersona(Integer.parseInt(res.getString("id")));
persona.setNombrePersona(res.getString("nombre"));
persona.setEdadPersona(Integer.parseInt(res.getString("edad")));
persona.setProfesionPersona(res.getString("profesion"));
</8>
Ejemplo Modelo Vista Controlador
persona.setTelefonoPersona(Integer.parseInt(res.getString("telefono"))
);
}
res.close();
conex.desconectar();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Error, no se conectó");
System.out.println(e);
}
if (existe) {
return persona;
}else
return null;
}
estatuto.setInt(1, miPersona.getIdPersona());
estatuto.setString(2, miPersona.getNombrePersona());
estatuto.setInt(3, miPersona.getEdadPersona());
estatuto.setString(4, miPersona.getProfesionPersona());
estatuto.setInt(5,miPersona.getTelefonoPersona());
estatuto.setInt(6, miPersona.getIdPersona());
estatuto.executeUpdate();
}catch(SQLException e){
System.out.println(e);
JOptionPane.showMessageDialog(null, "Error al
Modificar","Error",JOptionPane.ERROR_MESSAGE);
}
}
</9>
Ejemplo Modelo Vista Controlador
La Vista
Aquí se define la parte visual del sistema, en la vista estableceremos todas
las ventanas o interfaces gráficas de usuario, mediante las cuales
representamos todo el modelo permitiendo la interacción entre la aplicación
y el cliente.
Clase VentanaPrincipal
package vista;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import controlador.Coordinador;
/**
* Establece la información que se presentara como introducción del sistema
*/
</10>
Ejemplo Modelo Vista Controlador
areaIntroduccion.setBorder(javax.swing.BorderFactory.createBevelBorder(
javax.swing.border.BevelBorder.LOWERED, null, null, null,
new java.awt.Color(0, 0, 0)));
botonRegistrar.addActionListener(this);
botonBuscar.addActionListener(this);
add(botonBuscar);
add(botonRegistrar);
add(labelSeleccion);
add(labelTitulo);
add(areaIntroduccion);
setSize(480, 350);
setTitle("CodoaCodo : Patrones de Diseño/MVC");
setLocationRelativeTo(null);
setResizable(false);
setLayout(null);
</11>
Ejemplo Modelo Vista Controlador
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==botonRegistrar) {
miCoordinador.mostrarVentanaRegistro();
}
if (e.getSource()==botonBuscar) {
miCoordinador.mostrarVentanaConsulta();
}
}
}
Clase VentanaRegistro
package vista;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import modelo.vo.PersonaVO;
import controlador.Coordinador;
</12>
Ejemplo Modelo Vista Controlador
/**
*constructor de la clase donde se inicializan todos los
componentes de la ventana de registro
*/
public VentanaRegistro() {
botonGuardar = new JButton();
botonGuardar.setBounds(110, 220, 120, 25);
botonGuardar.setText("Registrar");
cod=new JLabel();
cod.setText("Codigo");
cod.setBounds(20, 80, 80, 25);
add(cod);
nombre=new JLabel();
nombre.setText("Nombre");
nombre.setBounds(20, 120, 80, 25);
add(nombre);
telefono=new JLabel();
telefono.setText("telefono");
telefono.setBounds(290, 160, 80, 25);
add(telefono);
edad=new JLabel();
edad.setText("Edad");
edad.setBounds(290, 120, 80, 25);
add(edad);
profesion=new JLabel();
profesion.setText("Profesion");
profesion.setBounds(20, 160, 80, 25);
add(profesion);
textCod=new JTextField();
textCod.setBounds(80, 80, 80, 25);
add(textCod);
textNombre=new JTextField();
textNombre.setBounds(80, 120, 190, 25);
add(textNombre);
textTelefono=new JTextField();
</13>
Ejemplo Modelo Vista Controlador
textEdad=new JTextField();
textEdad.setBounds(340, 120, 80, 25);
add(textEdad);
textProfesion=new JTextField();
textProfesion.setBounds(80, 160, 190, 25);
add(textProfesion);
botonGuardar.addActionListener(this);
botonCancelar.addActionListener(this);
add(botonCancelar);
add(botonGuardar);
add(labelTitulo);
limpiar();
setSize(480, 300);
setTitle("CoDejaVu : Patrones de Diseño/MVC");
setLocationRelativeTo(null);
setResizable(false);
setLayout(null);
}
@Override
public void actionPerformed(ActionEvent e){
if (e.getSource()==botonGuardar){
try {
PersonaVO miPersona=new PersonaVO();
miPersona.setIdPersona(Integer.parseInt(textCod.getText()));
miPersona.setNombrePersona(textNombre.getText());
miPersona.setTelefonoPersona(Integer.parseInt(textTelefono.getText()));
miPersona.setEdadPersona(Integer.parseInt(textEdad.getText()));
miPersona.setProfesionPersona(textProfesion.getText());
miCoordinador.registrarPersona(miPersona);
}catch (Exception ex) {
JOptionPane.showMessageDialog(null,"Error en el Ingreso de
Datos","Error",JOptionPane.ERROR_MESSAGE);
}
}
if (e.getSource()==botonCancelar){
this.dispose();
</14>
Ejemplo Modelo Vista Controlador
}
}
}
Clase VentanaBuscar
package vista;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import modelo.Logica;
import modelo.vo.PersonaVO;
import controlador.Coordinador;
/**
* constructor de la clase donde se inicializan todos los
componentesde la ventana de búsqueda
*/
public VentanaBuscar() {
</15>
Ejemplo Modelo Vista Controlador
cod=new JLabel();
cod.setText("Codigo");
cod.setBounds(20, 80, 80, 25);
add(cod);
nombre=new JLabel();
nombre.setText("Nombre");
nombre.setBounds(20, 120, 80, 25);
add(nombre);
telefono=new JLabel();
telefono.setText("telefono");
telefono.setBounds(290, 160, 80, 25);
add(telefono);
profesion=new JLabel();
profesion.setText("profesion");
profesion.setBounds(20, 160, 80, 25);
add(profesion);
edad=new JLabel();
edad.setText("Edad");
edad.setBounds(290, 120, 80, 25);
add(edad);
textCod=new JTextField();
textCod.setBounds(80, 80, 80, 25);
add(textCod);
</16>
Ejemplo Modelo Vista Controlador
textNombre=new JTextField();
textNombre.setBounds(80, 120, 190, 25);
add(textNombre);
textTelefono=new JTextField();
textTelefono.setBounds(340, 160, 80, 25);
add(textTelefono);
textProfesion=new JTextField();
textProfesion.setBounds(80, 160, 190, 25);
add(textProfesion);
textEdad=new JTextField();
textEdad.setBounds(340, 120, 80, 25);
add(textEdad);
botonModificar.addActionListener(this);
botonEliminar.addActionListener(this);
botonBuscar.addActionListener(this);
botonGuardar.addActionListener(this);
botonCancelar.addActionListener(this);
add(botonCancelar);
add(botonBuscar);
add(botonModificar);
add(botonEliminar);
add(botonGuardar);
add(labelTitulo);
limpiar();
setSize(480, 320);
setTitle("CoDejaVu : Patrones de Diseño/MVC");
setLocationRelativeTo(null);
setResizable(false);
setLayout(null);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==botonGuardar){
try {
PersonaVO miPersona=new PersonaVO();
miPersona.setIdPersona(Integer.parseInt(textCod.getText()));
miPersona.setNombrePersona(textNombre.getText());
miPersona.setTelefonoPersona(Integer.parseInt(textTelefono.getTe
xt()));
miPersona.setEdadPersona(Integer.parseInt(textEdad.getText()));
miPersona.setProfesionPersona(textProfesion.getText());
miCoordinador.modificarPersona(miPersona);
</17>
Ejemplo Modelo Vista Controlador
if (Logica.modificaPersona==true) {
habilita(true, false, false, false, false, true,
false, true, true);
}
}catch (Exception e2){
JOptionPane.showMessageDialog(null,"Error en
el Ingreso de Datos","Error",JOptionPane.ERROR_MESSAGE);
}
}
if (e.getSource()==botonBuscar){
PersonaVO
miPersona=miCoordinador.buscarPersona(textCod.getText());
if (miPersona!=null){
muestraPersona(miPersona);
}
else if(Logica.consultaPersona==true){
JOptionPane.showMessageDialog(null, "La
persona no Existe","Advertencia",JOptionPane.WARNING_MESSAGE);
}
}
if (e.getSource()==botonModificar){
habilita(false, true, true, true, true, false, true,
false, false);
}
if (e.getSource()==botonEliminar){
if (!textCod.getText().equals("")){
int respuesta = JOptionPane.showConfirmDialog(this, "¿Está
seguro de eliminar la Persona?",
"Confirmación",JOptionPane.YES_NO_OPTION);
if (respuesta == JOptionPane.YES_NO_OPTION){
miCoordinador.eliminarPersona(textCod.getText());
limpiar();
}
}else{
JOptionPane.showMessageDialog(null, "Ingrese un numero de
Documento", "Información",JOptionPane.WARNING_MESSAGE);
}
}
if (e.getSource()==botonCancelar){
this.dispose();
}
}
/**
* permite cargar los datos de la persona consultada
* @param miPersona
*/
private void muestraPersona(PersonaVO miPersona) {
textNombre.setText(miPersona.getNombrePersona());
</18>
Ejemplo Modelo Vista Controlador
textEdad.setText(miPersona.getEdadPersona()+"");
textTelefono.setText(miPersona.getTelefonoPersona()+"");
textProfesion.setText(miPersona.getProfesionPersona());
habilita(true, false, false, false, false, true, false, true,
true);
}
/**
* Permite limpiar los componentes
*/
public void limpiar(){
textCod.setText("");
textNombre.setText("");
textEdad.setText("");
textTelefono.setText("");
textProfesion.setText("");
habilita(true, false, false, false, false, true, false,
true, true);
}
/**
* Permite habilitar los componentes para establecer una modificación
* @param codigo
* @param nombre
* @param edad
* @param tel
* @param profesion
* @param cargo
* @param bBuscar
* @param bGuardar
* @param bModificar
* @param bEliminar
*/
public void habilita(boolean codigo, boolean nombre, boolean
edad, boolean tel, boolean profesion, boolean bBuscar, boolean
bGuardar, boolean bModificar, boolean bEliminar){
textCod.setEditable(codigo);
textNombre.setEditable(nombre);
textEdad.setEditable(edad);
textTelefono.setEditable(tel);
textProfesion.setEditable(profesion);
botonBuscar.setEnabled(bBuscar);
botonGuardar.setEnabled(bGuardar);
botonModificar.setEnabled(bModificar);
botonEliminar.setEnabled(bEliminar);
}
}
El Controlador
Esta parte del patrón es la que define la lógica de
administración del sistema, establece la conexión entre
la vista y el modelo.
</19>
Ejemplo Modelo Vista Controlador
Clase Principal
package controlador;
import modelo.Logica;
import vista.VentanaBuscar;
import vista.VentanaPrincipal;
import vista.VentanaRegistro;
public class Principal {
Logica miLogica;
VentanaPrincipal miVentanaPrincipal;
VentanaBuscar miVentanaBuscar;
VentanaRegistro miVentanaRegistro;
Coordinador miCoordinador;
</20>
Ejemplo Modelo Vista Controlador
miCoordinador.setMiVentanaBuscar(miVentanaBuscar);
miCoordinador.setMiLogica(miLogica);
miVentanaPrincipal.setVisible(true);
}
Clase Coordinador
Esta clase contiene toda la lógica de relaciones en
el aplicativo, es el puente entre el modelo y las
vistas.
package controlador;
import modelo.Logica;
import modelo.dao.PersonaDAO;
import modelo.vo.PersonaVO;
import vista.VentanaBuscar;
import vista.VentanaPrincipal;
import vista.VentanaRegistro;
public class Coordinador {
private Logica miLogica;
private VentanaPrincipal miVentanaPrincipal;
private VentanaRegistro miVentanaRegistro;
private VentanaBuscar miVentanaBuscar;
</21>
Ejemplo Modelo Vista Controlador
}
public void setMiVentanaRegistro(VentanaRegistro
miVentanaRegistro) {
this.miVentanaRegistro = miVentanaRegistro;
}
public VentanaBuscar getMiVentanaBuscar() {
return miVentanaBuscar;
}
public void setMiVentanaBuscar(VentanaBuscar miVentanaBuscar) {
this.miVentanaBuscar = miVentanaBuscar;
}
public Logica getMiLogica() {
return miLogica;
}
public void setMiLogica(Logica miLogica) {
this.miLogica = miLogica;
}
//////////////////////////////////////////////////////////
Conclusiones
Como vimos tenemos un proyecto funcional que realiza las
operaciones básicas del CRUD, y donde todas sus partes se encuentran
separadas por funcionalidades, separando la parte visual de la lógica de
negocio y estableciendo relaciones entre ellas. En si se desarrolló como
ejemplo práctico, existen validaciones muy básicas y procesos simples pero
pensado en modo de ejemplo sin mayor complejidad, también se utilizan
algunos conceptos vistos en entradas anteriores como es el caso del manejo
de excepciones, patrones entre otros.
</22>