By default, where does Spring Boot expect views to be stored?

If you found this article and you are returning

return "home.jsp";

instead of just "home". Then you must remove

spring.mvc.view.suffix=.jsp

Otherwise remove .jsp from home and keep the suffix!


The Solution

I found the answer via trial-and-error, which turned out rather annoying. I hope someone can correct me if this conclusion is wrong, but it appears that Spring Boot does not like the string WEB-INF. I renamed the WEB-INF directory to view and changed the application.properties to the following and the view loaded successfully.

spring.mvc.view.prefix=/view/
spring.mvc.view.suffix=.jsp

Additional Findings

The objective of this exercise was to create a working example of a minimal, Java-based configuration so I continued minimalising the setup. I then found that lots of advice dished out on multiple SO threads and forums did not help. @JBNizet provided a link in his comment to the Spring Boot docs which lists a very salient point that no one has mentioned: JSPs simply do not play well with Spring Boot as it has limitations depending on the embedded container chosen. With that in mind, I decided to try replacing JSPs with ThymeLeaf templates.

My new working config removes the need for these:

  • No need to add application.properties: spring.mvc.view.prefix + spring.mvc.view.suffix
  • No need to change the packaging type from jar to war
  • No need to modify main class
  • No need to add pom.xml dependencies for
    • org.springframework.boot / spring-boot-starter-tomcat
    • org.springframework.boot / tomcat-embed-jasper
    • javax.servlet / jstl

So just the default Spring Boot template and 2 ThymeLeaf dependencies with the views named as ViewName.html placed in src/main/resources/templates.

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
</dependency>

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring4</artifactId>
</dependency>

Without any configuration Spring Boot expects the views to be stored inside /webapp, the view page may be of any format depends on application.properties settings(like html or jsp) to set .jsp as view page at /views/ folder

spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp //for .html change it to .html

and you have to use tomcat jaspher , if you don't include it the page will not be parsed instead it gets downloaded as a file

spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp