web-dev-qa-db-fra.com

Spring boot use resources templates folder with JSP templates instead of webapp folder?

J'ai lancé un projet Spring Boot MVC et j'ai réalisé qu'il y avait deux dossiers dans resources. L'un s'appelle templates et l'autre static. J'aime vraiment cette configuration de dossier.

Le problème est que j'utilise des modèles JSP pour mes vues. Je n'ai pas pu placer un .jsp modèle dans le dossier templates et l'a fait fonctionner. Ce que je devais faire était de créer un dossier webapp au même niveau que src et resources. Placer mes modèles JSP là-dedans, puis mes vues peuvent être trouvées.

De quoi ai-je besoin pour reconfigurer pour utiliser réellement mes modèles JSP dans le dossier templates qui se trouve dans resources?

17
xetra11

Selon la documentation Mavensrc/main/resources finira dans WEB-INF/classes pendant la GUERRE.

Cela fait l'affaire pour Spring Boot dans votre application.properties:

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

Si vous préférez la configuration Java, voici la voie à suivre:

@EnableWebMvc
@Configuration
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver jspViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/classes/templates/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

Mise à jour avec un exemple complet

Cet exemple était basé sur initialiseur de Spring (projet Gradle avec dépendance "Web"). Je viens d'ajouter apply plugin: 'war' au build.gradle, ajouté/modifié les fichiers ci-dessous, construit le projet avec gradle war et l'ai déployé sur mon serveur d'applications (Tomcat 8).

Voici l'arborescence de répertoires de cet exemple de projet:

\---src
    +---main
        +---Java
        |   \---com
        |       \---example
        |           \---demo
        |                   ApplicationConfiguration.Java
        |                   DemoApplication.Java
        |                   DemoController.Java
        |
        \---resources
            +---static
            \---templates
                    index.jsp

ApplicationConfiguration.Java: voir ci-dessus

DemoApplication.Java:

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

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

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

}

DemoController.Java:

@Controller
public class DemoController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }
}

index.jsp:

<html>
    <body>
        <h1>Hello World</h1>
    </body>
</html>
14
Franz Fellner

Informations officielles:

Gestion des ressources:

Les liens vers les ressources sont réécrits lors de l'exécution dans le modèle, grâce à un ResourceUrlEncodingFilter, configuré automatiquement pour Thymeleaf et FreeMarker. Vous devez déclarer manuellement ce filtre lorsque vous utilisez des JSP. source

Moteur de modèle pris en charge

En plus des services Web REST, vous pouvez également utiliser Spring MVC pour servir du contenu HTML dynamique. Spring MVC prend en charge une variété de technologies de création de modèles, notamment Thymeleaf, FreeMarker et JSP.

[...]

Les JSP doivent être évités si possible, il existe plusieurs limitations connues lors de leur utilisation avec des conteneurs de servlet intégrés.

[..]

Lorsque vous utilisez l'un de ces moteurs de modèles avec la configuration par défaut, vos modèles seront récupérés automatiquement dans src/main/resources/templates.

source

Limitations de Spring Boot JSP

  • Avec Tomcat, cela devrait fonctionner si vous utilisez un emballage de guerre, c'est-à-dire qu'une guerre exécutable fonctionnera et sera également déployable sur un standard
    conteneur (non limité à, mais incluant Tomcat).
  • Un fichier exécutable ne fonctionnera pas en raison d'un modèle de fichier codé en dur dans Tomcat.
  • Avec Jetty, cela devrait fonctionner si vous utilisez un emballage de guerre, c'est-à-dire qu'une guerre exécutable fonctionnera et sera également déployable sur n'importe quel conteneur standard.
  • Undertow ne prend pas en charge les JSP.
  • La création d'une page error.jsp personnalisée ne remplacera pas la vue par défaut pour la gestion des erreurs, des pages d'erreur personnalisées doivent être utilisées à la place.

source

Changement technique

Dites à la botte à ressort d'où charger le JSP files. Dans application.properties ensemble

spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp

source

Exemple de botte à ressort avec JSP

Si vous souhaitez utiliser JSP avec Spring Boot, voici deux exemples:

https://github.com/spring-projects/spring-boot/tree/v1.5.9.RELEASE/spring-boot-samples/spring-boot-sample-web-jsp

https://github.com/joakime/spring-boot-jsp-demo

6
oak

Pour résumer, aucune des réponses suggérées n'a fonctionné pour moi jusqu'à présent. Utilisation d'un projet de démarrage Spring boot vierge.

D'une manière ou d'une autre, quelque chose semble câblé à l'intérieur de Spring ou des servlets de sorte que JSP doit être dans /webapp (Ou un sous-dossier). Contrairement aux modèles thymeleaf par défaut qui sont recherchés dans /resources/templates.

J'ai essayé toutes sortes de changements, vraiment beaucoup de configurations différentes, mais je n'ai pas pu modifier ce comportement. Cela ne faisait que produire de la complexité et n'était plus en mesure de servir les JSP. Donc, en fin de compte, si vous utilisez des JSP, mettez-les simplement dans /webapp. Il fonctionne également en ajoutant la configuration zéro en utilisant un contrôleur comme:

@GetMapping("/foo") public String serveFoo() { return "relative-path-inside-webapp/foo.jsp"; }

Sur une autre note, par défaut, le dossier /webapp Sera également masqué dans Spring Toolsuite, vous devrez donc le configurer manuellement en tant que "dossier source".

2
dagnelies