首页 > 解决方案 > JSP Spring Boot 在从 IntelliJ 运行时工作,但在运行 WAR 时为空页面

问题描述

我的 Spring Boot 应用程序有问题:从 IntelliJ 或使用mvn clean spring-boot:run. 但是,当我将它与它打包时,man package它会提供一个忽略我的 jsps 的空白页面。

我正在包装战争。我打算用嵌入式 tomcat 运行这个项目

我的 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.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <packaging>war</packaging>
    <groupId>com.some</groupId>
    <artifactId>letdeskWebsite</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>some Website</name>
    <description>some Website</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <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-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>servlet-api</artifactId>
                    <groupId>javax.servlet</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jsp-api</artifactId>
                    <groupId>javax.servlet.jsp</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/webapp</directory>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <warSourceDirectory>target</warSourceDirectory>
                    <webXml>src\main\webapp\WEB-INF\web.xml</webXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

我的主要课程:

@SpringBootApplication
public class SomeWebsiteApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SomeWebsiteApplication.class);
    }
    public static void main(String[] args) {
        SpringApplication.run(SomeWebsiteApplication.class, args);
    }

}

控制器:

    @GetMapping({"/", "/hello"})
    public String hello(final Model model,
                        @RequestParam(value="name",
                                required=false,
                                defaultValue="World") final String name) {
        model.addAttribute("name", name);
        log.info("called a home page");
        return "index";
    }
}

我的jsp(位于src/main/webapp/WEB-INF/jsp/index.jsp):

<!DOCTYPE html>
<html class="no-js" lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Hello ${name}!</title>
        <meta class="foundation-mq">
        <link rel="stylesheet" href="css/app.css">
    </head>
    <body>
        <div class="pageWithoutFooter">
            <jsp:include page="NavigationElements/topNavigation.jsp"/>
            <h2 class="hello-title">Hello ${name}!</h2>
            <input type="button" value="Hi there!">
        </div>
        <jsp:include page="NavigationElements/footerNavigation.jsp"/>
    </body>
</html>

网络配置:

@ComponentScan
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public InternalResourceViewResolver getInternalResourceViewResolver(){
        final InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");

        return resolver;
    }

我花了几个小时试图找到解决方案但无济于事

标签: javaspringmavenjsptomcat

解决方案


Spring Boot 是配置框架的约定,您现在没有遵循通常的约定。如果您打算使用嵌入式 Tomcat 运行,您应该使用spring-boot:repackagemojo 而不是maven-war-plugin. 这也意味着它spring-boot-starter-tomcat必须是compile并且你不需要你的pom.xml.

您当前的设置过于复杂,因为您正在构建一个应该部署到现有 Tomcat 中的 WAR。您可能想从更简单的事情开始。

  1. 使用https://start.spring.io/生成具有 Spring Web 依赖项的基本 Maven 项目。
  2. 移动当前代码并包含 JSP
  3. 打包为带有嵌入式 Tomcat 的运行 JAR
  4. 检查 JSP 是否正确提供

推荐阅读