Sunteți pe pagina 1din 22

Ejemplo Modelo Vista Controlador

Ejemplo Modelo Vista Controlador

En la entrada sobre patrones de Diseño se habla sobre el patrón MVC,


en esta oportunidad vamos explicar un ejemplo
práctico donde se aplica este modelo mostrando la
forma de independizar los componentes de nuestro
sistema, además lo combinaremos con los
patrones DAO y VO para facilitar el manejo de la
información.

Por cuestiones de tamaño no vamos a hacer la


aplicación paso a paso, pero si se explicará la lógica de la misma, al final se
presenta una opción de descarga del código fuente donde veremos la
aplicación en funcionamiento.

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

Para la BD se usa MySql, reutilizando la BD creada en el ejemplo


de conexión con Java, el Scritp es el siguiente.

CREATE DATABASE /*!32312 IF NOT EXISTS*/`basecita` /*!40100 DEFAULT


CHARACTER SET latin1 */;

USE ` basecita`;

/*Table structure for table `persona` */

DROP TABLE IF EXISTS `persona`;

CREATE TABLE `persona` (


`id` int(10) NOT NULL,
`nombre` varchar(30) default NULL,
`edad` int(3) default NULL,
`profesion` varchar(30) default NULL,
`telefono` decimal(10,0) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `persona` */

De esta forma se crea la Base de Datos a la que se va a apuntar, la cual


contiene solo una tabla Persona con la que se realizan todas las
operaciones CRUD.

</2>
Ejemplo Modelo Vista Controlador

La agrupación de clases de nuestro sistema es:

Como vemos tenemos la parte visual compuesta por las


clases VentanaPrincipal, VentanaRegistro, VentanaBuscar, la lógica de
negocio se establece en el modelo el cual se compone por la
clase Logica y Conexión y aplicamos los patrones DAO y VO por medio de
las clases PersonaDao y PersonaVo y por último el controlador se define
en la clase Coordinador, encargada de establecer todas las relaciones del
sistema, la clase Principal prepara las instancias iniciales del sistema y
posteriormente lo ejecuta.

Veamos cómo funciona el Patrón:

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

Esta clase permite realizar las operaciones asociadas a


la lógica de negocio como tal, desde ella realizamos
las validaciones y llamados a las
operaciones CRUD del sistema.

En caso de que se requieran procesos adicionales


asociados a la lógica de negocio, aquí será donde se
creen los métodos para dichos procesos, por ejemplo
el método validarRegistro determina si los datos son
correctos y permite registrar la persona en el DAO.

</3>
Ejemplo Modelo Vista Controlador

El código de esta clase sería:

package modelo;
import javax.swing.JOptionPane;
import modelo.dao.PersonaDAO;
import modelo.vo.PersonaVO;
import controlador.Coordinador;

public class Logica {


private Coordinador miCoordinador;
public static boolean consultaPersona=false;
public static boolean modificaPersona=false;

public void setCoordinador(Coordinador miCoordinador) {


this.miCoordinador=miCoordinador;
}

public void validarRegistro(PersonaVO miPersona) {


PersonaDAO miPersonaDao;
if (miPersona.getIdPersona() > 99){
miPersonaDao = new PersonaDAO();
miPersonaDao.registrarPersona(miPersona);

}else{
JOptionPane.showMessageDialog(null,"El documento de
la persona debe ser más de 3
digitos","Advertencia",JOptionPane.WARNING_MESSAGE);
}
}

public PersonaVO validarConsulta(String codigoPersona) {


PersonaDAO miPersonaDao;
try {
int codigo=Integer.parseInt(codigoPersona);
if(codigo > 99){
miPersonaDao = new PersonaDAO();
consultaPersona=true;
return miPersonaDao.buscarPersona(codigo);

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

public void validarModificacion(PersonaVO miPersona) {


PersonaDAO miPersonaDao;
if (miPersona.getNombrePersona().length()>5) {
miPersonaDao = new PersonaDAO();
miPersonaDao.modificarPersona(miPersona);
modificaPersona=true;
}else{
JOptionPane.showMessageDialog(null,"El nombre de la
persona debe ser mayor a 5
digitos","Advertencia",JOptionPane.WARNING_MESSAGE);
modificaPersona=false;
}
}

public void validarEliminacion(String codigo) {


PersonaDAO miPersonaDao=new PersonaDAO();
miPersonaDao.eliminarPersona(codigo);
}
}

Clase Conexión

En esta clase tenemos la cadena de conexión con la que trabajará nuestra


aplicación, en ella se define la base de datos, el
usuario, password y driver de conexión, si por ejemplo
en un futuro se nos pide conectarnos a una base de
datos diferente o establecer un sistema gestor distinto
(pero con la misma estructura de tablas y campos), tan
solo modificaremos esta clase y dicho cambio será
transparente para el resto del sistema.
(Tener en cuenta que los datos de login y password
corresponden a los que yo dejé por defecto al instalar
MySql, es decir login root y sin contraseña).

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;

Connection conn = null;

/** Constructor de DbConnection */


public Conexion() {
try{

</5>
Ejemplo Modelo Vista Controlador

//obtenemos el driver de para mysql


Class.forName("com.mysql.jdbc.Driver");
//obtenemos la conexión
conn = DriverManager.getConnection(url,login,password);

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

public void desconectar(){


conn = null;
}
}

Clase PersonaVo

Al utilizar este tipo de clases, aplicamos


el patrón Value Object o VO (Anteriormente
conocidas como DTO Data Transfer Object) en
el que representamos las entidades (Tablas) de la
base de datos, la tabla persona tiene los campos
id, nombre, edad, profesión teléfono entonces
nuestra clase Vo tendrá estos mismos atributos y
de esta manera podremos transportar un objeto
persona con todos estos valores por medio de los
métodos set y get de cada atributo.

Este patrón nos facilita enormemente el transporte


de la información, evitando que se envíen gran
cantidad de parámetros a un método cuando
queremos hacer un registro o
actualización, también en caso de que se modifique la tabla de la BD,
nuestra clase deberá ser modificada así como los métodos que obtienen la
información, mas no los métodos que la transportan.

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

public Integer getIdPersona() {


return idPersona;
}

public void setIdPersona(Integer idPersona) {


this.idPersona = idPersona;
}

public String getNombrePersona() {


return nombrePersona;
}

public void setNombrePersona(String nombrePersona) {


this.nombrePersona = nombrePersona;
}

public Integer getEdadPersona() {


return edadPersona;
}

public void setEdadPersona(Integer edadPersona) {


this.edadPersona = edadPersona;
}

public String getProfesionPersona() {


return profesionPersona;
}

public void setProfesionPersona(String profesionPersona) {


this.profesionPersona = profesionPersona;
}

public Integer getTelefonoPersona() {


return telefonoPersona;
}

public void setTelefonoPersona(Integer telefonoPersona) {


this.telefonoPersona = telefonoPersona;
}

Clase PersonaDao

Cuando utilizamos estas clases, aplicamos


el patrón Data Access
Object o DAO, básicamente este patrón consiste en

</7>
Ejemplo Modelo Vista Controlador

centralizar los procesos de acceso a la base de datos evitando


inconsistencias y posibles problemáticas cuando esto se realiza a lo largo de
la aplicación.
Con este patrón independizamos la lógica de negocio de la lógica de acceso
a datos obteniendo mayor organización y flexibilidad en el sistema.

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

public PersonaVO buscarPersona(int codigo) {


Conexion conex= new Conexion();
PersonaVO persona= new PersonaVO();
boolean existe=false;
try {
Statement estatuto = conex.getConnection().createStatement();
PreparedStatement consulta =
conex.getConnection().prepareStatement("SELECT * FROM persona where id = ?
");
consulta.setInt(1, codigo);
ResultSet res = consulta.executeQuery();
while(res.next()){
existe=true;

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

public void modificarPersona(PersonaVO miPersona) {

Conexion conex= new Conexion();


try{
String consulta="UPDATE persona SET id= ? ,nombre = ? , edad=? ,
profesion=? , telefono= ? WHERE id= ? ";
PreparedStatement estatuto =
conex.getConnection().prepareStatement(consulta);

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

JOptionPane.showMessageDialog(null, " Se ha Modificado


Correctamente ","Confirmación",JOptionPane.INFORMATION_MESSAGE);

}catch(SQLException e){
System.out.println(e);
JOptionPane.showMessageDialog(null, "Error al
Modificar","Error",JOptionPane.ERROR_MESSAGE);
}
}

public void eliminarPersona(String codigo){


Conexion conex= new Conexion();
try {
Statement estatuto = conex.getConnection().createStatement();
estatuto.executeUpdate("DELETE FROM persona WHERE id='"+codigo+"'");
JOptionPane.showMessageDialog(null, " Se ha Eliminado
Correctamente","Información",JOptionPane.INFORMATION_MESSAGE);
estatuto.close();
conex.desconectar();
}catch (SQLException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "No se Eliminó");
}
}
}

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

Esta clase representa la ventana inicial de la aplicación, posee un área de


texto con una pequeña descripción y 2 botones que darán inicio a los
eventos principales del sistema.

Se comunica con el modelo mediante la clase coordinador y desde esta se


cargan las otras ventanas de la aplicación.

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;

public class VentanaPrincipal extends JFrame implements ActionListener{


private Coordinador miCoordinador; //objeto miCoordinador que permite la
relacion entre esta clase y la clase coordinador
private JTextArea areaIntroduccion;
private JLabel labelTitulo, labelSeleccion;
private JButton botonRegistrar,botonBuscar;

/**
* Establece la información que se presentara como introducción del sistema
*/

public String textoIntroduccion = "";


/**

</10>
Ejemplo Modelo Vista Controlador

*constructor de la clase donde se inicializan todos los componentes


* de la ventana principal
*/
public VentanaPrincipal() {
setDefaultCloseOperation(EXIT_ON_CLOSE);

botonRegistrar = new JButton();


botonRegistrar.setBounds(100, 280, 120, 25);
botonRegistrar.setText("Registrar");

botonBuscar = new JButton();


botonBuscar.setBounds(240, 280, 120, 25);
botonBuscar.setText("Buscar");

labelTitulo = new JLabel();


labelTitulo.setText("PATRON MODELO VISTA CONTROLADOR");
labelTitulo.setBounds(60, 40, 380, 30);
labelTitulo.setFont(new java.awt.Font("Verdana", 1, 15));

labelSeleccion = new JLabel();


labelSeleccion.setText("Elija que operación desea realizar");
labelSeleccion.setBounds(75, 240, 250, 25);

textoIntroduccion = "Esta aplicación presenta un ejemplo


práctico del patrón " + "de diseño MVC.\n\n" + "La aplicación permite
registrar, actualizar, buscar y eliminar registros de una tabla Persona." +
"también son vinculados algunos conceptos de los Patrones Value Object y Data
Access Objetc\n";

areaIntroduccion = new JTextArea();


areaIntroduccion.setBounds(50, 90, 380, 140);
areaIntroduccion.setEditable(false);
areaIntroduccion.setFont(new java.awt.Font("Verdana", 0, 14));
areaIntroduccion.setLineWrap(true);
areaIntroduccion.setText(textoIntroduccion);
areaIntroduccion.setWrapStyleWord(true);

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

public void setCoordinador(Coordinador miCoordinador) {


this.miCoordinador=miCoordinador;

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

Permite el ingreso de información a la BD, en ella se evidencian todos los


campos de la tabla Persona y presenta un medio gráfico para las
clases PersonaVo y PersonaDao, al ejecutar el evento de registro se
establece comunicación entre el coordinador y la clase Lógica donde se
encuentran todas las validaciones y casos para el ingreso de información.

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;

public class VentanaRegistro extends JFrame implements ActionListener{


private Coordinador miCoordinador; //objeto miCoordinador que permite
la relacion entre esta clase y la clase coordinador
private JLabel labelTitulo;
private JTextField
textCod,textNombre,textEdad,textTelefono,textProfesion;
private JLabel cod,nombre,edad,telefono,profesion;

</12>
Ejemplo Modelo Vista Controlador

private JButton botonGuardar,botonCancelar;

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

botonCancelar = new JButton();


botonCancelar.setBounds(250, 220, 120, 25);
botonCancelar.setText("Cancelar");

labelTitulo = new JLabel();


labelTitulo.setText("REGISTRO DE PERSONAS");
labelTitulo.setBounds(120, 20, 380, 30);
labelTitulo.setFont(new java.awt.Font("Verdana", 1, 18));

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

textTelefono.setBounds(340, 160, 80, 25);


add(textTelefono);

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

private void limpiar() {


textCod.setText("");
textNombre.setText("");
textEdad.setText("");
textTelefono.setText("");
textProfesion.setText("");
}

public void setCoordinador(Coordinador miCoordinador) {


this.miCoordinador=miCoordinador;
}

@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

Esta clase permite realizar las operaciones de Consulta, Actualización y


eliminación de la tabla Persona, igual que la anterior representa la parte
visual del modelo y se ejecutan los eventos para la lógica de los procesos
anteriores, la forma de obtener los datos y como se
le envían parámetros de consulta a la BD.

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;

public class VentanaBuscar extends JFrame implements ActionListener{


private Coordinador miCoordinador; //objeto miCoordinador que
permite la relacion entre esta clase y la clase coordinador
private JLabel labelTitulo;
private JTextField
textCod,textNombre,textEdad,textTelefono,textProfesion;
private JLabel cod,nombre,edad,telefono,profesion;
private JButton
botonGuardar,botonCancelar,botonBuscar,botonModificar,botonEliminar;

/**
* constructor de la clase donde se inicializan todos los
componentesde la ventana de búsqueda
*/
public VentanaBuscar() {

</15>
Ejemplo Modelo Vista Controlador

botonGuardar = new JButton();


botonGuardar.setBounds(50, 220, 120, 25);
botonGuardar.setText("Guardar");

botonCancelar = new JButton();


botonCancelar.setBounds(190, 250, 120, 25);
botonCancelar.setText("Cancelar");

botonBuscar = new JButton();


botonBuscar.setBounds(170, 80, 50, 25);
botonBuscar.setText("Ok");

botonEliminar = new JButton();


botonEliminar.setBounds(330, 220, 120, 25);
botonEliminar.setText("Eliminar");

botonModificar = new JButton();


botonModificar.setBounds(190, 220, 120, 25);
botonModificar.setText("Modificar");

labelTitulo = new JLabel();


labelTitulo.setText("ADMINISTRAR PERSONAS");
labelTitulo.setBounds(120, 20, 380, 30);
labelTitulo.setFont(new java.awt.Font("Verdana", 1, 18));

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

public void setCoordinador(Coordinador miCoordinador) {


this.miCoordinador=miCoordinador;
}

@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

Esta clase contiene el método main que ejecuta la aplicación,


el método hace un llamado al método iniciar el cual crea las instancias de
las clases ventanas y la clase Logica estableciendo las relaciones con la
clase Coordinador.

A cada instancia de las clases se les envía una instancia de la


clase Coordinador, y a la instancia de Coordinador se le envía cada
instancia de las clases, esto por medio de los métodos set y get
estableciendo las relaciones necesarias y por último se usa la instancia de la
clase VentanaPrincipal para cargarla en pantalla.

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;

public static void main(String[] args) {


Principal miPrincipal=new Principal();
miPrincipal.iniciar();
}
/**
* Permite instanciar todas las clases con las que trabaja
* el sistema
*/

private void iniciar() {


/*Se instancian las clases*/
miVentanaPrincipal=new VentanaPrincipal();
miVentanaRegistro=new VentanaRegistro();
miVentanaBuscar= new VentanaBuscar();
miLogica=new Logica();
miCoordinador= new Coordinador();

/*Se establecen las relaciones entre clases*/


miVentanaPrincipal.setCoordinador(miCoordinador);
miVentanaRegistro.setCoordinador(miCoordinador);
miVentanaBuscar.setCoordinador(miCoordinador);
miLogica.setCoordinador(miCoordinador);

/*Se establecen relaciones con la clase coordinador*/


miCoordinador.setMiVentanaPrincipal(miVentanaPrincipal);
miCoordinador.setMiVentanaRegistro(miVentanaRegistro);

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

Puede contener instancias locales tanto de clases


de la vista como de clases del modelo, estas
instancias tienen sus respectivos métodos set y get
permitiendo el flujo de llamados del sistema.

Cuando se desea registrar una persona desde la


clase VentanaRegistro se hace un llamado
al método registrarPersona() de la clase
Coordinador, posteriormente esta clase llama
al método ValidarRegistro() de la clase Logica y
esta a su vez realiza las validaciones
correspondientes para determinar si se llama o no
al método RegistrarPersona() de la clase PersonaDao.

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;

public VentanaPrincipal getMiVentanaPrincipal() {


return miVentanaPrincipal;
}
public void setMiVentanaPrincipal(VentanaPrincipal miVentanaPrincipal)
{
this.miVentanaPrincipal = miVentanaPrincipal;
}
public VentanaRegistro getMiVentanaRegistro() {
return miVentanaRegistro;

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

//////////////////////////////////////////////////////////

public void mostrarVentanaRegistro() {


miVentanaRegistro.setVisible(true);
}
public void mostrarVentanaConsulta() {
miVentanaBuscar.setVisible(true);
}

public void registrarPersona(PersonaVO miPersona) {


miLogica.validarRegistro(miPersona);
}

public PersonaVO buscarPersona(String codigoPersona) {


return miLogica.validarConsulta(codigoPersona);
}

public void modificarPersona(PersonaVO miPersona) {


miLogica.validarModificacion(miPersona);
}
public void eliminarPersona(String codigo) {
miLogica.validarEliminacion(codigo);
}
}

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>

S-ar putea să vă placă și