Как вызвать параметризованный метод из JSP, используя JSTL/EL

Как вызвать метод Java с аргументами, которые определены в классе Java, из JSP с использованием JSTL/EL. Метод возвращает массивы. Любое возвращаемое значение может быть использовано.

4 ответа

Вы можете вызывать методы с аргументами в EL только в том случае, если вы нацеливаетесь и запускаете контейнер, совместимый с Servlet 3.0 (например, Tomcat 7, Glassfish 3, JBoss AS 6 и т. Д.) С web.xml Заявлено соответствие сервлету 3.0. Эта версия сервлета поставляется вместе с EL 2.2, который позволяет вызывать произвольные методы экземпляра с аргументами.

Предполагая, что вы ${bean} в области видимости, которая относится к экземпляру класса, который имеет метод что-то вроде public Object[] getArray(String key)тогда вы должны быть в состоянии сделать это:

<c:forEach items="${bean.getArray('foo')}" var="item">
    ${item} <br />
</c:forEach>

или даже с другой переменной в качестве аргумента

<c:forEach items="${bean.getArray(foo)}" var="item">
    ${item} <br />
</c:forEach>

Но если вы не нацелены на контейнер Servlet 3.0, то вы вообще не сможете вызывать методы с аргументами в EL. Лучше всего просто выполнить работу в сервлете предварительной обработки, как рекомендует Даффимо.

Object[] array = bean.getArray("foo");
request.setAttribute("array", array);
// ...

В качестве совершенно другой альтернативы вы можете создать функцию EL, которая делегирует вызов метода. Вы можете найти пример запуска где-то в нижней части этого блога. Вы хотели бы закончить что-то вроде как:

<c:forEach items="${util:getArray(bean, 'foo')}" var="item">
    ${item} <br />
</c:forEach>

с

public static Object[] getArray(Bean bean, String key) {
    return bean.getArray(key);
}

Вышеупомянутое решение не работает для меня. У меня была функция getRemitanceProfileInformation(user) в моем классе Java. Я создал usebean класса Java, а затем вызвал

<c:set var="paymentValueCode" value='remittanceaddr.getRemitanceProfileInformation("${user}")'/>

и это сработало.

Дайте JSP ссылку на экземпляр класса, который имеет метод, и вызовите его.

Вы, вероятно, спрашиваете, кто дает JSP этот экземпляр - это сервлет в схеме MVC модели-2.

Вот как будет работать поток:

  1. Отправьте запрос GET/POST от JSP сервлету.
  2. Сервлет действует по этому запросу и выполняет некоторые действия от имени JSP. Помещает все необходимые объекты в запрос, сеанс или другую подходящую область.
  3. Сервлет направляет ответ на следующий JSP, который может совпадать с запрашивающим JSP.
  4. Промыть, повторить.

Если вы используете JSF, вы можете использовать компонент bean в качестве модели в View Scope и загружать из источника данных автоматически. А если вы используете JSP, как насчет использования TLD Tag? И используя тег JSTL <c:foreach>? Это экономит память от сохранения в сеансе, или сохраняет в сеансе и удаляет его, когда событие загрузки завершено? Некоторые как это (JSTL+TLD)

<c:forEach items="${myTag:getProductByPage(page)}" var="p">
     Product name: ${p.productName}
</c:forEach>
Другие вопросы по тегам