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 chespring-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à:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>it.javaboss</groupId> <artifactId>spring-boot-mvc</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>1.8</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Tomcat for JSP rendering --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Controller public class HelloController { @GetMapping("/") public String index() { return "index"; } @PostMapping("/hello") public String sayhello(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); return "hello"; } } |
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
:
1 2 3 |
spring.mvc.view.prefix = /WEB-INF/views/ spring.mvc.view.suffix = .jsp spring.mvc.static-path-pattern = /resources/** |
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.
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 27 28 |
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <!-- Static content --> <link rel="stylesheet" href="/resources/css/style.css"> <script type="text/javascript" src="/resources/js/app.js"></script> <title>Java Boss</title> </head> <body> <h1>Java Boss: Spring Boot - MVC web application</h1> <hr> <div class="form"> <form action="hello" method="post" onsubmit="return validate()"> <table> <tr> <td>Enter Your name</td> <td><input id="name" name="name"></td> <td><input type="submit" value="Submit"></td> </tr> </table> </form> </div> </body> </html> |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Java Boss</title> </head> <body> <h1>Java Boss: Spring Boot - MVC web application</h1> <hr> <h2>Hello ${name}</h2> </body> </html> |
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.
1 2 3 4 5 6 |
@SpringBootApplication public class MainApp { public static void main(String[] args) { SpringApplication.run(MainApp.class, args); } } |
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:
1 |
o.s.web.servlet.PageNotFound: No mapping found for HTTP request with URI [/WEB-INF/views/index.jsp] in DispatcherServlet with name 'dispatcherServlet' |
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
:
1 2 3 4 |
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> |
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.