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:
1 2 3 4 5 6 |
public class LoginService { public boolean validateUser(String user, String password) { return user.equalsIgnoreCase("javaboss") && password.equals("dummy"); } } |
Login Servlet
Negli articoli Le Servlet Java (parte 1) e Le Servlet Java (parte 2) abbiamo ampiamente discusso la tecnologia Java Servlet. Molto rapidamente introduciamo quindi la classe LoginServlet.java
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
@WebServlet(urlPatterns = "/login") public class LoginServlet extends HttpServlet { private LoginService service = new LoginService(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String name = request.getParameter("name"); String password = request.getParameter("password"); boolean isValidUser = service.validateUser(name, password); if (isValidUser) { request.setAttribute("name", name); request.setAttribute("password", password); request.getRequestDispatcher("/WEB-INF/views/welcome.jsp").forward(request, response); } else { request.setAttribute("errorMessage", "Invalid Credentials!!"); request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response); } } } |
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:
- L’utente inserisce nel browser l’url
http://[IP]/login.do
e prese invio. - Il browser invia al server una richiesta di tipo
GET
all’url/login.do
. - Il servlet engine riconosce l’url come gestito dalla servlet
LoginServlet.jsp
ed invoca il metododoGet()
. - Tale metodo esegue semplicemente una redirect alla pagina login.jsp che viene renderizzata dal browser.
- L’utente popola la form e preme il pulsante invio.
- La form è configurata per invocare un metodo
POST
sull’url/login.do
. - Il servlet engine riconosce ancora la richiesta come gestita dalla servlet
LoginServlet.jsp
ma invoca, questa volta, il metododoPost()
. - Il metodo recupera le credenziali dall’oggetto
HttpServletRequest
e le verifica con il servizio implementato nella classeLoginService.java
. - Nel caso di credenziali corrette inserisce
nome
epassword
nell’oggettoHttpServletResponse
e poi redireziona verso la paginawelcome.jsp
. - La pagina
welcome.jsp
mostra le credenziali referenziandole dai parametri${name}
e${password}
. - 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:
1 2 3 4 5 6 |
<dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> |
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.