По умолчанию, когда 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