JSP Spring Boot работает при запуске из IntelliJ, но пустая страница при запуске WAR

#java #spring #maven #jsp #tomcat

#java #spring #maven #jsp #tomcat

Вопрос:

У меня проблема с моим приложением Spring boot: оно отлично работает при запуске form IntelliJ или с mvn clean spring-boot:run . Однако, когда я упаковываю его с man package , он обслуживает пустую страницу, игнорируя мои jsp.

Я упаковываю с помощью war. Я планирую запустить проект со встроенным 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>srcmainwebappWEB-INFweb.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>
  

webconfig:

 @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;
    }

  

Я потратил часы, пытаясь найти решение, но безрезультатно

Комментарии:

1. где находится ваш файл jsp?

2. В src/main/webapp/WEB-INF/jsp/index.jsp

3. Удалите плагин war и ресурсы, которые у вас есть, вам это не нужно. Также почему web.xml ? Вы используете конфигурацию на основе Java. Также удалите свой WebConfig и добавьте spring.mvc.view.prefix и spring.mvc.view.suffix в свой application.properties с настройками, которые у вас есть сейчас WebConfig .

Ответ №1:

Spring Boot — это соглашение о конфигурации фреймворка, и сейчас вы не соблюдаете обычные соглашения. Если вы планируете работать со встроенным Tomcat, вам следует использовать spring-boot:repackage mojo вместо maven-war-plugin . Это также означает, что это spring-boot-starter-tomcat должно быть compile , и вам не нужно совсем немного вещей из вашего pom.xml .

Ваша текущая настройка слишком сложна, потому что вы создаете WAR, который должен быть развернут в существующем Tomcat. Возможно, вы захотите начать с чего-то более простого.

  1. Используйте https://start.spring.io / для создания базового проекта Maven с веб-зависимостью Spring.
  2. Переместите свой текущий код и включите JSP
  3. Пакет как запущенный JAR со встроенным Tomcat
  4. Убедитесь, что JSP обслуживаются правильно

Комментарии:

1. Спасибо! У меня есть pom.xml и это оказалось намного проще. 🙂