2013-12-16 3 views
41

У меня есть веб-приложение Spring Boot и работает с использованием встроенного Tomcat (по умолчанию). Когда он обслуживает файлы JSP как часть рендеринга представления, указанного в моем контроллере, JSP не отображаются как таковые и вместо этого распечатывают содержимое. Например:JSP-файл не отображается в веб-приложении Spring Boot

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> 

Когда представление отображается в браузерах, приведенные выше данные отображаются, вместо ожидаемого содержания:

Test 

ответ

80

Убедитесь, что в вашем указаны зависимости от Tomcat JSP следующим образом:

<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-jasper</artifactId> 
    <scope>provided</scope> 
</dependency> 

Кажется, что встроенный Tomcat рассматривает рендеринг JSP как необязательный.

Как упомянуто ниже, этот JAR иногда необходимо, а также:.

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

(я добавил при условии, поскольку это JAR должны быть включены в контейнер сервлетов

+3

Вы только что сделал мой день! Это помогло мне, хотя моя проблема была немного иной - Spring даже не обнаружил ** мои .jsp-файлы в '/ src/main/resources/webapp/WEB-INF/pages'. Спасибо огромное! –

+0

Имел тот же вопрос, что и Адрей, он продолжал жаловаться на круговые зависимости, пока я не добавил банку. –

+0

Это только не сработает. Servlet 3.0 ожидает, что jsp будет включен в папку META-INF. См. Пример приложения https://github.com/kamoor/spring-boot-sample – kamoor

18

Вам понадобится не один, а два зависимостей (яшма и JSTL) в вашем pom.xml для этой работы.

<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> 
8

Лучше вы можете использовать Gradle (который догоняет над Maven). используйте эту зависимость в build.gradle файл.

// Требуемая зависимость для JSP

providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper' 
9

Работал для меня тоже, но я должен был удалить

<scope>provided</scope> 

<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-jasper</artifactId> 
</dependency> 
7

Для меня работал тот же, как Дэн упомянул. Снятие предоставлено.

<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-jasper</artifactId> 
</dependency> 

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

Спасибо, парень!

1

я решил мою проблему, когда в дополнение к описанным выше:

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

от: Why does Spring MVC respond with a 404 and report "No mapping found for HTTP request with URI [...] in DispatcherServlet"?

+0

, где мне нужно добавить метод reolver ?? я думаю, что это должно быть в классе, который простирается WebMvcConfigurationSupport, я прав –

+1

Да Или в классе с тем же значением аннотаций:. Конфигурация и EnableWebMvc Я обновил пример в моем ответе на этот случай –

0

Я встал вопрос, как напечатанной имя JSP файла в браузере а не его содержимое.

Добавив нижеприведенный фрагмент для рендеринга страницы jsp в pom.xml, он отображается правильно.

<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-jasper</artifactId> 
</dependency> 
+0

@ Crimean.us - Springboot не нуждается в явной конфигурации, например, в вашем представлении. Тогда какая разница между весной MVC и загрузкой? – VNT

2

Я думаю, что вы пропустили некоторые конфигурации, потому что легко интегрировать JSP просто следовать ниже шаги

1 - кот-embad-яшма зависимость

<dependency> 
     <groupId>org.apache.tomcat.embed</groupId> 
     <artifactId>tomcat-embed-jasper</artifactId> 
     <scope>provided</scope> 
</dependency> 

2 - Добавление ниже конфигурации приложения .properties

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

Это все еще есть некоторые сомнения, а затем проверить i т ниже ссылку

Spring Boot and JSP Integration

1

Просто измените зависимость

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

Полный Gradle установки для Spring-Boot с Spring-MVC и с встроенным сервером Tomcat:

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

} 
0

Иногда кот-встраивать-яшма не доступны, так нужно удалить при условии, от Maven зависимости от TOMCAT-встраивать-яшмы.

например.

<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-jasper</artifactId> 
    <!--scope>provided</scope--> 
</dependency> 
0

Если вы хотите использовать 1.5.8.RELEASE или подобное, то, runable пример и его объяснение здесь https://www.surasint.com/spring-boot-jsp/

Вам просто нужно это в pom.xml

HTTP: //maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0 org.springframework.boot весна-загрузки-стартер-родитель 1.5.8.RELEASE

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

И это в application.properties

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

Тогда вы держите JSP в/WEB-INF/JSP/папки.

Это контроллер.

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"; 
    } 
} 
Смежные вопросы