Foros del Web » Programación para mayores de 30 ;) » Java »

MVC en Java

Estas en el tema de MVC en Java en el foro de Java en Foros del Web. Estimados foreros: Pido disculpas anticipadas si este tema es demasiado obvio o si demuestro estar muy perdido. La cuestión es que llevo muchos años desarrollando ...
  #1 (permalink)  
Antiguo 22/10/2010, 03:44
 
Fecha de Ingreso: noviembre-2007
Mensajes: 74
Antigüedad: 17 años
Puntos: 5
Pregunta MVC en Java

Estimados foreros:

Pido disculpas anticipadas si este tema es demasiado obvio o si demuestro estar muy perdido. La cuestión es que llevo muchos años desarrollando aplicaciones en Java, pero realmente, lo más que yo llegué a ver en la carrera fue programación estructurada, no poo, así que mi código fuente, es muy mejorable. Aunque los programas que hago tienen la costumbre de funcionar, y bien :), creo que podrian estar mejor organizados a nivel de código fuente.

Supongo que lo adecuado cuando se hacen aplicaciones de escritorio en cualquier lenguaje de programación moderno es utilizar la arquitectura modelo-vista-controlador.

La teoría la entiendo. Entiendo perfectamente lo que es el modelo, lo que es la vista, y lo que es el controlador. Pero en la práctica, en mis programas tengo dificultades en separar las tres partes. Quizas lo que mas claro tengo es que es la vista. Si no os importa, quisiera proponer un ejemplo en concreto.

Supongamos un programa que recupera los datos de una tabla de clientes, y los presenta en un grid en una pantalla. En esa pantalla, se podrian borrar, modificar, o insertar nuevos clientes.

Si no lo he entendido mal, el modelo interactua con la bd, y gestionaría las altas, bajas y modificaciones. La vista simplemente pinta los datos cuando es necesario, y el controlador responde a las acciones del usuario, y le comunica al modelo las mismas.

Ahora bien, metiendonos ya en el caso concreto de java. Entiendo que la vista serían las clases de representación grafica, en concreto JTable, y todas las clases auxiliares para pintar los datos en un grid (renderers de celda, editores de celda, etc etc).

El controlador, ¿sería el frame donde esta ese Jtable? O el frame tambien es parte de la vista. En caso de que sea parte de la vista, ¿que seria el controlador? Si mi programa tiene un Frame, ¿tendria que haber otra clase a mayores con el metodo main que haría de controlador?

Y el modelo, ¿sería el TableModel a partir del cual se construye el Jtable? ¿Si escribo métodos para el alta/baja/modificacion de datos, irían dentro del modelo? ¿Entonces extendería la clase TableModel, y le añadiría lo necesario para acceder a la base de datos ? ¿O el modelo de la arquitectura MVC no tiene nada que ver con el "Model" a la hora de contruir tablas en Java?

¿Estoy mezclando muchos conceptos?

Saludos y gracias

RC
  #2 (permalink)  
Antiguo 22/10/2010, 06:47
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Respuesta: MVC en Java

En realidad el controlador sería más el TableModel, ya que es el que comunica la vista con el modelo, y el modelo sería donde quiera que guardes tus datos, por ejemplo en una coleccion de datos que se actualiza contra una BDD.
La idea es que con otro controlador, como un ListModel, tu puedas mostrar los mismos datos del modelo sin tener que repetir el codigo para el manejo.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 22/10/2010, 06:52
 
Fecha de Ingreso: noviembre-2007
Mensajes: 74
Antigüedad: 17 años
Puntos: 5
Respuesta: MVC en Java

Gracias por tu respuesta.
Entonces si el controlador es el TableModel, entiendo que todo lo demás (frames, dialogos, y Jtables) es la vista-

Y el modelo sería una capa tipo hibernate o spring o algo así, que no necesito porque los datos en la bd son muy simples, pero que sustiuiría por alguna clase de mi cosecha.

Osea, lo que yo ahora tengo mezclado es la vista y el controlador.

Uuuf creo que lo voy pìllando.

Saludo2
  #4 (permalink)  
Antiguo 22/10/2010, 07:23
 
Fecha de Ingreso: agosto-2010
Mensajes: 126
Antigüedad: 14 años, 4 meses
Puntos: 9
Respuesta: MVC en Java

Aquí te dejo un código que le implemente hace mucho tiempo..espero que te sirva.

