J'ai une application Web Spring Boot opérationnelle à l'aide de Tomcat intégré (par défaut). Lorsque les fichiers JSP sont utilisés dans le cadre du rendu de la vue spécifiée dans mon contrôleur, les fichiers JSP ne sont pas rendus en tant que tels et affichent plutôt le contenu. Par exemple:
index.jsp
<%@ page language="Java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>Test</body>
</html>
Lorsque la vue est rendue dans les navigateurs, le contenu ci-dessus est affiché au lieu du contenu attendu:
Test
Assurez-vous que votre pom.xml
spécifie la dépendance Tomcat JSP comme suit:
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
Il semble que Tomcat intégré considère le rendu JSP comme une option.
Comme mentionné ci-dessous, ce fichier JAR est parfois nécessaire également:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<scope>provided</scope>
</dependency>
(J'ai ajouté fourni puisque ce fichier JAR devrait être inclus par le conteneur de servlet.
Vous aurez besoin non pas d’une mais de deux dépendances (jasper et jstl) dans votre pom.xml
pour que cela fonctionne.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
</dependencies>
Pour moi a travaillé le même comme Dan mentionné. Retrait du fourni scope.
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
Merci les gars!
Travaillé pour moi aussi, mais je devais enlever
<scope>provided</scope>
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
</dependency>
Mieux vaut utiliser Gradle (qui rattrape Maven). Utilisez cette dépendance dans le fichier build.gradle.
// Dépendance requise pour JSP
providedRuntime 'org.Apache.Tomcat.embed:Tomcat-embed-jasper'
Je pense que vous avez oublié une configuration, car il est facile d’intégrer JSP en suivant simplement les étapes ci-dessous.
1 - Dépendance Tomcat-embad-jasper
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
2 - La configuration ci-dessous est application.properties
spring.mvc.view.prefix: /
spring.mvc.view.suffix: .jsp
C'est encore avoir un doute alors vérifiez-le ci-dessous lien
J'ai résolu mon problème quand en plus de décrit avant:
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
added ViewResolver:
@Configuration
@ComponentScan
@EnableWebMvc
public class SpringServletConfig {
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
}
Il suffit de changer la dépendance
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
à
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
</dependency>
Configuration complète du logiciel Spring-Boot avec Spring-MVC et avec le serveur Tomcat intégré:
build.gradle
buildscript {
ext {
springBootVersion = '1.5.8.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'Java'
apply plugin: 'org.springframework.boot'
//WEB-MVC
compile 'org.springframework.boot:spring-boot-starter-web:1.5.8.RELEASE'
compile 'org.Apache.Tomcat.embed:Tomcat-embed-jasper:9.0.1'
compile 'javax.servlet:jstl:1.2'
App.class
@SpringBootApplication
public final class App {
public static void main(final String[] args) {
new SpringApplicationBuilder(App.class)
.build(args)
.run();
}
@Bean
public ViewResolver viewResolver() {
final InternalResourceViewResolver r = new InternalResourceViewResolver();
r.setPrefix("/WEB-INF/jsp/");
r.setSuffix(".jsp");
return r;
}
}
Parfois, Tomcat-embed-jasper n’est pas disponible, il est donc nécessaire de le supprimer de la dépendance maven de Tomcat-embed-jasper.
par exemple.
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
<!--scope>provided</scope-->
</dependency>
Si vous voulez utiliser 1.5.8.RELEASE ou similaire, alors, un exemple exécutable et son explication se trouvent ici https://www.surasint.com/spring-boot-jsp/
Vous avez juste besoin de cela dans pom.xml
http: //maven.Apache.org/xsd/maven-4.0.0.xsd "> 4.0.0 __ org. parent 1.5.8.LELEASE
<groupId>com.surasint.example</groupId>
<artifactId>spring-boot-02</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JSP -->
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!-- jstl for jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Et cela dans application.properties
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
Ensuite, vous gardez votre jsp dans le dossier/WEB-INF/jsp /.
Ceci est le contrôleur.
package com.surasint.example.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import Java.util.Date;
import Java.util.Map;
@Controller
public class TestController {
@GetMapping("/testjsp")
public String list(Map<String, Object> model) {
model.put("this_time",new Date().toString());
return "testjsp-view";
}
}
J'ai eu ce problème et finalement résolu!
Mon problème était que j'avais mis le code JSP dans ma page /WEB-INF/index.jsp
. Cependant, cette page est servie directement, sans être traitée par aucun servlet ou contrôleur. Par conséquent, il n'avait aucune chance d'être compilé.
Ma solution:
Déplacez index.jsp
dans un sous-dossier appelé views
.
Editez web.xml
pour qu'il passe le contrôle du répertoire racine au servlet de répartition.
<!-- WEB-INF/web.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<display-name>18-655_lab_1</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Modifiez dispatcher-servlet.xml
pour vous assurer qu'il recherche dans le répertoire views
les fichiers se terminant par .jsp
.
<!-- WEB-INF/dispatcher-servlet.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven />
<context:component-scan
base-package="com.app.controller" />
<mvc:default-servlet-handler />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
En utilisant le même chemin base-package
que celui spécifié dans dispatcher-servlet.xml
, créez un contrôleur qui renverra un ModelAndView.
package com.app.controller;
@Controller
@RequestMapping(value = "/")
public class RootController {
@RequestMapping(method = RequestMethod.GET)
public ModelAndView homeGet() {
return new ModelAndView("index", "message", "IT WORKS!!!");
}
}
new ModelAndView("index", "message", "IT WORKS!!!")
signifie que dispatcher-servlet
cherche un fichier appelé "/WEB-INF/views/" + "index" + ".jsp"
.${message}
par IT WORKS!!!
.Par conséquent, la dernière chose à faire est de placer ${message}
quelque part dans notre fichier index.jsp
.
<%@ page language="Java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>${message}</h1>
</body>
</html>
La raison en est que vous utilisez l'annotation @RestController au lieu de @Controller
Lorsque vous annotez une classe avec RestController, toutes les méthodes annotées avec @RequestMapping supposent la sémantique @ResponseBody par défaut. En d'autres termes, votre méthode #index sérialise le String /webapp/WEB-INF/index.jsp au format JSON, au lieu de mapper sa valeur sur une vue.
Comme mentionné dans l'une des réponses, il doit être
@Controller Public class YourController { ...}
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherSe rvlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
I took the * off so it was just from web.xml
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherSe rvlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
J'ai fait face au problème comme imprimé le nom du fichier jsp dans le navigateur au lieu de son contenu.
En ajoutant l'extrait de code ci-dessous pour le rendu de la page jsp dans pom.xml, le rendu est correct.
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
</dependency>