How to call parameterized method from JSP using JSTL/EL

穿精又带淫゛_ 提交于 2019-11-26 11:51:19

You can only invoke methods with arguments in EL if you're targeting and running a Servlet 3.0 compatible container (e.g. Tomcat 7, Glassfish 3, JBoss AS 6, etc) with a web.xml declared conform Servlet 3.0. This servlet version comes along with EL 2.2 which allows invoking arbitrary instance methods with arguments.

Assuming that you've a ${bean} in the scope which refers to an instance of a class which has a method something like public Object[] getArray(String key), then you should be able to do this:

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

or even with another variable as argument

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

But if you don't target a Servlet 3.0 container, then you cannot invoke methods with arguments in EL at all. Your best bet is to just do the job in the preprocessing servlet as suggested by Duffymo.

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

As a completely different alternative, you could create an EL function which delegates the method call. You can find a kickoff example somewhere near the bottom of this blog. You'd like to end up something like as:

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

with

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

The above solution didnt work for me. I had a function getRemitanceProfileInformation(user) in my java class. I created a usebean of java class and then invoked

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

and it worked.

Give the JSP a reference to an instance of the class that has the method and call it.

You're probably asking who gives the JSP that instance - it's a servlet in the model-2 MVC arrangement.

Here's how the flow will work:

  1. Submit a GET/POST request from a JSP to a servlet.
  2. Servlet acts on that request and does some work on the JSP's behalf. Puts all the necessary objects into request, session, or other appropriate scope.
  3. Servlet routes response to the next JSP, which might be the same as the requesting JSP.
  4. Rinse, repeat.

If you're using JSF, you can use an bean act as a model in View Scope, and load from data source automatic. And if you're using JSP, how about using TLD Tag? And using JSTL tag <c:foreach> ? It's saves the memory from saving in the session, or save in session and remove it when load event done? Some how like this (JSTL+TLD)

<c:forEach items="${myTag:getProductByPage(page)}" var="p">
     Product name: ${p.productName}
</c:forEach>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!