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

Duda sobre como implementar MVC ..El Controlador

Estas en el tema de Duda sobre como implementar MVC ..El Controlador en el foro de Java en Foros del Web. Hola amigos. luego de leer los fantásticos tópicos que hay aquí,como invitado,me anime a preguntar,ya que veo una gran experiencia en la comunidad. Quisiera salir ...
  #1 (permalink)  
Antiguo 23/03/2016, 09:23
 
Fecha de Ingreso: enero-2005
Mensajes: 95
Antigüedad: 19 años, 11 meses
Puntos: 0
Pregunta Duda sobre como implementar MVC ..El Controlador

Hola amigos.
luego de leer los fantásticos tópicos que hay aquí,como invitado,me anime a preguntar,ya que veo una gran experiencia en la comunidad. Quisiera salir de la ignorancia sobre como se utiliza el patrón MVC cuando se trabaja con Java,específicamente aplicaciones de escritorio.
He visto bastantes videotutoriales en Youtube sobre como se utiliza MVC en Java,pero la duda que me queda es como usar el controlador para "conectar" el modelo y la parte gráfica(solo he usado MVC en PHP).
Tengo tres paquetes:<strong>modelo,vista y controlador</strong>. el modelo lo he subdividido en dos paquetes uno para la parte de la persistencia(modelo.dao) y otro donde solo tengo las entidades con sus métodos accesores(modelo.vo). La distribución de las clases en los paquetes me queda asi

modelo.vo:Estudiante
modelo.dao:EstudianteDao
controlador:De momento sin ninguna clase
vista:AlumnoVentana
Ademas de una clase conexion,para crear la conexión al gestor de base de datos y poder realizar las consultas a través de las clases DAO.

Este es el código de cada clase

Conexion.Java
Código:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 *
 * @author ASUS
 */
public class Conexion {
    private final String usuario="root";
    private final String password="CXT982mw";
    private final String url="jdbc:mysql://localhost:3306/bd";
    private Connection con;
    
    public Conexion() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con=DriverManager.getConnection(url,usuario,password);
            System.out.println("Conexion realizada con exito!");
        } 
        catch(ClassNotFoundException e){
            System.out.println("No se entro el Driver: "+e);
        }
        catch(SQLException e){
            System.out.println("No se pudo realizar la conexion: "+e);
        }
        catch (Exception e) {
            System.out.println("Error: "+e);
        }
    }
    
    //Devuelve la cadena de conexion
    public Connection getConexion(){
        System.out.println("Enviando conexion");
        return con;
    }
    //Cerrar la conexion a la BD
    public void cerrarConexion(){
        try {
            if(con!=null){
                con.close();
                System.out.println("Conexion cerrada con exito!");
            }
            else{
                System.out.println("La conexion no existe.");
            }
        } catch (Exception e) {
            System.out.println("No se pudo cerrar la conexion");
        }
    }
}
EstudianteDao.java

Código:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import modelo.Conexion;
import modelo.vo.Estudiante;

/**
 *
 * @author ASUS
 */
public class EstudianteDao {
    private Conexion conexion=new Conexion();
    /**
     * Insertar un Estudiante en la BD
     * @param est 
     */
    public void insertar(Estudiante est){
        //obteto del tipo Connection para hacer ejecutar las querys a la BD.
        Connection con=conexion.getConexion();
        String sql="INSERT INTO expedientealumno(carnet,codcarrera,nombres,apellido1,apellido2,apellcasad,edad,nui)"
                + " VALUES(?,?,?,?,?,?,?,?)";
        
        try {
            PreparedStatement pst=con.prepareStatement(sql);
            pst.setString(1, est.getCarnet());
            pst.setString(2, est.getCodigoCarrera());
            pst.setString(3, est.getNombres());
            pst.setString(4, est.getPrimerApellido());
            pst.setString(5, est.getSegundoApellido());
            pst.setString(6, est.getApellidoCasada());
            pst.setInt(7, est.getEdad());
            pst.setString(8, est.getNui());
            if (pst.executeUpdate()>0) {
                System.out.println("registro insertado con exito");
            } 
            
        } catch (SQLException e) {
            System.out.println("No se pudo insertar el registro: "+e);
        }
        catch(Exception e){
            System.out.println("Ocurrido el siguiente error: "+e);
        }
        finally{
            conexion.cerrarConexion();
        }
    }
    
}
Estudiante.java

Código:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo.vo;

/**
 *
 * @author ASUS
 */
public class Estudiante {
    private String carnet;
    private String codigoCarrera;
    private String nombres;
    private String primerApellido;
    private String SegundoApellido;
    private String apellidoCasada;
    private int edad;
    private String nui;

