Lecture: https://elearning.unimib.it/mod/kalvidres/view.php?id=1152364
Il Model-View-Controller (MVC) è un pattern architetturale molto diffuso nello sviluppo di sistemi software, in particolare nell’ambito della programmazione orientata agli oggetti e in applicazioni web, in grado di separare la logica di presentazione dei dati dalla logica di business. Partiamo analizzando il pattern architetturale:
Dove con le frecce piene si hanno le invocazioni di metodi e con quelle tratteggiate gli eventi. Analizzando meglio le tre componenti si ha che:
La View raccoglie gli input dell’utente e li inoltra al Controller, che li mappa in operazioni sul Model, che viene modificato. A questo punto il Controller seleziona la nuova View da mostare all’utente, che a sua volta interagisce per avere i dati con il Model. Cambi del model sono notificati alla View per eventuali cambiamenti dei dati.
[ripasso di concetti utili, da pp.84 a 88]
Dal punto di vista del Controller Design si hanno vari design pattern:
Page Controller, che si occupa di controllare i parametri delle richieste (tipo una POST
) e richiamare la business logic sulla base della richiesta, di selezionare la view successiva da mostrare e di preparare i dati per la presentazione. Si ha il seguente flusso di controllo:
Dal punto di vista implementativo si possono usare soluzioni con poca logica di controllo (ASP, JSP, PHP, ecc…), con una forte logica di controllo (CGI script, serverlet, ecc…). Con questo pattern si implementa un controller per ciascuna “pagina”, avendo, per la scalabilità, la crescita finita del controller proporzionale al numero di “pagine” necessarie, producendo un numero comunque finito e gestibile di file di codice piccoli.
Page controller, con una semplice implementazione con due controller (uno per la matematica e uno per le stringhe), implementati come serverlet. Si nota anche il collegamento diretto tra la view e il model.
Front Controller che definisce un singolo componente che gestisce tutte le richieste, eseguendo le operazioni comuni a tutte le richieste (come autenticazione, questioni di sicurezza, tracciamento, ecc…) e poi esegue la specifica operazione che è stata richiesta, passando il parametro come parametro. Ogni comando è rappresentato da una classe, con un metodo che esegue il comando (ad esempio process
), interagendo con la logica applicativa per svolgere quanto deve. Vediamo quindi l’UML associato:
anche nel caso di un front controller si potrebbero avere più controller (ma solitamente se ne ha uno solo).
Cresce la gerarchia di comandi e non l’handler, avendo quindi controllo sulla scalabilità. Nel dettaglio l’handler:
mentre il concrete command:
Il front controller è più complesso del page controller. Inoltre evita la duplicazione del codice tra i vari Controller (avendo mediamente un solo front controller e avendo un entry point unico per tutte le richieste), permette una semplice configurazione del server avendo una sola serverlet, permette di gestire dinamicamente nuovi comandi e facilita l’estensione del Controller.
Si hanno framework dove la gerarchia dei comandi è gestita diversamente.
Intercepting Filter che è utile per gestire richieste e risposte prima che vengano servite. Viene spesso usato insieme al front controller per “decorare” richieste e risposte con funzioni aggiuntive, come autenticazione, logging, conversione dati, ecc…
Si ha quindi il seguente UML:
e il seguente comportamento:
Dal punto di vista implementativo il web server fornisce Filter Manager e Filter chain, dovendo quindi implementare e dichiarare solo il filter (o più di uno)
Application Controller usato in quanto all’aumentare della complessità del flusso, la gestione del flusso potrebbe essere concentrata in una classe. Solitamente viene usato dal page controller o dal front controller, secondo il seguente comportamento: