> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/ud8-persistencia-en-bases-de-datos/escenario-de-traballo/completando-a-aplicacion-con-mvc.md).

# Completando a aplicación con MVC

Imos a completar a aplicación creando unha vista que permita buscar os alumnos con ID a partir do que xa temos construido. Dita vista deberá de interactuar coa capa modelo mediante un controlador.

Omitimos deliberadamente a capa de servizo, debido a que se trata de unha aplicación puramente CRUD. Unha aplicación debe de implementarse incluindo todas as capas.

A idea será crear un VistaBuscadorAlumno que vai a ser un JFrame, que vai a contar co seguinte:

* Un JPanel superior que conta con un JLabel, un JTextField, e un JButton, que vai a permitir realizar as búsquedas. A organización mais adecuada sería mediante FlowLayout por ir en liña
* Un JPanel inferior que conta 3 pares de JLabel, un para o nome do campo e outra para o valor. Cada un de eses pares será para data, nome e apleidos. A organización mais adecuada sería mediante GridLayout(3,2)

O aspecto visual sería algo similar a isto:

<figure><img src="/files/zsbJYaj8dm8zukTegXvV" alt=""><figcaption></figcaption></figure>

En paralelo, imos a crear un controlador que cando fagamos click no botón buscar faga o seguinte:

* Recupere o texto indicado e o converta a numero. Asumimos que o valor que vamos a pasar e correcto e non precisa de ningunha validación.
* Realice a búsqueda de un alumno co ide recuperado do campo de texto, en base ao modelo previamente definido (DAO no noso caso)
* Se recupera un alumno, debe de pasarllo a vista para que o pinte da forma correspondente

```java
public class VistaBuscarAlumno extends JFrame {
    // Componentes superiores
    private JLabel lblId;
    private JTextField txtId;
    private JButton btnBuscar;
    private JPanel panelSuperior;

    // Etiquetas de resultados
    private JLabel lblNombre,lblNombreValor;
    private JLabel lblApellido,lblApellidoValor;
    private JLabel lblFecha,lblFechaValor;
    private JPanel panelInferior;

    public VistaBuscarAlumno(){
        setTitle("Buscar Alumno");
        setSize(400, 250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //PANEL SUPERIOR
        this.panelSuperior = new JPanel();
        this.panelSuperior.setLayout(new FlowLayout());
        this.lblId = new JLabel("ID:");
        this.txtId = new JTextField();
        this.txtId.setPreferredSize(new Dimension(200,40));
        this.btnBuscar = new JButton("Buscar");
        this.panelSuperior.add(this.lblId);
        this.panelSuperior.add(this.txtId);
        this.panelSuperior.add(this.btnBuscar);
        this.add(panelSuperior, BorderLayout.NORTH);

        //PANEL INFERIOR
        this.panelInferior = new JPanel();
        this.panelInferior.setLayout(new GridLayout(3,2));
        this.lblNombre = new JLabel("Nombre: ");
        this.lblNombreValor = new JLabel();
        this.panelInferior.add(lblNombre);
        this.panelInferior.add(lblNombreValor);
        this.lblApellido = new JLabel("Apellido: ");
        this.lblApellidoValor = new JLabel();
        this.panelInferior.add(lblApellido);
        this.panelInferior.add(lblApellidoValor);
        this.lblFecha = new JLabel("Fecha: ");
        this.lblFechaValor = new JLabel();
        this.panelInferior.add(lblFecha);
        this.panelInferior.add(lblFechaValor);;
        this.add(this.panelInferior);
        setVisible(true);
    }

    public JLabel getLblId() {
        return lblId;
    }

    public JTextField getTxtId() {
        return txtId;
    }

    public JButton getBtnBuscar() {
        return btnBuscar;
    }

    public JPanel getPanelSuperior() {
        return panelSuperior;
    }

    public JLabel getLblNombre() {
        return lblNombre;
    }

    public JLabel getLblNombreValor() {
        return lblNombreValor;
    }

    public JLabel getLblApellido() {
        return lblApellido;
    }

    public JLabel getLblApellidoValor() {
        return lblApellidoValor;
    }

    public JLabel getLblFecha() {
        return lblFecha;
    }

    public JLabel getLblFechaValor() {
        return lblFechaValor;
    }

    public JPanel getPanelInferior() {
        return panelInferior;
    }

    public void setAlumno(Alumno a){
        this.lblNombreValor.setText(a.getNombre());
        this.lblApellidoValor.setText(a.getApellido());
        this.lblFechaValor.setText(a.getFechaNac().toString());
    }
}

```

```java
public class ControladorBuscarAlumno {

    private VistaBuscarAlumno vista;
    private AlumnoDAOPrepStat modelo;

    public ControladorBuscarAlumno(VistaBuscarAlumno vista, AlumnoDAOPrepStat modelo) {
        this.vista = vista;
        this.modelo = modelo;

        this.vista.getBtnBuscar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int id = Integer.valueOf(vista.getTxtId().getText());
                Optional<Alumno> alumnoOptional = modelo.findById(id);
                if (alumnoOptional.isPresent()){
                    vista.setAlumno(alumnoOptional.get());
                }
            }
        });
    }
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://educacion.gitbook.io/programacion/ud8-persistencia-en-bases-de-datos/escenario-de-traballo/completando-a-aplicacion-con-mvc.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
