45

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

4

4 回答 4

64

如果您的目标是并运行与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 函数。您可以在本博客底部附近的某处找到一个启动示例。您希望得到如下结果:

<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);
}
于 2011-08-19T13:57:23.400 回答
4

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

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

它奏效了。

于 2012-05-25T17:05:18.993 回答
2

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

您可能会问谁为 JSP 提供了该实例 - 它是 model-2 MVC 安排中的一个 servlet。

以下是流程的工作方式:

  1. 从 JSP 向 servlet 提交 GET/POST 请求。
  2. Servlet 对那个请求采取行动,并代表 JSP 做一些工作。将所有必要的对象放入请求、会话或其他适当的范围内。
  3. Servlet 将响应路由到下一个 JSP,它可能与发出请求的 JSP 相同。
  4. 冲洗,重复。
于 2011-08-19T12:09:59.360 回答
0

如果您使用 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>
于 2011-08-19T12:16:45.313 回答