    /**
     * Constructor por defecto
     */
    public Estudiante() {
    }
    /**
     * Constructor con parametros estudiante.
     * @param carnet
     * @param codigoCarrera
     * @param nombres
     * @param primerApellido
     * @param SegundoApellido
     * @param apellidoCasada
     * @param edad
     * @param nui 
     */
    public Estudiante(String carnet, String codigoCarrera, String nombres, String primerApellido, String SegundoApellido, String apellidoCasada, int edad, String nui) {
        this.carnet = carnet;
        this.codigoCarrera = codigoCarrera;
        this.nombres = nombres;
        this.primerApellido = primerApellido;
        this.SegundoApellido = SegundoApellido;
        this.apellidoCasada = apellidoCasada;
        this.edad = edad;
        this.nui = nui;
    }
    
    //Inicio metodos accesores

    public String getCarnet() {
        return carnet;
    }

    public void setCarnet(String carnet) {
        this.carnet = carnet;
    }

    public String getCodigoCarrera() {
        return codigoCarrera;
    }

    public void setCodigoCarrera(String codigoCarrera) {
        this.codigoCarrera = codigoCarrera;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public String getPrimerApellido() {
        return primerApellido;
    }

    public void setPrimerApellido(String primerApellido) {
        this.primerApellido = primerApellido;
    }

    public String getSegundoApellido() {
        return SegundoApellido;
    }

    public void setSegundoApellido(String SegundoApellido) {
        this.SegundoApellido = SegundoApellido;
    }

    public String getApellidoCasada() {
        return apellidoCasada;
    }

    public void setApellidoCasada(String apellidoCasada) {
        this.apellidoCasada = apellidoCasada;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public String getNui() {
        return nui;
    }

    public void setNui(String nui) {
        this.nui = nui;
    }
    //Fin metodos accesores

}
AlumnoVentana.java





De esta clase no coloco el codigo por que es el que me genera netbeans,pero allí no he colocado ningún otro código,lo único que hice(como vi en los vídeos de youtube) fue dejar todos los campos y botones como publico..aun que no se si es correcto.

he probado cada clase pro separado y funciona...Pero en el controlador es donde tengo la gran interrogante. como conecto la vista y el modelo? es a través del constructor? que debería enviar de la vista y el modelo? en algunos vídeos lo hacen mas o menos asi:


Código:
public controlado(Vista v, Modelo m){

}
pero en otros vídeos que vi crean otra clase,que contiene el metodo main, alli instancian el modelo,la vista y el controlador . De lo que he programado con MVC, tengo un poco de experiencia en PHP, y cuando lo hacia era en el controlador que creaba la instancia del modelo (dao y vo) y una vez obtenía el resultado ese lo enviaba a la vista,la cual trabajaba con un sistema de plantilla.

Pero en Java me pierdo :( y ya que estoy aprendiendo quisiera hacerlo de la mejor forma posible, les agradecería de mucho su orientación al respecto.
__________________
customsmf
Seo,tutoriales,decargas
  #2 (permalink)  
Antiguo 23/03/2016, 11:22
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 7 meses
Puntos: 306
Respuesta: Duda sobre como implementar MVC ..El Controlador

No funciona así exactamente.

Lo primero es que tienes que darte cuenta de que MVC no es una ley de hierro, no hay unas normas o trucos que te permitan separar todo a la perfección, digamos que son una serie de recomendaciones que deberías aplicar según tu criterio para tener una aplicación separada en capas.

Lo segundo es que MVC no es algo que se aplica porque los que saben dicen que hay que hacerlo, hay que entender qué es el patrón MVC de forma que al conocer sus ventajas sabremos mejor cómo aplicarlo. Lo que se busca es dividir la aplicación en capas de forma que estén desacopladas, que se pueda cambiar alguna de las capas sin que afecte (o lo mínimo posible) al resto de capas.

Para mí donde mejor se ve es las aplicaciones web, en las aplicaciones de escritorio aparece un problema que comentaré luego.



En web es claro, cada proceso entra al servlet (controlador o precontrolador) que ejecuta los procesos usando los modelos, para finalmente transmitir la información al usuario a través de la vista (mediante modelos).

¿Qué sucede con las aplicaciones de escritorio? Que funcionan a través de eventos, por lo que quien ejerce de "precontrolador" son las vistas. Yo soy de web, así que lo que voy a decir ahora con pinzas porque puede ser erróneo.

A MÍ no me gusta que el Controlador reciba un objeto Vista, la Vista no es parte del negocio por lo que para el Controlador cuanto menos sepa de ella mejor. ¿Qué pasa si mañana mi aplicación pasa a ser web? Que ni sirve la Vista ni el Controlador porque depende de la Vista.

YO desde los listener de la Vista haría un new de un controlador (o usaría singleton u otro patrón del estilo que favorezca desacoplamiento) de forma que sus métodos recibiesen/devolviesen como parámetros objetos Modelo si es necesario. Así, la vista únicamente serviría para lanzar al Controlador o gestionar código relativo a la presentación, y el Controlador sería totalmente independiente de la Vista.
__________________
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.
  #3 (permalink)  
Antiguo 27/03/2016, 15:44
 
Fecha de Ingreso: enero-2005
Mensajes: 95
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Duda sobre como implementar MVC ..El Controlador

Gracias por contestar,según comprendo entonces seria en la vista donde deberia instanciar a la clase que hace de controlador?
en ese caso un codigo como este,en una clase controlador no seria correcto?

Código:
    public void abrirFormulario(){
        formulario.setTitle("Agregar Persona - TrucosJenJen");
        //posicion del formulario en la pantalla
        formulario.setLocationRelativeTo(null);
        formulario.setVisible(true);
        //addActionListeners para los botones
        this.formulario.btnAgregarImagen.setActionCommand("btnAgregarImagen");
        this.formulario.btnAgregarImagen.addActionListener(this);
        this.formulario.btnConsultar.setActionCommand("btnConsultar");
        this.formulario.btnConsultar.addActionListener(this);
        this.formulario.btnGuardar.setActionCommand("btnGuardar");
        this.formulario.btnGuardar.addActionListener(this);
        //Aqui se agregan todos los componentes que va a interactuar
        //por ejemplo botones, tablas, jlist, etc.
    }

    //CONSTRUCTOR para inicializar los objetos
    public controlador(Form formulario) {
        this.formulario = formulario;
    }
Ese código lo vi en un ejemplo de internet y Form es una clase donde manejan la parte grafica
__________________
customsmf
Seo,tutoriales,decargas
  #4 (permalink)  
Antiguo 08/04/2016, 15:10
 
Fecha de Ingreso: enero-2013
Mensajes: 176
Antigüedad: 11 años, 11 meses
Puntos: 2
Respuesta: Duda sobre como implementar MVC ..El Controlador

Disculpen mi ignorancia soy nueva en MVC 4
Estoy comenzando a trabajar con esto y estoy utilizando Razor en .NET...

No se en que foro puedo preguntar esto?
__________________
Define tus intereses, se curioso, investiga, comete errores, aprende, practica, mejora, enseña y vuelve a comenzar....
  #5 (permalink)  
Antiguo 08/04/2016, 22:02
 
Fecha de Ingreso: marzo-2016
Ubicación: Chillan
Mensajes: 13
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Duda sobre como implementar MVC ..El Controlador

Mira aquí te dejo un ejemplo de un controlador

package Controlador;
import Vista.*;
import Modelo.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;

/**
*
* @author Rodolfo
*/
public class ControladorRegistro implements ActionListener{

Registros VistaR = new Registros();
RegistrosDao ModeloR = new RegistrosDao();


public ControladorRegistro (Registros vistar, RegistrosDao modelor){

this.VistaR = vistar;
this.ModeloR = modelor;

this.VistaR.btnSiguienteRe.addActionListener(this) ;
this.VistaR.JcAreaRe.addActionListener(this);

}



public void inicializarControlador(){}





@Override
public void actionPerformed(ActionEvent e){

if(e.getSource()== VistaR.btnSiguienteRe){
String Fecha = VistaR.txtFechaRe.getText();
String Codigo = VistaR.txtCodRe.getText();
String Revision = VistaR.txtRevRe.getText();


String rp = ModeloR.insertarRegistros(Fecha,Codigo,Revision);
if(rp!=null){
JOptionPane.showMessageDialog(null,rp);

}else {
JOptionPane.showMessageDialog(null,"Error MySQL: " + e);
}

switch (VistaR.JcAreaRe.getSelectedItem().toString()) {
case "Manual Sistema de Gestion":

ManualesSistemaGestion re = new ManualesSistemaGestion();
ManualesDao mdao = new ManualesDao();
ControladorManuales cm = new ControladorManuales(re, mdao);
re.txtAreaMa.setText(VistaR.JcAreaRe.getSelectedIt em().toString());

re.setVisible(true);
re.setLocationRelativeTo(null);
this.VistaR.dispose();

break;
case "Procedimentos Operacionales Estanderizados de Sanitizacion (SSOP)":


ProceOperSSOP pro = new ProceOperSSOP();
ProcesoSSOPDao pr = new ProcesoSSOPDao();
ControladorSSOP cr = new ControladorSSOP(pro, pr);
pro.txtAreaSSOp.setText(VistaR.JcAreaRe.getSelecte dItem().toString());

pro.setVisible(true);
pro.setLocationRelativeTo(null);
this.VistaR.dispose();
break;
}

}


}

El modelo que tienes esta bien y en vistas solo tienes que poner los botones y jtexbox como públicos para que puedas ocuparlos en el controlador

Etiquetas: clase, controlador, implementar, jar, mvc, netbeans, programa, string
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 19:41.