Как оценить выражение EL в сервлете Tomcat?
Tomcat использует Jasper EL.
https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper-el
https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/jasper/el/package-summary.html
Судя по javadoc, у него нет ExpressionFactory
impl для создания ELContext
объекта.
ELContext elContext = new ELContextImpl(expressionFactoryImpl);
Есть ли примеры того, как оценивать EL в сервлете Tomcat?
Первая ссылка предназначена для tomcat-jasper-el
артефакта, который зависит от tomcat-el-api . Этот EL API можно использовать для оценки EL-выражений в сервлетах Java:
EL в автономной среде EL 3.0 включает API для использования EL в автономной среде.
ELProcessor
предоставляет простые API для прямого вычисления выражений. Это также позволяет легко определять функции, устанавливать переменные и локально определять bean-компоненты.
ELManager
предоставляет API-интерфейсы более низкого уровня для управления средой синтаксического анализа и оценки EL. Он содержит значение по умолчаниюELContext
StandardELContext
.
В примерах, которые вы ищете, используется старая версия javax.el
.
Ответ Романа технически верен, но, скорее всего, это не тот подход, который вы имели в виду. Подход ELProcessor
создаст только совершенно отдельный контекст EL, в котором неявные объекты JSP и атрибуты запроса/сеанса/приложения недоступны, и вам придется вручную управлять ими самостоятельно примерно так же, как показано во второй части этого ответа. : Как программно оценить EL в управляемом компоненте.
Чтобы иметь возможность оценить EL в сервлете, который дает точно такие же результаты, как если бы вы были на странице JSP, вам необходимо создать ValueExpression с помощью ExpressionFactory
, доступного в JspApplicationContext#getExpressionFActory( ) и ELContext
, доступные с помощью JspContext#getELContext(). Вот пример начала:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
JspFactory jspFactory = JspFactory.getDefaultFactory();
ExpressionFactory expressionFactory = jspFactory.getJspApplicationContext(getServletContext()).getExpressionFactory();
ELContext elContext = jspFactory.getPageContext(this, request, response, null, false, 0, false).getELContext();
ValueExpression valueExpression = expressionFactory.createValueExpression(elContext, "${param.foo}", Object.class);
Object value = valueExpression.getValue(elContext);
// ...
}
В этом начальном примере переменная value
представляет вычисленное значение ${param.foo}
, которым вы можете управлять с помощью строки запроса ?foo=bar
.
Что касается конфигурации pom.xml
, вам абсолютно не нужны зависимости, специфичные для Tomcat. Просто придерживайтесь стандартных зависимостей API. Тогда он будет работать в любом контейнере, совместимом с Servlet 2.1. Если вы не уверены, какие стандартные зависимости API выбрать для Tomcat, перейдите к этому ответу: Как правильно настроить библиотеки Jakarta EE в Maven pom.xml для Tomcat?
Почему? Это полезно на веб-странице, где у вас нет Java, но есть Java в среде сервлетов. В EL нет ничего, что нельзя было бы оценить непосредственно на Java.