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

sac*_* gk 44 jsp jstl el parameter-passing methodexpression

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

Bal*_*usC 61

如果您要使用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>
Run Code Online (Sandbox Code Playgroud)

甚至用另一个变量作为参数

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

但是如果你没有针对Servlet 3.0容器,那么就不能在EL中调用带有参数的方法.最好的办法是按照Duffymo的建议在预处理servlet中完成这项工作.

Object[] array = bean.getArray("foo");
request.setAttribute("array", array);
// ...
Run Code Online (Sandbox Code Playgroud)

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

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

public static Object[] getArray(Bean bean, String key) {
    return bean.getArray(key);
}
Run Code Online (Sandbox Code Playgroud)

  • @Daniel:Eclipse在EL语法检查和验证方面很弱.只需在Eclipse中禁用EL验证,或安装JBoss Tools. (2认同)

duf*_*ymo 2

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

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

该流程的工作原理如下:

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