Выражения EL, не оцененные в JSP

Есть небольшая проблема с моим сервлетом /jsp веб-приложением. Я пытаюсь использовать jstl на странице jsp. Когда я использую любой тег, например:

<c:out value="${command}"/>

он показывает мне

${command} 

в моем браузере вместо значения параметра 'command'. Я использую maven (и я думаю, проблема здесь). Вот зависимости pom xml:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.0.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>jstl</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>

мой тег объявления web.xml:

<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">

и часть jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>

<head>
<title>Parsing results</title>
<link type="text/css" rel="stylesheet" href="css/page.css"/>
<link type="text/css" rel="stylesheet" href="css/table.css"/>
</head>

<body>
<h2 align="center">Results of 
parsing. Parsing method = <c:out value="${command}"/></h2>.......

EDIT: Код, который устанавливает значение команды, прост:

request.setAttribute("command", parser.getName());

то идет

request.getRequestDispatcher(redir).forward(request, response);

Скажите, пожалуйста, что я делаю неправильно! спасибо!

Ответ 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.

Смотрите также:

Ответ 2

В моем случае для файла web.xml(version = "3.0" ) мне пришлось запускать приложение на сервере Tomcat v.8 вместо v.7, иначе у меня была такая же проблема, как и вы. Надеюсь, это поможет кому-то...

<?xml version="1.0" encoding="ISO-8859-1" ?>
<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">