web-dev-qa-db-fra.com

Le fichier JSP ne s'affiche pas dans l'application Web Spring Boot

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
47
Nick Spacek

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.

90
Nick Spacek

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>
21
Sezin Karli

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!

13
JaySon

Travaillé pour moi aussi, mais je devais enlever

<scope>provided</scope>

<dependency>
  <groupId>org.Apache.Tomcat.embed</groupId>
  <artifactId>Tomcat-embed-jasper</artifactId>
</dependency>
11
Dan

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'
9

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

Intégration Spring Boot et JSP

5
jeet singh parmar

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;
    }
}

from: Pourquoi Spring MVC répond-il par un message 404 et signale-t-il "Aucun mappage trouvé pour la requête HTTP avec l'URI [...] dans DispatcherServlet"?

2
RoutesMaps.com

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>
2
Niamat Zawad

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;
    }

}
1
John Tribe

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>
1
Sandeep Kumar

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";
    }
}
1
Surasin Tancharoen

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é.

 enter image description here

Ma solution:

  1. Déplacez index.jsp dans un sous-dossier appelé views.

     enter image description here

  2. 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>
    
  3. 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>
    
  4. 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.

     enter image description here

    package com.app.controller;
    
    @Controller
    @RequestMapping(value = "/")
    public class RootController {
    
        @RequestMapping(method = RequestMethod.GET)
        public ModelAndView homeGet() {
    
            return new ModelAndView("index", "message", "IT WORKS!!!");
        }
    
    }
    
  5. La syntaxe new ModelAndView("index", "message", "IT WORKS!!!") signifie que
    • dispatcher-servlet cherche un fichier appelé "/WEB-INF/views/" + "index" + ".jsp".
    • Il compile le fichier jsp en remplaçant toutes les instances de ${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>
  1. Chargez le projet sur votre serveur Tomcat, démarrez-le et accédez à http://localhost:8080/[project name]/.

     enter image description here

0
Cameron Hudson

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 { ...}

0
Aarish Ramesh
<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>
0
Devendra Singraul

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>
0
VNT