spring+jsp 应用程序在 tomcat 中运行但在嵌入式 tomcat 中响应 404

spring+jsp app works in tomcat but respond 404 in embedded tomcat

我有一个 spring-mvc + jsp 项目,可以在 external tomcat[=27 上完美运行=] 服务器。我正在尝试使用 spring-boot 和嵌入式 tomcat 制作一个 可运行的 war 文件服务器。但是当我尝试调用 GET /student 时,我收到 404 错误并且控制台中没有错误消息。

project screen

@Bean
public UrlBasedViewResolver setupViewResolver() {
   UrlBasedViewResolver resolver = new UrlBasedViewResolver();
   resolver.setPrefix("/WEB-INF/views/");
   resolver.setSuffix(".jsp");
   resolver.setViewClass(JstlView.class);
   return resolver;
}

build.gradle

plugins {
id 'org.springframework.boot' version '2.6.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'war'
}

description = 'Teaching Academy Web Application.'

ext.tomcatHome = 'D:/Soft/apache-tomcat-9.0.62'
ext.tomcatWebapps = "$tomcatHome/webapps"


war {
archiveName = 'academy-web.war' 
}

bootWar {
    archiveName = 'academy-web-bootable.war'
}

task deployToTomcat(type: Copy, dependsOn: 'build'){    
    from war
    into "$tomcatWebapps"   
}

dependencies {
//  implementation 'org.springframework:spring-webmvc:4.0.3.RELEASE'
    implementation 'org.springframework.boot:spring-boot-starter-web'

    implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
    implementation 'javax.servlet:jstl'


    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'

    implementation 'log4j:log4j:1.2.17' 
    implementation "javax.servlet:javax.servlet-api:4.0.1"
}

根据 Spring-boot 的开发团队,这是预期的行为。这里的问题不是 tomcat 服务器是否嵌入,而是您部署的应用程序类型。

在外部 tomcat 中,您将应用程序打包并部署为 war 文件,spring-boot 团队表示该文件能够支持 jsp 页面。

在嵌入式 tomcat 中,您的意思可能是将应用程序部署为带有嵌入式服务器的独立 .jar 文件,此处 spring-boot 团队提到这是限制之一jsp 技术将不起作用。 Relevant Spring Boot documetation

同时仔细检查您提到的问题

I'm trying to make a runable war file with using spring-boot and embedded tomcat server.

嵌入式服务器无法按预期处理 war 文件。 war 将仅包含 servlet 有关应用程序的信息,而不是嵌入式服务器,也不是可以启动服务器的独立应用程序。因此总结 war 文件在执行时不会启动服务器,因此当您访问应用程序时会得到 404 响应。