8

如何从 EL 调用对象的方法?

给对象:

public class TestObj {
   public testObj() { };

   public String test() { return "foo"; }
   public String someOtherMethod(String param) { return param + "_bar"; } 
}

并且 obj 被添加到 pageContext

pageContext.setAttribute("t", new TestObj());

我将如何执行相当于:

<%= t.test() %>
<%= t.someOtherMethod("foo") %>

使用EL?

4

2 回答 2

9

自 2009 年 12 月 10 日推出的 EL 2.2 起就支持它(已经超过 2.5 年了!)。EL 2.2 与 Servlet 3.0 齐头并进,因此,如果您以 Servlet 3.0 容器(Tomcat 7Glassfish 3等)为目标并兼容 Servlet 3.0 web.xml,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <!-- Config here. -->

</web-app>

那么您将能够以下列形式在 EL 中调用带或不带参数的方法:

${t.test()}
${t.someOtherMethod('foo')}
于 2012-05-22T04:35:35.130 回答
3

据此,表达式语言中的 EL方法调用中的方法调用当前处于 JSR 状态,尚未实现。我使用的是用于 JavaBean 组件的 JST 工具来执行一些调用。例如,如果您将test方法签名修改为:

public class TestObj {
    public TestObj() { };

    public String getTest() { return "foo"; }
}

getTest()您可以使用以下语法调用方法:

${t.test}

现在,如果您需要更精细的东西(例如参数传递),您可以使用 EL 提供的自定义方法功能。这需要在公共类中声明的公共静态方法以及 TLD 文件。一个很好的教程可以在这里找到。

更新:

正如@BalusC 所说,后来的规范现在支持方法调用。如果您要部署到与 Java EE 6 兼容的容器,此 Oracle 站点将展示如何正确使用该功能。

于 2012-05-21T01:06:09.967 回答