localhost:8080 HTTP Status 404 – Не найдено

У меня есть самый простой Maven проект. Это маленькое MVC приложение (пока только с Controller и View), которое должно выводить в браузере строку "hello". Использую Tomcat 10. Шаблонизатор - Thymeleaf.

Проблема: запускаю сервер, перехожу по адресу http://localhost:8080/hello и получаю HTTP Status 404:

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

Вот иерархия проекта:

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

Логи при запуске сервера:

июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version name:   Apache Tomcat/10.0.7
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          Jun 8 2021 16:31:06 UTC
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version number: 10.0.7.0
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Mac OS X
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Версия ОС:             10.15.7
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Архитектура:           x86_64
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:                  /Applications/Eclipse.app/Contents/Eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.macosx.x86_64_15.0.2.v20210201-0955/jre
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Версия JVM:            15.0.2+7-27
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         /Users/sergey/Documents/Eclipse Workspaces/horstmann the-second-volume/.metadata/.plugins/org.eclipse.wst.server.core/tmp0
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         /Users/sergey/Documents/Programming/Tomcat/apache-tomcat-10.0.7
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=/Users/sergey/Documents/Eclipse Workspaces/horstmann-the-second-volume/.metadata/.plugins/org.eclipse.wst.server.core/tmp0
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=/Users/sergey/Documents/Programming/Tomcat/apache-tomcat-10.0.7
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dwtp.deploy=/Users/sergey/Documents/Eclipse Workspaces/horstmann-the-second-volume/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=UTF-8
июл. 01, 2021 2:27:47 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -XX:+ShowCodeDetailsInExceptionMessages
июл. 01, 2021 2:27:47 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path: [/Users/sergey/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]
июл. 01, 2021 2:27:48 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
июл. 01, 2021 2:27:48 PM org.apache.catalina.startup.Catalina load
INFO: Server initialization in [2392] milliseconds
июл. 01, 2021 2:27:48 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Catalina]
июл. 01, 2021 2:27:48 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet engine: [Apache Tomcat/10.0.7]
июл. 01, 2021 2:27:49 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
июл. 01, 2021 2:27:49 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in [740] milliseconds

Код класса контроллера:

package com.spring.mvcapp;

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

@Controller
public class HelloController
{
    @GetMapping("/hello")
    public String sayHello()
    {
        return "hello";
    }
}

hello.html:

<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
   </head>
   <body>
      <p>Hello!!</p>
   </body>
</html>

Содержимое pom.xml:

<?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 https://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.5.2</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.spring</groupId>
<artifactId>mvc-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mvc-app</name>
<description>Demo project for Spring Boot</description>
<properties>
    <java.version>11</java.version>
    <spring.version>5.3.8</spring.version>
</properties>
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
        <version>3.0.12.RELEASE</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Содержимое 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_3_1.xsd"
     id="WebApp_ID" version="3.1">

<display-name>Web WMC Application</display-name>

<absolute-ordering/>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContextMVC.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Конфигурация через XML (applicationContextMVC.xml):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xsi:schemaLocation="
http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context.xsd
  http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<context:component-scan base-package="com.spring.mvcapp"/>

<mvc:annotation-driven/>

<bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".html"/>
</bean>

<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver"/>
    <property name="enableSpringELCompiler" value="true"/>
</bean>

<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    <property name="templateEngine" ref="templateEngine"/>
    <property name="order" value="1"/>
    <property name="viewNames" value="*"/>
</bean>

Перебираю каждый файл уже несколько часов, гуглю на англоязычных сайтах, но пока ничего рабочего не нахожу. Со Spring начал работать недавно, поэтому может вообще не там ищу проблему. Заранее, спасибо)


Ответы (0 шт):