如何使用JSTL / EL从JSP调用参数化方法

时间:2011-08-19 12:06:36

标签: jsp jstl parameter-passing el methodexpression

如何使用JSTL / EL从JSP调用Java类中定义的参数的Java方法。该方法返回数组。可以使用任何返回值。

4 个答案:

答案 0 :(得分:59)

如果要定位并运行与web.xml声明的符合Servlet 3.0的Servlet 3.0兼容容器(例如Tomcat 7,Glassfish 3,JBoss AS 6等),则只能在EL中调用带参数的方法。这个servlet版本附带了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的建议在预处理servlet中完成这项工作。

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

作为一种完全不同的替代方法,您可以创建一个委托方法调用的EL函数。你可以在this blog底部附近找到一个启动示例。你最终会喜欢这样的东西:

<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);
}

答案 1 :(得分:4)

以上解决方案对我没有用。 我的java类中有一个函数getRemitanceProfileInformation(user)。 我创建了一个java类的usebean,然后调用了

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

并且有效。

答案 2 :(得分:2)

为JSP提供对具有该方法的类的实例的引用并调用它。

你可能会问谁给JSP提供了这个实例 - 它是model-2 MVC安排中的servlet。

以下是流程的工作原理:

  1. 将JSP的GET / POST请求提交给servlet。
  2. Servlet对该请求起作用,并代表JSP进行一些工作。将所有必需的对象放入请求,会话或其他适当的范围。
  3. Servlet路由响应下一个JSP,它可能与请求JSP相同。
  4. 冲洗,重复。

答案 3 :(得分:0)

如果您正在使用JSF,则可以使用bean act作为View Scope中的模型,并自动从数据源加载。如果你正在使用JSP,那么如何使用TLD Tag?并使用JSTL标记<c:foreach>?它可以节省内存保存在会话中,还是保存在会话中并在加载事件完成后将其删除?有点像这样(JSTL + TLD)

<c:forEach items="${myTag:getProductByPage(page)}" var="p">
     Product name: ${p.productName}
</c:forEach>