web-dev-qa-db-fra.com

Par défaut, où Spring Boot s'attend-il à ce que les vues soient stockées?

J'expérimente sur la réécriture de mon projet Vanilla Spring MVC à configuration lourde à l'aide de Spring Boot. J'ai démarré un tout nouveau projet Spring Boot dans IntelliJ à l'aide de Spring Boot Initiaizer et je suis sur la voie d'une configuration minimale basée sur Java. De nombreux tutoriels indiquent que la classe principale générée par défaut est suffisante et que @SpringBootApplication a tout inclus. Un exemple de contrôleur REST fonctionnait et renvoyait un objet sérialisé au format JSON, mais il semble difficile d'obtenir une vue. Ma structure est la suivante, avec tous les éléments par défaut autres que le répertoire webapps que j'ai créé.

src
`-main
   `-Java
   `-resources
     `-static
     `-templates
   `-webapp
     `-WEB-INF
        `-home.jsp

Le contrôleur est simple.

@Controller
public class ViewMaster {
    @RequestMapping("/home")
    public String home() {
        return "home";
    }
}

En l'absence de configuration, j'aimerais savoir où Spring Boot s'attend à ce que les vues soient stockées et avec quelle extension (html?). J'ai également essayé d'inclure les éléments suivants dans application.properties mais j'obtiens toujours une erreur 404. Déplacer le répertoire WEB-INF ou simplement le fichier html dans les ressources n'a pas aidé non plus.

spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

J'ai également essayé d'inclure ces dépendances dans mon fichier pom.xml sans aucun effet.

<dependency>
    <groupId>org.Apache.Tomcat.embed</groupId>
    <artifactId>Tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

Je dois manquer quelque chose de douloureusement évident ici alors appréciez si quelqu'un peut le signaler!

14
tys

La solution

J'ai trouvé la réponse par essais et erreurs, ce qui s'est avéré plutôt ennuyeux. J'espère que quelqu'un pourra me corriger si cette conclusion est fausse, mais il semble que Spring Boot n'aime pas la chaîne WEB-INF. J'ai renommé le répertoire WEB-INF en view et changé le application.properties en suivant et l'affichage a été chargé avec succès.

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

Constatations supplémentaires

L'objectif de cet exercice était de créer un exemple de travail d'une configuration basée sur Java minimal afin que je continue à minimiser la configuration. J'ai ensuite constaté que de nombreux conseils donnés sur plusieurs SO discussions et forums ne permettaient pas de résoudre le problème. @JBNizet a fourni un lien dans son commentaire vers la documentation de Spring Boot qui répertorie un point très important que personne n'a mentionné: JSP ne fonctionnent tout simplement pas bien avec Spring Boot car il présente des limitations en fonction du conteneur incorporé choisi. Dans cet esprit, j'ai décidé d'essayer de remplacer les JSP par des modèles ThymeLeaf.

Ma nouvelle configuration de travail supprime le besoin de:

  • Pas besoin d'ajouter application.properties: spring.mvc.view.prefix + spring.mvc.view.suffix
  • Pas besoin de changer le type de packaging de jar à war
  • Pas besoin de modifier la classe principale
  • Inutile d'ajouter des dépendances pom.xml pour
    • org.springframework.boot / spring-boot-starter-Tomcat
    • org.springframework.boot / Tomcat-embed-jasper
    • javax.servlet / jstl

Il suffit donc du modèle Spring Boot par défaut et de 2 dépendances ThymeLeaf avec les vues nommées ViewName.html placées dans src/main/resources/templates.

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

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

Sans aucune configuration, Spring Boot s'attend à ce que les vues soient stockées dans/webapp, la page d'affichage peut avoir n'importe quel format qui dépend des paramètres application.properties (tels que html ou jsp). 

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

et vous devez utiliser Tomcat jaspher. Si vous ne l'incluez pas, la page ne sera pas analysée. Elle sera téléchargée sous forme de fichier.

spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp
4
Jasbin karki

La première chose à faire est d’insérer la dépendance dans pour pom comme ci-dessous

<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-Tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.Apache.Tomcat.embed</groupId>
            <artifactId>Tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

Avec cette dépendance, vous dites au printemps que les dépendances Tomcat intégrées sont fournies et que cela a pour effet que votre application Spring n'a pas la dépendance Tomcat à l'intérieur du bocal.

La seconde pense que vous avez à faire, est de changer les processus de pakaging dans votre pon de jarre à guerre comme ci-dessous

<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">
...
    <packaging>war</packaging>
    ....
</project>

La troisième et dernière pense que vous avez à faire est de refactoriser le startrer standard Application Boot comme ci-dessous

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

pour votre configuration dans les propriétés de l’application peut être correct mais je vous suggère de placer votre jsp dans un dossier spécifique puis de refactoriser votre configuration pour pointer vers le nouveau chemin, et pas seulement sous WEB-INF mais c’est juste un conseil.

J'espère que cela peut vous aider.

1
Valerio Vaudi

tys, pls essaient d’ajouter une dépendance:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-Tomcat</artifactId>
    <scope>provided</scope>
</dependency>

Référence: https://github.com/lenicliu/examples/tree/master/examples-spring-boot/examples-spring-boot-jsp

spring.mvc.view.prefix est un chemin relatif du dossier webapp, et vous pouvez y placer des fichiers jsp.

0
lenicliu

application.properties

Retirer:

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

Ajouter:

spring.thymeleaf.prefix= /WEB-INF/views/
spring.thymeleaf.suffix= .html

pom.xml

Supprimer la dépendance de jaspe:

<dependency>
    <groupId>org.Apache.Tomcat.embed</groupId>
    <artifactId>Tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

Ajouter la dépendance thymeleaf:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Détails: Utiliser thymeleaf au lieu de jsp

0
Hassan Tareq