Ответ 1
Yes, i have doctype in web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "java.sun.com/dtd/web-app_2_3.dtd"; >
Удалите этот <!DOCTYPE>
из web.xml
и убедитесь, что <web-app>
объявлен соответствующим сервлету 2.4 или новее, и все должно быть в порядке. Действительный Servlet 3.0 (Tomcat 7, JBoss AS 6/7, GlassFish 3 и т.д.), Совместимый с web.xml
, выглядит как ниже полностью, без каких-либо <!DOCTYPE>
:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- Config here. -->
</web-app>
Для Servlet 3.1 (Tomcat 8, WildFly 8/9/10/11, GlassFish/Payara 4 и т.д.) это выглядит ниже:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- Config here. -->
</web-app>
Для Servlet 4.0 (Tomcat 9, WildFly 12, GlassFish/Payara 5 и т.д.) это выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- Config here. -->
</web-app>
При использовании JSTL 1.1 или новее вы должны убедиться, что ваш web.xml
объявлен таким образом, что веб-приложение работает как минимум в режиме Servlet 2.4, иначе выражения EL не будут работать в веб-приложении.
Если в web.xml
по-прежнему установлен Servlet 2.3 или старше <!DOCTYPE>
или <web-app>
, даже если у вас уже есть XSD Servlet 2.4 или новее, он все равно будет вынужден работать в режиме Servlet 2.3 или более ранней версии, вызывая EL выражения, чтобы потерпеть неудачу.
Техническая причина в том, что EL изначально был частью JSTL 1.0 и недоступен в Servlet 2.3/JSP 1.2 и более ранних версиях. В JSTL 1.1 EL был удален из JSTL и интегрирован в JSP 2.0, который идет вместе с Servlet 2.4. Итак, если ваш web.xml
объявлен для запуска веб-приложения в Servlet 2.3 или более старом модусе, то JSP будет ожидать найти EL в библиотеке JSTL, но это, в свою очередь, приведет к сбою, если это более новая версия JSTL, в которой отсутствует EL.