如何使用 JSTL/EL 从 JSP 调用带有在 Java 类中定义的参数的 Java 方法。该方法正在返回数组。可以使用任何返回值。
4 回答
如果您的目标是并运行与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);
}
上述解决方案对我不起作用。我的 java 类中有一个函数 getRemitanceProfileInformation(user)
。我创建了一个 java 类的 usebean 然后调用
<c:set var="paymentValueCode" value='remittanceaddr.getRemitanceProfileInformation("${user}")'/>
它奏效了。
为 JSP 提供对具有该方法的类的实例的引用并调用它。
您可能会问谁为 JSP 提供了该实例 - 它是 model-2 MVC 安排中的一个 servlet。
以下是流程的工作方式:
- 从 JSP 向 servlet 提交 GET/POST 请求。
- Servlet 对那个请求采取行动,并代表 JSP 做一些工作。将所有必要的对象放入请求、会话或其他适当的范围内。
- Servlet 将响应路由到下一个 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>