Spring boot: ошибка 404 при вызове JSP с использованием контроллера

Я получаю следующую ошибку при запуске моего проекта с помощью Spring Tool Suite:

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

Но в случае моей проблемы я уже добавил соответствующие зависимости в файл pom.XML. Так в чем может быть проблема?

Мои зависимости файла pom.XML выглядят следующим образом:

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>

Мой контроллер ApplicationController.java выглядит следующим образом:

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ApplicationController {

    @RequestMapping("/")
    public String Welcome() {
        return "welcomepage";
    }
}

Мои живые существа находятся в src/main/webapp/WEB-INF/view/welcomepage.jsp, вы можете посмотреть древовидную структуру ниже,

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

И я уже изменил файл application.properties. Но все равно не могу понять, что не так.

Мой файл application.properties выглядит следующим образом:

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

Я просто печатаю привет в Мой welcomepage.jsp,

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
hello
</body>
</html>

person Janaka Ekanayake    schedule 23.03.2019    source источник
comment
По какому полному URL вы звоните?   -  person LppEdd    schedule 23.03.2019
comment
Поместите файл jsp в папку src/main/java/resources/static.   -  person Dhanraj    schedule 23.03.2019
comment
@Dhanraj Тогда это будет то же самое, нет? Я также должен изменить свои application.properties   -  person Janaka Ekanayake    schedule 23.03.2019
comment
@LppEdd что вы имеете в виду из полного URL   -  person Janaka Ekanayake    schedule 23.03.2019
comment
@Mr.Semicolon, например localhost:8080/domain и т. д.   -  person LppEdd    schedule 23.03.2019


Ответы (3)


Похоже, вы были очень близки к рабочему приложению. Основная проблема в вашем коде заключается в <scope>provided</scope> для вашей зависимости от Jasper. А также похоже, что вы запускаете свой код из eclipse IDE с помощью метода main.

Короче говоря:

Если вы хотите запустить свое приложение с помощью метода main в MyApplication.java, просто удалите область действия provided для Jasper.

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

Или вы можете запустить свое приложение точно в том же состоянии, что и сейчас, из консоли:

mvn clean spring-boot:run

Но я предлагаю удалить эту область, чтобы вы могли запускать свой код из IDE и из консоли. Кроме того, зависимость spring-boot-starter-tomcat выглядит избыточной (она должна быть доступна в spring-boot-starter-web). В двух словах, попробуйте использовать следующий файл pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <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>
        </dependency>
    </dependencies>
</project>

Надеюсь, мой ответ поможет вам.

person Mikita Berazouski    schedule 24.03.2019
comment
В обоих вариантах? Через консоль и IDE? - person Mikita Berazouski; 27.03.2019
comment
@Mr.Semicolon, так что дайте мне знать, если это все еще не работает в вашем случае. - person Mikita Berazouski; 27.03.2019

Вам также может понадобиться добавить это в pom.xml

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

ОБНОВЛЕНИЕ 1:

Ограничение JSP

При запуске приложения Spring Boot, использующего встроенный контейнер сервлетов (и упакованного в виде исполняемого архива), существуют некоторые ограничения в поддержке JSP.

  • С Jetty и Tomcat это должно работать, если вы используете военную упаковку. Исполняемая война будет работать при запуске с помощью java -jar, а также ее можно будет развернуть в любом стандартном контейнере. JSP не поддерживаются при использовании исполняемого файла jar.
  • Undertow не поддерживает JSP.
  • Создание пользовательской страницы error.jsp не переопределяет представление по умолчанию
    для обработки ошибок. Вместо этого следует использовать настраиваемые страницы ошибок.

Область

compile Это область действия по умолчанию, используемая, если она не указана. Зависимости компиляции доступны во всех путях к классам проекта. Кроме того, эти зависимости распространяются на зависимые проекты.

provided Это очень похоже на компиляцию, но указывает, что вы ожидаете, что JDK или контейнер предоставит зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость от API-интерфейса сервлета и связанных API-интерфейсов Java EE на предоставленную область, поскольку веб-контейнер предоставляет эти классы. Эта область доступна только в пути к классам компиляции и тестирования и не является транзитивной.

runtime Эта область указывает, что зависимость не требуется для компиляции, но предназначена для выполнения. Он находится в путях выполнения и тестовых классах, но не в пути к классам компиляции.

Кроме того, попробуйте изменить следующее в tomcat-embed-jasper

Remove <scope>provided</scope> OR change the scope to compile <scope>compile</scope>

Ограничения JSP Spring Boot JSP 404

person Patel Romil    schedule 23.03.2019
comment
@Mr.Semicolon, какой вариант упаковки вы используете jar или war? - person Patel Romil; 27.03.2019

Мне удалось сгенерировать банку из своего приложения, а затем запустить ее с помощью java -jar myapp.jar. Но мне удалось запустить эту банку только с версией ниже spring-boot-starter-parent:

MyApp/pom.xml:

      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
  </parent>

Я исследовал: Spring Boot JSP 404

person Livia Souza    schedule 28.05.2019