Почему Spring boot не поддерживает jsp, хотя он может отображать страницу, если мы добавим правильную ссылку - PullRequest
3 голосов
/ 11 июня 2019

Везде написано, что Spring boot не поддерживает просмотр jsp.В его официальном документе есть три причины:

  • С Jetty и Tomcat он должен работать, если вы используете упаковку для военных целей.Исполняемая война будет работать при запуске с java -jar, а также будет развернута в любом стандартном контейнере.JSP не поддерживаются при использовании исполняемого файла jar.
  • Undertow не поддерживает JSP.
  • Создание пользовательской страницы error.jsp не переопределяет представление по умолчанию для обработки ошибок.Вместо этого следует использовать пользовательские страницы ошибок.

Для первого пункта «JSP не поддерживаются при использовании исполняемого файла jar».Но когда я добавляю ссылку на tomcat-embed-jasper и устанавливаю правильный путь к ресурсу в application.properties, файл jsp также может быть хорошо отрисован.

Полагаю, это может означать, что загрузка Spring не поддерживает jsp без вызова другихэталонные библиотеки, такие как tomcat-embed-jasper.

Но для thymleaf мы также должны импортировать spring-boot-starter-thymeleaf.Почему мы можем сказать, что Spring boot поддерживает thymleaf с привлечением дополнительных библиотек.

Итак, как я могу понять первый элемент в документе?

1 Ответ

3 голосов
/ 11 июня 2019

Встроенный пакет Tomcat (который используется в springboot для создания исполняемого jar-файла) по умолчанию не включает JSP, мы также должны добавить модуль “org.apache.tomcat.embed:tomcat-embed-jasper”. По этой причине мы добавляем tomcat-embed-jasper в качестве зависимости в springboot, так что мы можем использовать теги jstl в jsp.

Основная причина, по которой springboot не работает должным образом с jsp в качестве средства разрешения представления, когда *jar используется в качестве упаковки, заключается в жестком кодировании шаблон файла в Tomcat . Проблема в том, что при использовании java -*.jar для развертывания приложения Springboot файлы jsp не будут присутствовать во встроенном Tomcat, и при попытке обработать запрос вы получите 404 СТРАНИЦА НЕ НАЙДЕНА .Это происходит из-за упаковки jar: файлы jsp не копируются из папки WEB-INF. Если вы сохраняете файлы jsp в папке META-INF/resources, а в качестве упаковки используется jar, то это должно работать.

Thymeleaf позволяет использовать шаблоны в качестве прототипов, что означает, что их можно просматривать как статические файлы и помещать в папку resources/templates на весну, чтобы их можно было забрать. Но файлы jsp будут иметь теги jstl и т. Д., Которые перед передачей должны передаваться яшмой, поэтому они не могутбыть установленным как статические файлы, насколько мне известно.

При использовании WAR (архив веб-приложений) упаковка автоматически будет извлекать ресурсы из следующей структуры проекта:

 |-- pom.xml
 `-- src
     `-- main
         |-- java
         |   `-- com
         |       `-- example
         |           `-- projects
         |               `-- SampleAction.java
         |-- resources
         |   `-- images
         |       `-- sampleimage.jpg
         `-- webapp
             |-- WEB-INF
             |   `-- web.xml
             |-- index.jsp
             `-- jsp
                 `-- websource.jsp

Руководства и официальный пример использования springboot с jsp: Guide , Образец репо

Структура упаковки WAR требует хранения файлов jsp в папке webapp/ иэто будет работать как ожидалось.Цель maven war будет копировать файлы из папки webapp в WEB-INF, а все файлы ресурсов, такие как jsp, будут находиться в корне пакета war. Отсюда цель maven-repackage или перепаковка при загрузке пружины заботится о том, чтобыИсполняемый файл jar / war. Так что, если файлы присутствуют в оригинальной войне, она также будет в исполняемом файле. Структура исполняемой войны Springboot *1032* выглядит следующим образом:

example.war
 |
 +-META-INF
 |  +-MANIFEST.MF
 +-org
 |  +-springframework
 |     +-boot
 |        +-loader
 |           +-<spring boot loader classes>
 +-WEB-INF
    +-classes
    |  +-com
    |     +-mycompany
    |        +-project
    |           +-YourClasses.class
    +-lib
    |  +-dependency1.jar
    |  +-dependency2.jar
    +-lib-provided
       +-servlet-api.jar
       +-dependency3.jar

Итак, для комментария:

Если вы поместите ваши jsp файлы в папку src/main/resources, все, что будет помещено в этот каталог, будет автоматически скопировано в WEB-INF/classes согласно WAR документация .

Итак, если вы храните свои файлы jsp в src / main / resources и настраиваете следующее в yml или файле свойств, это должно работать для WARархивы. Я не пробовал, так что не уверен.

spring.mvc.view.prefix = /WEB-INF/classes/templates
spring.mvc.view.suffix = .jsp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...