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

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

Ответы [ 4 ]

59 голосов
/ 19 августа 2011

Вы можете вызывать методы с аргументами в EL только в том случае, если вы нацеливаетесь и запускаете контейнер, совместимый с Servlet 3.0 (например, Tomcat 7, Glassfish 3, JBoss AS 6 и т. Д.) С web.xml заявленным соответствием Servlet 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.Лучше всего просто выполнить работу в сервлете предварительной обработки, как рекомендует Duffymo.

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);
}
4 голосов
/ 25 мая 2012

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

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

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

2 голосов
/ 19 августа 2011

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

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

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

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

Если вы используете 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>
...