Nell’articolo precedente abbiamo creato la base del nostro mini-framework MVC, ovvero la servlet DispatcherServlet e l’interfaccia Controller. In questo appuntamento vedremo quindi come configurare il sistema e come implementare le azioni.
Configurazione
Il nostro framework MVC, per esigenze “redazionali”, è molto più semplice dei sistemi più blasonati come Struts o Spring MVC, ha quindi una configurazione molto basilare e “cablata” nel codice.
Il primo passo è la modifica del file WEB-INF/web.xml, con l’aggiunta di queste righe:
[xml]<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>it.artera.webtut.mvc.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>[/xml]
Queste sezioni indicano alla web application che tutti i path che terminano con l’estensione .do saranno intercettati dalla nostra DispatcherServlet.
Un semplice controller
Il secondo passo è l’implementazione e la successiva configurazione dei Controller: ogni path definito nell’applicazione deve essere gestito da un’implementazione dell’interfaccia it.artera.webtut.mvc.Controller (cfr. articolo precedente). Il primo che realizzeremo sarà quello che gestisce la homepage, ecco i dettagli:
- path da utilizzare:
/index.do
- implementazione:
it.artera.webtut.mvc.IndexController
- view che verrà mostrata:
/WEB-INF/pages/index.jsp
- dati dinamici da mostrare nella view: una variabile now di tipo java.util.Date, contenente data e ora dell’elaborazione.
Ed ecco l’implementazione:
[java]package it.artera.webtut.mvc;
import java.util.Date;
import javax.servlet.http.*;
public class IndexController implements Controller {
public String action(HttpServletRequest request, HttpServletResponse response) {
request.setAttribute("now", new Date());
return "/WEB-INF/pages/index.jsp";
}
}[/java]
Da notare:
- la classe implementa l’interfaccia Controller, da noi definita;
- le variabili da mostrare nella view sono memorizzate nell’oggetto request;
- per decidere su quale pagina “atterrare” dopo l’elaborazione è sufficiente restituirne il path relativo all’uscita dal metodo action() In questo caso verrà servita la pagina /WEB-INF/pages/index.jsp;
- le pagine JSP vengono memorizzate sotto la directory /WEB-INF perché devono essere accessibili solamente tramite i controller, in questo modo si evitano problemi di sicurezza (ad es. utenti “maliziosi” che cercano di ottenere informazioni riservate aprendo URL a casaccio).
Inizializzazione di DispatcherServlet
In questa nostra implementazione cableremo direttamente nel codice della servlet la mappa dei controller; come già accennato framework più complessi (e più adatti ad applicazioni “reali”) utilizzano configurazioni più laboriose, ma il concetto di base è identico. L’unica modifica che faremo alla servlet sarà l’aggiunta del metodo init(), sovrascrivendo l’implementazione di base (vuota) con la nostra. Aggiungiamo quindi questo codice all’interno di DispatcherServlet:
[java]@Override
public void init() throws ServletException {
super.init();
controllers.put("index.do", new IndexController());
}[/java]
In pratica ogni nuovo controller andrà aggiunto alla mappa (java.util.Map) memorizzata nella variabile controllers. Come intuibile la chiave rappresenta il path, mentre il valore memorizzato è un’istanza di IndexController.
Sviluppi
I pochi elementi realizzati fin qui rappresentano comunque un potente strumento per la realizzazione di applicazioni anche di una certa complessità, relativamente facili da estendere e sicuramente più manutenibili rispetto ad una soluzione a “pagine singole”, come si usava nel paleolitico delle web application (ma che ancora oggi, purtroppo, qualcuno ancora si ostina a proporre… sic!).
Linkografia
- Model-View-Controller;
- Apache Struts il framework che ha portato a notorietà il design pattern MVC per le web application Java;
- Spring MVC, l’implementazione di Spring di MVC.