Как вызвать параметризованный метод из 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.
Вот как будет работать поток:
- Отправьте запрос GET/POST от JSP сервлету.
- Сервлет действует по этому запросу и выполняет некоторые действия от имени JSP. Помещает все необходимые объекты в запрос, сеанс или другую подходящую область.
- Сервлет направляет ответ на следующий JSP, который может совпадать с запрашивающим JSP.
- Промыть, повторить.
Если вы используете 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>