Primi Passi con Spring MVC (parte 1)

Spring MVC è una delle componenti più utilizzati, dopo Spring Core, dei tanti progetti Spring. Rispetto alla soluzione Java Server Faces, che ricordiamo è uno standard J2EE, Spring MVC è molto più simile alla tecnologia java Servlet.

La principale critica rivolta alle specifica JSF, infatti, è che introduce una eccessiva astrazione nascondendo concetti di base che è bene conoscere. Vedremo invece che Spring MVC sfrutta tali concetti senza nasconderli, al punto che passare dalla tecnologia java Servlet a Spring MVC è una operazione praticamente indolore.

Per tale motivo parliamo di Spring MVC introducendo innanzitutto una soluzione basata su servlet per poi tradurla in una soluzione Spring MVC.

Web Application e Servlet

Secondo Wikipedia una Web Application è genericamente una qualsiasi applicazione web-based. L’ingegnere del software sa che dietro questa definizione c’è un numero di altri concetti e tecnologie che vanno dal protocollo HTTP, ai concetti di Request e Response, a quelli di GET e POST, etc. Nell’ambito java dietro il termine Web Application ci sono principalmente due tecnologie, ovvero le Servlet e le JSP.

Vediamo come realizzare una semplice applicazione web con tali tecnologie, considerando il semplice caso di una form per l’esecuzione del login utente. Innanzitutto abbiamo bisogno di due pagine: una login page ed una welcome page.

Il codice JSP per il rendering delle due pagine è mostrato di seguito.

login.jsp welcome.jsp
 

Per gestire il processo di login abbiamo bisogno di due componenti: una servlet che riceve i campi della form di login e li elabora e di un servizio che a cui è delegato la verifica delle credenziali. Quest’ultimo sarà una semplice classe dummy che confronta username e password con dati hard-coded nel codice:

Login Servlet

Negli articoli Le Servlet Java (parte 1)Le Servlet Java (parte 2) abbiamo ampiamente discusso la tecnologia Java Servlet. Molto rapidamente introduciamo quindi la classe LoginServlet.java.

Notiamo innanzitutto che stiamo utilizzando la specifica 3.0 delle servlet in quanto sono presenti le annotation. Il container quindi registra la classe come servlet non perchè è dichiarata nel descrittore web.xml ma perchè è presente l’annotation @WebServlet. L’url a cui è associata è /login che è poi quello inserito nell’attributo action del tag form nella pagina login.jsp.

La classe inoltre implementa due metodi doGet() e doPost() che rispettivamente sono associati ad una richiesta di tipo GET associata all’url /login e ad una richiesta di tipo POST. Il processo di accesso alla nostra ipotetica applicazione avviene quindi nel seguente modo:

  1. L’utente inserisce nel browser l’url http://[IP]/login.do e prese invio.
  2. Il browser invia al server una richiesta di tipo GET all’url /login.do.
  3. Il servlet engine riconosce l’url come gestito dalla servlet LoginServlet.jsp ed invoca il metodo doGet().
  4. Tale metodo esegue semplicemente una redirect alla pagina login.jsp che viene renderizzata dal browser.
  5. L’utente popola la form e preme il pulsante invio.
  6. La form è configurata per invocare un metodo POST sull’url /login.do.
  7. Il servlet engine riconosce ancora la richiesta come gestita dalla servlet LoginServlet.jsp ma invoca, questa volta, il metodo doPost().
  8. Il metodo recupera le credenziali dall’oggetto HttpServletRequest e le verifica con il servizio implementato nella classe LoginService.java.
  9. Nel caso di credenziali corrette inserisce nome e password nell’oggetto HttpServletResponse e poi redireziona verso la pagina welcome.jsp.
  10. La pagina welcome.jsp mostra le credenziali referenziandole dai parametri ${name} e ${password}.
  11. Processo analogo accade nel caso in cui le credenziali siano errate con la sola differenza che si rimane nella pagina di login.

Configurazione Maven

Le dipendenze dell’applicazione sono gestite con Maven ma trattandosi di una soluzione standard la sola dipendenza necessaria è javaee-web-api che tra l’altro è provided in quanto già disponibile in nel servlet engine:

Naturalmente utilizziamo Maven anche per il build del progetto e soprattutto per il deploy per mezzo del plug-in tomcat7-maven-plugin che tra i vari goal ha il run che consente di avviare la web application in un tomcat engine embedded.

Codice Sorgente

Il codice sorgente completo e funzionante dell’applicazione è scaricabile qui login-servlet.