Servire Pagine JSP con Spring Boot e Spring MVC

In questo articolo mostriamo come sia possibile realizzare una web application Spring MVC  utilizzando Spring Boot, come fatto nel caso di JSF nell’articolo Integrazione JSF e Spring Boot. In questo caso però utilizzeremo semplici pagine JSP e vedremo configurare l’applicazione per la loro renderizzazione. Iniziamo quindi creando un’applicazione Maven ed inserendo le dipendenze necessarie.

Dipendenze

Trattandosi principalmente di un’applicazione Spring Boot dobbiamo inserire nel pom.xml la dipendenza verso il parent project spring-boot-starter-parent. Le uniche altre due dipendenze necessarie sono:

  • spring-boot-starter-web: dipendenza principale per la creazione di applicazioni web con spring boot, inclusi servizi RESTful, ed applicazioni Spring MVC. Utilizza Tomcat come contenitore incorporato predefinito.
  • tomcat-embed-jasper: componente core di Tomcat utilizzata per il rendering delle pagine JSP. Si noti che spring-boot-starter-web include la dipendenza incorporata verso Tomcat ma non include la dipendenza verso Jasper, che è l’engine che interpreta le pagine JSP.

In conclusione l’aspetto del file pom.xml sarà:

Controller e ViewResolver

L’applicazione che vogliamo realizzare è il classico Hello World che si compone di due pagine web, una per l’inserimento del proprio nome e una secondo per visualizzare il messaggio di hello. Per restituire al browser le due pagine abbiamo bisogno di un controller, come meglio spiegato nell’articolo Primi Passi con Spring MVC (parte 2). Introduciamo quindi la classe HelloController che avrà il seguente aspetto:

La classe presenta due megoti. Il metodo index() che è invocato a seguito di una request di tipo GET all’url /, ed il metodo sayHello() che è associata ad una POST eseguita sulla url /hello. I due metodi restituiscono rispettivamente le stringe index ed hello che rappresentano le viste associate alle due request.

La traduzione di tali stringhe nelle rispettive viste index.jsp ed hello.jsp avviene per mezzo dell’interfaccia Spring MVC VierResolver ed in particolare della sua implementazione di default InternalResourceViewResolver che le mappa in file presenti nella cartella WEB-INF della web application. Per la configurazione del resolver è sufficiente utilizzare il file application.properties, posizionato nella cartelle src/main/resources, che è letto da Spring Boot allo startup e le cui proprietà vengono inserite nello Spring Environment:

Come descritto nell’articolo Primi Passi con Spring MVC (parte 2) le prime due proprietà sono rispettivamente un prefisso ed un suffisso che viene aggiunto al nome della view restituito dal controller. Conseguentemente le stringe index ed hello sono risolte rispettivamente nelle viste /WEB-INF/views/index.jsp e  /WEB-INF/views/hello.jsp.

L’ultima proprietà, spring.mvc.static-path-pattern, indica la posizione di tutte le risorse statiche utilizzate dalle viste: css, codice javascript, immagini, etc. Per default le risorse statiche servite da Spring Boot devono essere inserite all’interno della directory /static, conseguentemente tali risorse dovranno essere inserite nella cartella src/main/resources/static del progetto.

Le Viste

Come anticipato abbiamo bisogno di due viste che andremo ad inserire nella cartella /src/main/webapp/. La prima è la index.jsp che semplicemente visualizza una form per l’inserimento del nome del visitatore.

Si noti che la vista utilizza due risorse statiche: il file style.css ed il file app.js. Come detto precedentemente tali file dovranno essere inseriti rispettivamente nelle cartelle  src/main/resources/static/css e src/main/resources/static/js. Il loro contenuto è il seguente:

app.js style.css

Infine la vista hello.jsp, che visualizza il messaggio di benvenuto al visitatore, sarà la seguente:

Struttura delle cartelle

Ai fini di una maggiore comprensione di quanto detto riporto la struttura delle cartelle del progetto.

Main Class

Per avviare l’applicazione Spring MVC utilizzando Spring Boot, creiamo la solita classe principale  di avvio annotata con l’annotazione @SpringBootApplication come segue.

Avvio

Per l’avvio della web application è sufficiente eseguire la classe MainApp.java come Java Application, ad esempio aprendo il menù contestuale di Eclipse col tasto destro del mouse e selezionando Run As->Java Application. Oppure è possibile eseguire il task maven spring-boot:run. Al termine del bootstrap aprire il browser all’url http://localhost:8080.

Un Possibile Problema

Un problema che ho riscontrato durante lo sviluppo dell’esempio è l’eccezione:

Questo errore è dovuto al fatto che la DispatcherServlet di Spring MVC interviene cercando un handler per l’url /WEB-INF/views/index.jsp che è restituito dal resolver InternalResourceViewResolver a seguito dell’esecuzione del metodo index() del controller HelloController. Ovviamente non è la servlet di Spring MVC che deve gestire tale url ma tomcat. Il problema può quindi essere dovuto al fatto che non è stata inserita la dipendenza ad Apache Tomcat Embedded nel pom.xml:

Oppure, se la dipendenza è presente, maven non l’ha scaricata correttamente. In questo ultimo caso semplicemente cancellate il folder relativo dal repository maven e compilate nuovamente l’applicazione.

Codice Sorgente

Il codice sorgente completo e funzionante dell’applicazione è scaricabile qui spring-boot-mvc.