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 начал работать недавно, поэтому может вообще не там ищу проблему. Заранее, спасибо)