Paquete VISTA
Código PHP:
package Vista;
import Modelo.modEmpleado;
import java.awt.event.ActionListener;
public class 
frmEmpleado extends javax.swing.JDialog {
    private 
modEmpleado me = new modEmpleado();

    public 
frmEmpleado(java.awt.Frame parentboolean modalmodEmpleado me){
        
super(parentmodal);
        
initComponents();
        
establecerActionCommands();
        
cargarInformacion();
        
this.me me;
    }

    private 
void cargarInformacion(){
        
String s String.valueOf(me.maxCod());
        
int a Integer.parseInt(s);
        
String s1 String.valueOf(a+1);
        
codigo.setText(s1);
    }

    private 
void establecerActionCommands(){
        
adicionar.setActionCommand("1");
        
actualizar.setActionCommand("2");
        
eliminar.setActionCommand("3");
    }

    public 
void registrarControlador(ActionListener al){
        
adicionar.addActionListener(al);
        
eliminar.addActionListener(al);
        
actualizar.addActionListener(al);
    }

    private 
javax.swing.JButton actualizar;
    private 
javax.swing.JButton adicionar;
    private 
javax.swing.JButton eliminar;
    public 
javax.swing.JTextField apellido;
    public 
javax.swing.JTextField ci;
    public 
javax.swing.JTextField codigo;
    public 
javax.swing.JTextField fecha;
    public 
javax.swing.JTextField nombre;
    public 
javax.swing.JComboBox sexo;

Paquete Modelo
Código PHP:
package Modelo;
public class 
modEmpleado {
    static 
Session session HibernateUtil.getSessionFactory().openSession();
    private 
Empleado e;

    public 
void adicionar(int codEmpString nombreString apellidoint ciString sexoString fecha){
        
Transaction tx session.beginTransaction();
        try {
            
tx.begin();
            
= new Empleado(codEmpnombreapellidocisexofecha);
            
session.persist(e);
            
tx.commit();
//            session.close();
        
} catch (Exception ex) {
            
ex.getLocalizedMessage();
            
tx.rollback();
        }
    }

    public 
boolean existeCodigo(int cod){
        return (
getCodigo(cod) != null);
    }

    private 
Empleado getCodigo(int cod){
        
ScrollableResults sr null;
        
Transaction tr session.beginTransaction();
        
sr session.createQuery("From Empleado As emp WHERE emp.codEmp="+cod).scroll();
        if(
sr.next())
            return (
Empleadosr.get(0);
        return 
null;
    }

    public 
void eliminar(int cod){
        
Transaction tr session.beginTransaction();
        try {
            
tr.begin();
            
Query hql session.createQuery("Delete From Empleado As e WHERE e.codEmp="+cod);
            
hql.executeUpdate();
            
tr.commit();
//            session.close();
        
} catch (Exception ex) {
            
ex.getLocalizedMessage();
            
tr.rollback();
        }
    }

    public 
void actualizar(int codEmpString nombString apeint ciString sexString fec){
        
Transaction tr session.beginTransaction();
        try {
            
tr.begin();
            
Query hql session.createQuery("Update Empleado As e Set e.nombre='"+nomb+"', e.apellido='"+ape+"', e.ci="+ci+", e.sexo='"+sex+"', e.fecha='"+fec+"' WHERE e.codEmp="+codEmp);
            
hql.executeUpdate();
            
tr.commit();
//            session.close();
        
} catch (Exception ex) {
            
ex.getLocalizedMessage();
            
tr.rollback();
        }
    }

    public 
Object maxCod(){
        
ScrollableResults sr null;
        
Object s null ;
        
Transaction tx session.beginTransaction();
        
sr session.createQuery("Select max(codEmp) From Empleado").scroll();
        if(
sr.next())
            
sr.get(0);
        return 
s;
    } 
Paquete Controlador
Código PHP:
public class contEmpleado implements ActionListener{
    private 
frmEmpleado fe;
    private 
modEmpleado me;

    public 
contEmpleado(frmEmpleado femodEmpleado me){
        
this.fe fe;
        
this.me me;
        
fe.registrarControlador(this);
    }
    public 
void actionPerformed(ActionEvent e) {
        switch(
Integer.parseInt(e.getActionCommand())){
            case 
1:
                if(
validar()){
                    if(!
me.existeCodigo(Integer.parseInt(fe.codigo.getText()))){
                        
JOptionPane.showMessageDialog(null"Los datos se Guardaron satisfactoriamente");
                        
me.adicionar(Integer.parseInt(fe.codigo.getText()), fe.nombre.getText(),
                        
fe.apellido.getText(), Integer.parseInt(fe.ci.getText()), fe.sexo.getSelectedItem().toString(), fe.fecha.getText());
                        
actualizar();
                    }
                    else
                        
JOptionPane.showMessageDialog(null"Error..! Verifique el código");
                }
                else
                    
JOptionPane.showMessageDialog(null"Datos incorrectos..");
                break;
            case 
2:
                if(
validar()){
                    if(
me.existeCodigo(Integer.parseInt(fe.codigo.getText()))){
                        
JOptionPane.showMessageDialog(null"Los datos se Actualizaron satisfactoriamente");
                        
me.actualizar(Integer.parseInt(fe.codigo.getText()), fe.nombre.getText(),
                        
fe.apellido.getText(), Integer.parseInt(fe.ci.getText()), fe.sexo.getSelectedItem().toString(), fe.fecha.getText());
                        
actualizar();
                    }
                    else
                        
JOptionPane.showMessageDialog(null"Error..! Este código no esta Registrado");
                }
                else
                    
JOptionPane.showMessageDialog(null"Datos incorrectos..");
                break;
            case 
3:
                if(
validarCodigo()){
                    if(
me.existeCodigo(Integer.parseInt(fe.codigo.getText()))){
                        
JOptionPane.showMessageDialog(null"Los datos se Eliminaron satisfactoriamente");
                        
me.eliminar(Integer.parseInt(fe.codigo.getText()));
                        
cargarInformacion();
                    }
                    else
                        
JOptionPane.showMessageDialog(null"Este datos no se encuentra Registrado..");
                }
                else
                    
JOptionPane.showMessageDialog(null"Datos incorrectos..");
                break;
        }

    }

    private 
boolean validar(){
        return (!
fe.codigo.getText().equals("") && !fe.ci.getText().equals("") && !fe.nombre.getText().equals("") && !fe.apellido.getText().equals(""));
    }


    private 
boolean validarCodigo(){
        return (!
fe.codigo.getText().equals(""));
    }

    private 
void cargarInformacion(){
        
String s String.valueOf(me.maxCod());
        
int a Integer.parseInt(s);
        
String s1 String.valueOf(a+1);
        
fe.codigo.setText(s1);
    }

    public 
void actualizar(){
        
cargarInformacion();
        
fe.nombre.setText("");
        
fe.ci.setText("");
        
fe.apellido.setText("");
        
fe.fecha.setText("");
    }

  #5 (permalink)  
Antiguo 22/10/2010, 10:18
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 7 meses
Puntos: 306
Respuesta: MVC en Java

Qué pertenece a cada una de las capas es un poco filosofía, así que no hay una opinión consensuada al 100%.

Desde mi punto de vista:

Vista: La parte que se encarga de mostrar y recibir los datos, respecto al usuario.

Control: Aquello que gestiona el flujo del programa. Algunas personas creen que el formateo de las vistas pertenece a esta capa, otros que es parte de la vista, para mí depende de la ocasión.

Modelo: Creación y almacenamiento de datos, tanto dentro de java como con elementos externos.
Cita:
¿Si escribo métodos para el alta/baja/modificacion de datos, irían dentro del modelo?
No, tu modelo de datos no tiene que ocuparse de manejar datos, eso debes hacerlo desde la lógica de negocio o controladores (el control puede estar formado por varias clases). Por ejemplo, puedes crear un modelo de conexión a base de datos(M), que después llamas desde el controlador(C), y le asignas los objetos de datos(M) para que modifique,borre o lo que sea.

De esta forma, si tienes que cambiar de base de datos, sólo tienes que cambiar la llamada del modelo de conexión por otro. (Muy importante usar interfaces para facilitarlo)
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #6 (permalink)  
Antiguo 23/10/2010, 09:54
Usuario no validado
 
Fecha de Ingreso: agosto-2007
Mensajes: 141
Antigüedad: 17 años, 3 meses
Puntos: 1
Respuesta: MVC en Java

Código PHP:

public class Marca {
    private 
int idMarca;
    private 
String nombreMarca;
    private 
boolean activo
    
    public 
Marca(int unIdMarca,String unNombreMarca,boolean unActivo){
        
super();
        
this.setIdMarca(unIdMarca);
        
this.setNombreMarca(unNombreMarca);
        
this.setActivo(unActivo);
    }
    
    
    
//public String toString(){
        //return this.getNombreMarca();

faltan los get y set



Controlador
Código PHP:

public class ControladorMarcas {
    private 
MyMysql con null;;
    
String tabla1="marcas";
    public 
ConexionMarcas(){
        
con = new MyMysql();
    }
    
    
    public 
Vector getMarcas(String cadenaWhere,String cadenaLimit) {
        
Vector marcas=new Vector();
        
ResultSet rs=null;
        
        
this.setCon(con);
        
rs=this.getCon().consulta("SELECT * FROM "+this.tabla1+cadenaWhere);
        try{
            while(
rs.next()){
                
Marca marca=new Marca(rs.getInt("idMarca"), rs.getString("nombreMarca"),rs.getBoolean("activo"));
                        
marcas.add(marca);
                }
        }
        catch (
SQLException e){}
        return 
marcas;
    }    
    

public 
void insertarMarca(String unNombreMarca,int unActivo) {
         
String sql "INSERT INTO "+this.tabla1+" (nombreMarca,activo) VALUES('" unNombreMarca "',1);";
          
Statement st;
          try {
            
st = (Statementthis.getCon().getConexion().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVEResultSet.CONCUR_READ_ONLY);
            
st.execute(sql);
        } catch (
SQLException e) {
            
e.printStackTrace();
        }
    } 


Y BUENO LA VISTA seria

en el JPanel que va la lista de marcas, creo un ibjeto ControladorMarcas y a esto le envio getMarcas(), y me devuelve un vector de marcas, eso lo itero y lo meto en la tabla.

espero se entienda.
  #7 (permalink)  
Antiguo 23/10/2010, 20:17
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 9 meses
Puntos: 15
Respuesta: MVC en Java

Esto te podria dar una idea, ya que es cuestion de arquitectura no deberia importar el lenguaje en que se desarrolle.
http://oness.sourceforge.net/proyecto/html/ch03s02.html

Te lo resumo a mi manera tratando de evitar los terminos tecnicos que es lo que muchas veces confunde:

El desarrollo por mvc fue creado principalmente para la web, y luego se aplico a las aplicaciones de escritorio (Cual fue la razon?), imagina tener codigo del lenguaje de servidor y codigo del lado del cliente en combinado...cada modificacion aunque muchos lo hacen aun, es un trabajo muy engorroso.

EL modelo MVC que plantea?

EJ:

Tengo 3 carpetas en mi proyecto llamadas
- vista
- modelo
- controlador

En mi capa vista:
Puedo guardar todos los archivos del proyecto que se encargan de pintar los formularios,mensajes... en la pantalla del cliente (Generar el codigo html).

En mi capa controlador:
Se encarga de recoger las peticiones o eventos que el usuario genera sobre la vista, o pasar los datos retornados por el servidor a la vista.

La capa modelo, es la que matiene conexion a la base de datos, ejecuta las consultas, procesa la informacion del negocio...son procedimientos compilados del lado del servidor que estan pendientes a cualquier solicitud de la capa controlador o directamente la capa de vista en algunos casos.

Un ejemplo:
Aplicado a POO y JEE:

1)
- Una clase que podria hacer parte de la vista, es la encargada de pintar un "combo o un select" en la pantalla con la informacion del campo de una tabla en la BD.

Asi podria ser la encargada de crear una grilla, una lista, un text personalizado, o una simple etiqueta(Muy comun el uso de los JAVABEANS).

2) Una clase que corresponda a la parte de controlador, podria ser la que en el momento en que el usuario selecciona un dato del "combo o select", recibe este evento como una peticion(GET o POST), recoge este dato y define que se debe hacer con el(Un componente muy utilizado en este caso es el SERVLET).

3)Una clase en la parte del modelo, podria ser la que invoque el controlador pasandole el dato seleccionado en el combo de la vista. Ahora el modelo define que debe hacer el programa de acuerdo al dato seleccionado que puede ser consultar una tabla en la BD filtrando la informacion por el dato seleccionado en el combo y retornarlo al controlador, para que este nuevamente lo retorne a la vista, y la vista pinte una grilla con la informacion retornada(Podria se en este caso un ENTERPRICE JAVA BEAN).

Espero sea mas o menos claro, vere si le saco tiempo a moldear un ejemplo sencillo. (Cualquier correcion sera bien recibida)

Un saludo,
  #8 (permalink)  
Antiguo 24/10/2010, 04:48
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Respuesta: MVC en Java

Cita:
Iniciado por SPAWN3000 Ver Mensaje
El desarrollo por mvc fue creado principalmente para la web, y luego se aplico a las aplicaciones de escritorio
Esta parte es al reves. El modelo MVC existía mucho antes que Internet, y de hecho mucha gente, entre la que me incluyo, prefiere llamar ahora al modelo web SoC (separación en capas) puesto que Modelo-Vista-Controlador es una definición clara para una aplicación de escritorio pero en web hay más de 3 elementos e intentar encajar tantas piezas en 3 nombres produce confusión.

De la Wikipedia, que no es la verdad absoluta pero se puede contrastar:
Cita:
El estilo fue descrito por primera vez en 1979[1] por Trygve Reenskaug, entonces trabajando en Smalltalk en laboratorios de investigación de Xerox. La implementación original está descrita Programación de Aplicaciones en Smalltalk-80(TM): Como utilizar Modelo Vista Controlador.
S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #9 (permalink)  
Antiguo 24/10/2010, 22:32
Avatar de SPAWN3000  
Fecha de Ingreso: marzo-2008
Ubicación: Bogota
Mensajes: 858
Antigüedad: 16 años, 9 meses
Puntos: 15
Respuesta: MVC en Java

Ouch, yes...tienes toda la razon, sorry. No se en que estaba pensando cuando escribi...Es correcto, fue inicialmente para aplicaciones de escritorio pero tal vez tenia en mente decir que se ha constituido como papel mucho mas importante en el desarrollo web(Aunque no me escuso en eso por mi error). Gracias
  #10 (permalink)  
Antiguo 25/10/2010, 04:28
 
Fecha de Ingreso: noviembre-2007
Mensajes: 74
Antigüedad: 17 años
Puntos: 5
Respuesta: MVC en Java

Estimados amigos:

Muchas gracias por vuestras orientaciones y ejemplos. Entre unos y otros creo que mas o menos estoy aplicando la arquitectura MVC a mis neuronas para despues aplicarsela a mis programas

En los ejemplos que habeis puesto, observo que uagrm ha puesto en el modelo el acceso a la base de datos, sin embargo cribelo lo ha puesto en el controlador...

Independientemente de esto, observo que el acceso a base de datos, es muy sencillo. Es decir, me limito a hacer un select, un update, un delete (quizas porque los ejemplos son muy sencillos).

Una ultima consulta, si con el dato, antes de actuar con el en la bd, hubiera que hacer calculos complejos, mi pregunta es. ¿Los calculos se hacen en el modelo, o en el controlador?

Por ejemplo, el usuario selecciona una imagen en la pantalla (una foto), y antes de insertar en un campo blob a través del modelo, tenemos que reescalarla, girarla, o que se yo. ¿Esto lo haría el modelo, o el controlador?

Respondiendome a mi mismo en otra pregunta que plantee mas arriba, las clases TableModel y todo lo que se puede crear a partir de ellas, entiendo que son parte de la vista, pues son parte de Swing. La verdad es que el nombre TableModel me hacía pensar en modelo, de ahí la confusión.

Bueno, muchas gracias por vuestras ayudas. Voy a seguir leyendo un poco mas de documentación al respecto.

Saludos

Roque
  #11 (permalink)  
Antiguo 25/10/2010, 09:41
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Respuesta: MVC en Java

En mi caso, como la parte de actualizar los datos es independiente de como los muestres, para mí es modelo. El modelo de datos es la representación lógica de los datos y como interactuas con ellos, no simplemente el esquema de tablas o la implementación física.

Es decir, para mí, opnión personal, el modelo de MVC incluye la lógica de negocio ya que el controlador "simplemente" es el transmisor de mensajes/información entre el modelo y la vista.

Pero como ya han mencionado antes, no hay consenso al 100% así que no voy a decir que mi versión es LA correcta, si es que hay alguna que lo sea. Mientras sirva a tus necesidades, da igual como lo llames .

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #12 (permalink)  
Antiguo 25/10/2010, 16:16
 
Fecha de Ingreso: octubre-2010
Mensajes: 27
Antigüedad: 14 años, 1 mes
Puntos: 2
Respuesta: MVC en Java

Lider, sugiero que antes de tratar de "interpretar" el MVC en el Java tengas bien claro cada uno de los conceptos del patrón MVC. Asi como tener claro los conceptos de la programación Orientado a Objeto (POO).

Teniendo claro la teoria cualquier lenguaje OO que uses Java, .NET, Visual Object, Codegear Delphi, C, etc etc se va a ser mucho más fácil. Tratar de "adecuar" la prog. estructura o un leng. en especial con los conceptos OO es un poco jalado de los pelos y no vas a llegar a buen puerto. Es mi modesta opinión.

Salu2

Maverick

Etiquetas: mvc
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:46.