По умолчанию, когда Spring Boot ожидает, что просмотры будут сохранены?

Я экспериментирую с повторным написанием моего конфигурационного тяжелого проекта Vanilla Spring MVC с использованием Spring Boot. Я начал новый проект Spring Boot в IntelliJ, используя Spring Boot Initiaizer, и я отправился на путь минимальной конфигурации на основе Java. В большинстве учебных пособий указывается, что основной основной класс по умолчанию является достаточным и что у @SpringBootApplication есть все, что включено. Я получил образец REST Controller для работы и возврата сериализованного объекта в виде JSON, но, похоже, получить представление показать сложно. Моя структура выглядит следующим образом: со всем значением, отличным от каталога webapps, который я создал.

src
'-main
   '-java
   '-resources
     '-static
     '-templates
   '-webapp
     '-WEB-INF
        '-home.jsp

Контроллер прост.

@Controller
public class ViewMaster {
    @RequestMapping("/home")
    public String home() {
        return "home";
    }
}

Без какой-либо конфигурации я хотел бы знать, где Spring Boot ожидает, что представления будут сохранены и с каким расширением (html?). Я также попытался включить следующее в application.properties но я все еще получаю ошибку 404. Перемещение каталога WEB-INF или только файла html в ресурсах тоже не помогло.

spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

Я также пытался включить эти зависимости в свой pom.xml без каких-либо последствий.

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

Мне, должно быть, не хватает чего-то больно очевидного здесь, поэтому оцените, если кто-то может это указать!

Ответы

Ответ 1

Решение

Я нашел ответ через пробную ошибку, которая оказалась довольно раздражающей. Я надеюсь, что кто-то может исправить меня, если этот вывод неверен, но похоже, что Spring Boot не нравится строка WEB-INF. Я переименовал каталог WEB-INF чтобы view и изменить application.properties на следующее, и представление загружено успешно.

spring.mvc.view.prefix=/view/
spring.mvc.view.suffix=.jsp

Дополнительные выводы

Цель этого упражнения состояла в том, чтобы создать рабочий пример минимальной конфигурации на основе Java, поэтому я продолжал минимализировать настройку. Затем я обнаружил, что много советов, которые выходят на несколько потоков SO, и форумы не помогли. @JBNizet предоставил ссылку в своем комментарии к документам Spring Boot, в которых перечислены очень важные моменты, о которых никто не упомянул: JSP просто не играют хорошо с Spring Boot, поскольку у нее есть ограничения в зависимости от выбранного встроенного контейнера. Имея это в виду, я решил попробовать заменить JSP на шаблоны ThymeLeaf.

Моя новая рабочая конфигурация устраняет необходимость в этих:

  • Не нужно добавлять application.properties: spring.mvc.view.prefix + spring.mvc.view.suffix
  • Не нужно менять тип упаковки с банки на войну
  • Нет необходимости изменять основной класс
  • Не нужно добавлять зависимости pom.xml для
    • org.springframework.boot/spring-boot-starter-tomcat
    • org.springframework.boot/tomcat-embed-jasper
    • javax.servlet/jstl

Так что только шаблон Spring Spring по умолчанию и 2 зависимостей ThymeLeaf с представлениями, названными как ViewName.html помещены в src/main/resources/templates.

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
</dependency>

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring4</artifactId>
</dependency>

Ответ 2

Без какой-либо конфигурации Spring Boot ожидает, что представления будут храниться внутри /webapp, страница просмотра может быть любого формата, зависит от параметров application.properties (например, html или jsp), чтобы установить.jsp в качестве страницы просмотра в /views/folder

spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp //for .html change it ot .html

и вы должны использовать tomcat jaspher, если вы не включите его, страница не будет отображаться, а загружается в файл

spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp

Ответ 3

Первое, что вы думаете, это вставить зависимость в pour pom, как показано ниже.

<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </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>

С этой зависимостью вы говорите при загрузке весны, что вложенная зависимость tomcat предоставляется, и это приводит к тому, что ваше весеннее приложение не имеет зависимости tomcat внутри банки.

Вторая думает, что вы это делаете, это изменение пакингеров в вашем pon от jar до war, как показано ниже

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
    <packaging>war</packaging>
    ....
</project>

Третий и последний думают, что вы делаете рефакторинг стандартного стартера загрузки приложений, как показано ниже.

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

для вашей конфигурации в свойствах приложения может быть хорошо, но я предлагаю вам разместить ваш jsp под определенной папкой, а затем реорганизовать вашу конфигурацию для указания на новый путь, а не только под WEB-INF, но это всего лишь совет.

Надеюсь, это поможет вам.

Ответ 4

tys, pls пытаются добавить зависимость:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

Ссылка: https://github.com/lenicliu/examples/tree/master/examples-spring-boot/examples-spring-boot-jsp

spring.mvc.view.prefix - это относительный путь к папке webapp, и вы можете поместить в него jsp файлы.

Ответ 5

application.properties

Удалить:

spring.mvc.view.prefix=/view/
spring.mvc.view.suffix=.jsp

Добавить:

spring.thymeleaf.prefix= /WEB-INF/views/
spring.thymeleaf.suffix= .html

pom.xml

Удалите зависимость jasper:

<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-thymeleaf</artifactId>
</dependency>

Подробности: использование тимелеафа вместо jsp