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
?
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>
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
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.
- 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.
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
Si vous souhaitez utiliser JSP
avec Spring Boot, voici deux exemples:
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".