Implementare il design pattern MVC in Java con le servlet – 2a parte

JavaNell’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:

<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>

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:

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";
  }
}

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:

@Override
public void init() throws ServletException {
  super.init();
  controllers.put("index.do", new IndexController());
}

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