Вопрос:

Файл JSP не отображается в веб-приложении Spring Boot

spring-boot

61642 просмотра

17 ответа

3527 Репутация автора

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

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
Автор: Nick Spacek Источник Размещён: 16.12.2013 01:13

Ответы (17)


93 плюса

3527 Репутация автора

Решение

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

<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 должен быть включен в контейнер сервлета.

Автор: Nick Spacek Размещён: 16.12.2013 01:13

21 плюса

2177 Репутация автора

Для этого вам понадобится не одна, а две зависимости (jasper и 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>
Автор: Sezin Karli Размещён: 21.03.2014 07:35

10 плюса

2319 Репутация автора

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

// Обязательная зависимость для JSP

providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper'
Автор: Aravind Cheekkallur Размещён: 29.10.2014 08:48

12 плюса

224 Репутация автора

Работал на меня тоже, но мне пришлось удалить

<scope>provided</scope>

<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
Автор: Dan Размещён: 23.09.2016 09:31

14 плюса

174 Репутация автора

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

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

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

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

Автор: JaySon Размещён: 08.11.2016 11:43

3 плюса

1006 Репутация автора

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

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

added ViewResolver:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@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: Почему Spring MVC отвечает 404 и сообщает "Не найдено сопоставление для HTTP-запроса с URI [...] в DispatcherServlet"?

Автор: RoutesMaps.com Размещён: 14.03.2017 12:08

0 плюса

444 Репутация автора

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

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

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
Автор: VNT Размещён: 21.04.2017 09:57

6 плюса

543 Репутация автора

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

1 - зависимость tomcat-embad-jasper

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

2 - Добавьте ниже конфигурацию application.properties

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

Вот и все-таки есть какие-то сомнения, тогда зацените ссылку ниже

Spring Boot и интеграция JSP

Автор: jeet singh parmar Размещён: 29.04.2017 06:22

2 плюса

218 Репутация автора

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

    <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>
Автор: Niamat Zawad Размещён: 30.04.2017 10:18

1 плюс

403 Репутация автора

Полная настройка 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;
    }

}
Автор: John Tribe Размещён: 18.11.2017 10:48

1 плюс

167 Репутация автора

Иногда tomcat-embed-jasper недоступен, поэтому необходимо удалить предоставленную из maven зависимость tomcat-embed-jasper.

например.

<dependency>
   <groupId>org.apache.tomcat.embed</groupId>
   <artifactId>tomcat-embed-jasper</artifactId>
   <!--scope>provided</scope-->
</dependency>
Автор: Sandeep Kumar Размещён: 20.11.2017 07:39

1 плюс

2478 Репутация автора

Если вы хотите использовать 1.5.8.RELEASE или аналогичный, то запускаемый пример и его объяснение можно найти здесь 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 spring-boot-starter-parent 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>

И это в приложении. Свойства

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";
    }
}
Автор: Surasin Tancharoen Размещён: 13.12.2017 08:26

0 плюса

319 Репутация автора

<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>
Автор: Devendra Singraul Размещён: 28.03.2018 10:22

1 плюс

2494 Репутация автора

Причина в том, что вы используете аннотацию @RestController вместо @Controller

Когда вы аннотируете класс с помощью RestController, все методы, аннотированные с помощью @RequestMapping, по умолчанию принимают семантику @ResponseBody. Другими словами, ваш метод #index сериализует String /webapp/WEB-INF/index.jsp как JSON, а не отображает его значение в представление.

Как упоминалось в одном из ответов, оно должно быть

@Controller открытый класс YourController {...}

Автор: Aarish Ramesh Размещён: 06.01.2019 11:38

0 плюса

393 Репутация автора

У меня была эта проблема и, наконец, она решена!

Моя проблема заключалась в том, что я размещал код JSP на своей /WEB-INF/index.jspстранице. Однако эта страница обслуживается напрямую, без обработки каким-либо сервлетом или контроллером. Поэтому у него не было шансов быть скомпилированным.

введите описание изображения здесь

Мое решение:

  1. Переместить index.jspв подпапку с именем views.

    введите описание изображения здесь

  2. Отредактируйте web.xmlтак, чтобы он передавал управление корневым каталогом сервлету диспетчера.

    <!-- 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. Отредактируйте, dispatcher-servlet.xmlчтобы убедиться, что он ищет в viewsкаталоге файлы, оканчивающиеся на .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. Используя тот же base-packageпуть, который указан в dispatcher-servlet.xml, создайте контроллер, который будет возвращать 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!!!");
        }
    
    }
    
  5. Синтаксис new ModelAndView("index", "message", "IT WORKS!!!")означает, что
    • dispatcher-servletищет файл с именем "/WEB-INF/views/" + "index" + ".jsp".
    • Он компилирует файл JSP, заменяя все экземпляры ${message}с IT WORKS!!!.

Следовательно, последнее, что нужно сделать, это поместить ${message}в наш 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. Загрузите проект на свой сервер Tomcat, запустите его и перейдите к http://localhost:8080/[project name]/.

    введите описание изображения здесь

Автор: Cameron Hudson Размещён: 31.01.2019 12:08

0 плюса

1390 Репутация автора

Для меня с версией Spring Boot 1.5.10.RELEASE, он работал над добавлением ниже зависимостей maven.

Примечание: работал только на не предоставление <scope>этих двух.

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

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

И предоставление ниже конфигурации в файле application.properties

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

Автор: qwerty Размещён: 29.07.2019 10:48

0 плюса

144 Репутация автора

Пожалуйста, примите во внимание, что существуют некоторые ограничения JSP. Вы не можете установить packagingваш pomTo jar. Прочитайте это ограничения JSP

Автор: Askar Размещён: 18.08.2019 11:33
Вопросы из категории :
32x32