У меня есть следующий код в файле JSP для тегов, который включен во все мои файлы JSP вверху:
<%@ taglib uri = "http://struts.apache.org/tags-bean" prefix = "bean"%>
<%@ taglib uri = "http://struts.apache.org/tags-html" prefix = "html"%>
<%@ taglib uri = "http://struts.apache.org/tags-logic" prefix = "logic"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/fmt" prefix = "fmt"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/functions" prefix = "fn"%>
<%@ taglib uri = "http://displaytag.sf.net" prefix = "display"%>
<%@ taglib uri = "http://www.springframework.org/tags" prefix = "spring"%>
<%@ taglib uri = "http://www.springframework.org/security/tags"
prefix = "sec"%>
<%@ taglib uri = "http://www.springframework.org/tags/form" prefix = "form"%>
<%@ taglib uri = "http://www.springmodules.org/tags/commons-validator"
prefix = "v"%>
<html:xhtml />
<c:set var = "ctx" value = "${pageContext.request.contextPath}" />
Поскольку я недавно перешел с Spring 5.X на Spring 6, я изменил приведенное выше на следующее в соответствии со спецификацией Джакарты 3.0, указанной здесь:
<%@ taglib uri = "http://struts.apache.org/tags-bean" prefix = "bean"%>
<%@ taglib uri = "http://struts.apache.org/tags-html" prefix = "html"%>
<%@ taglib uri = "http://struts.apache.org/tags-logic" prefix = "logic"%>
<%@ taglib uri = "jakarta.tags.core" prefix = "c"%>
<%@ taglib uri = "jakarta.tags.fmt" prefix = "fmt"%>
<%@ taglib uri = "jakarta.tags.functions" prefix = "fn"%>
<%@ taglib uri = "http://displaytag.sf.net" prefix = "display"%>
<%@ taglib uri = "http://www.springframework.org/tags" prefix = "spring"%>
<%@ taglib uri = "http://www.springframework.org/security/tags"
prefix = "sec"%>
<%@ taglib uri = "http://www.springframework.org/tags/form" prefix = "form"%>
<%@ taglib uri = "http://www.springmodules.org/tags/commons-validator"
prefix = "v"%>
<html:xhtml />
<c:set var = "ctx" value = "${pageContext.request.contextPath}" />
Тем не менее, я все еще получаю следующую ошибку при доступе к странице JSP.
[INFO] SEVERE: Servlet.service() for servlet [myapp] in context with path [/myapp] threw exception [java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/BodyTagSupport] with root cause
[INFO] java.lang.ClassNotFoundException: javax.servlet.jsp.tagext.BodyTagSupport
Вот несколько актуальных вещей из моего pom.xml
:
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>10.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>
Я использую Tomcat 10.1.25, чтобы запустить указанное выше приложение. Есть ли что-то, что мне нужно перепроверить или сделать неправильно? Я просмотрел другие посты, похожие на это, и, похоже, меня удовлетворяет то, что там упомянуто.
Примечание. Struts больше не используется в приложении, хотя у меня есть некоторые объявления в приложении, и я удалю их остатки после устранения этой проблемы.
Я полагаю, что эти устаревшие библиотеки могут быть связаны с вещами, связанными со стойками, которые я больше не использую?
И что такое «Tomcat 10.1.45»? Это опечатка?
Да, я использовал 10.1.25. Отредактировал свой пост, указав правильную версию.
Тогда вам следует обновить его, используя мой ответ ниже. Также не забудьте принять и проголосовать за него.
Если вы хотите соответствовать спецификации Jakarta Pages, вам следует удалить старые определения библиотеки тегов Struts и Display:
<%@ taglib uri = "http://struts.apache.org/tags-bean" prefix = "bean"%>
<%@ taglib uri = "http://struts.apache.org/tags-html" prefix = "html"%>
<%@ taglib uri = "http://struts.apache.org/tags-logic" prefix = "logic"%>
<%@ taglib uri = "http://displaytag.sf.net" prefix = "display"%>
И вам следует удалить среду выполнения и скомпилировать зависимости от них.
Удалите использование тегов со страниц JSP, таких как
<html:xhtml />
Также, если вы используете Jakarta EE 10, вам следует установить последнюю версию Выпущен Tomcat 10.1.26 2024 г.:
Проект Apache Tomcat с гордостью сообщает о выпуске версии 10.1.26 Apache Tomcat. В этом выпуске реализованы спецификации, являющиеся частью платформы Jakarta EE 10.
Можно ли избавиться от <html:xhtml />
и со стойками? Я не понимаю, для чего там <html:xhtml />
, ведь не я создал его много лет назад.
Вопрос №2: Когда вы говорите If you want to comply to Jakarta Standard Tag Library 3.0 specification then you should remove old JSTL
, я уже переименовал URI java.sun.com
taglib в новые jakarta.tags.*
URN, как показано в моем посте. Вы также имели в виду, что есть аналогичная замена стоек, которая сейчас у меня есть в комплекте?
продолжение ... Причина, по которой я спрашиваю, заключается в том, что у меня есть один проект, в котором стойки не используются, и другой проект, в котором стойки используются. Таким образом, проект, содержащий некоторые из приведенных выше объявлений pom, используется как зависимость с двумя проектами (один, где стойки больше не используются, но есть остатки, как в случае с приведенным выше сценарием, и другой проект, где стойки все еще используются, и я сделал использование устаревших веб-структур для сохранения его работоспособности после обновления с Spring 5.x до Spring 6)
Да, но вы не удалили все зависимости от него. По размещенной вами ссылке есть руководство, позволяющее изучить основы использования JSTL в Jakarta EE. Меня не волнует, используете ли вы Struts в своем проекте или нет, но вам следует удалить зависимости от него, поскольку текущая версия Struts несовместима с jakarta-ee. Рано или поздно Struts 7 будет выпущен, и вы сможете использовать его с Spring 6. Но ваша устаревшая версия Struts устарела несколько десятилетий назад, и вы до сих пор не обновили ее до более новой версии, поэтому вы не можете использовать ее в текущей версии. программное обеспечение. Таким образом, у вас есть только один вариант удалить его вообще.
В любом случае вы не можете использовать одни и те же объявления pom в двух проектах. Пока обе библиотеки проекта не будут поддерживать спецификацию Jakarta EE. Struts1 является EOL, поэтому он никогда не будет поддерживать последнюю версию Jakarta EE. Однако версия 1.0 — это издание Jakarta Struts (2 десятилетия назад). Вы можете сохранить старое приложение Struts как отдельное приложение, поскольку интеграция обоих не рекомендуется. Мой ответ смотрите здесь.
Спецификация указана в деталях документа.
Есть ли документация, показывающая, что будет JSTL-эквивалентом тегов Struts, которые используют <%@ taglib uri = "http://struts.apache.org/tags-html" prefix = "html"%>
? По сути, у меня есть используемые теги <html:submit/> , <html:messages/> ,
<html:javascript /> `, от которых я пытаюсь избавиться. Я заполучил те, которые начинаются с bean
и logic
, и задался вопросом о приведенном выше.
Tomcat 10.1 использует спецификацию сервлета 6 и поэтому больше
javax
не предусмотрено. Я предполагаю, что проблема в какой-то устаревшей библиотеке, которая все еще использует импортjavax
в своем коде - просмотрите все свои библиотеки и обновите их.