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

发布于 2024-11-30 19:22:26 字数 71 浏览 1 评论 0原文

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

How to call a Java method with arguments which is defined in Java class, from JSP using JSTL/EL. The method is returning arrays. Any return value can be used.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

陈甜 2024-12-07 19:22:26

如果您的目标是并运行至少一个 Servlet 3.0 兼容容器(例如 Tomcat 7 或更新版本、WildFly 8 或更新版本、GlassFish 3 或更新版本等),则只能在 EL 中调用带有参数的方法web.xml 声明至少符合 Servlet 3.0。该 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 函数。您可以找到一个启动示例作为此答案的选项 2 如何在 JSP/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);
}

web.xml 文件绝对不应该有 行位于顶部,否则仍会强制使用 Servlet 2.3 方式。您可以在本答案的后半部分找到正确的 web.xml 声明示例 如何安装 JSTL?绝对uri:http://java.sun.com/jstl/core无法解析

You can only invoke methods with arguments in EL if you're targeting and running at least a Servlet 3.0 compatible container (e.g. Tomcat 7 or newer, WildFly 8 or newer, GlassFish 3 or newer, etc) with a web.xml declared conform at least 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 as option 2 of this answer How to call a static method in JSP/EL? 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);
}

The web.xml file should absolutely not have a <!DOCTYPE> line in top as that would otherwise still force the Servlet 2.3 modus. You can find examples of proper web.xml declarations in the second half of this answer How to install JSTL? The absolute uri: http://java.sun.com/jstl/core cannot be resolved.

蛮可爱 2024-12-07 19:22:26

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

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

并且它起作用了。

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.

乖乖哒 2024-12-07 19:22:26

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

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

该流程的工作原理如下:

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

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.
夜司空 2024-12-07 19:22:26

如果您使用 JSF,则可以使用 bean 作为 View Scope 中的模型,并自动从数据源加载。如果您使用 JSP,那么使用 TLD 标签怎么样?并使用 JSTL 标签 ?它是通过保存在会话中来节省内存,还是保存在会话中并在加载事件完成时将其删除?有点像这样(JSTL+TLD)

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

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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文