3

我想ArrayList<HashMap<String,String>>用三个字符串参数返回 EL 函数。怎么做?

4

2 回答 2

6

也可以在您的 tld 中使用复杂的返回类型。例如,这将起作用:

public static List<Map<String, String>> func(String arg1, String arg2,
        String arg3) {

    List<Map<String, String>> out = new ArrayList<HashMap<String, String>>();
    // code code code
    return out;
}

在您的 .tld 文件中,您必须输入以下内容:

<function>
  <description>Blah blah blah</description>
  <name>func</name>
  <function-class>your.package.YourClassName</function-class>
  <function-signature>
    java.util.List&lt;java.util.Map&lt;java.lang.String,java.lang.String&gt;&gt; func(java.lang.String,java.lang.String,java.lang.String)
  </function-signature>
</function>

注意事项:如本例所示,尖括号必须在 XML 中正确转义。函数签名不能换行。非一元泛型,例如Map<String,String>,不能用作参数。(可能是标记化错误。)您将不得不使用原始类型。

于 2013-12-06T08:24:29.510 回答
3

实际上,我认为让 EL 函数返回一些复杂对象是完全合理的。当然,有一些“架构风格”的问题可能会决定什么情况下适合和不适合这样的事情,但我想说一个很好的例子是返回一些不适合的配置信息的工具。特定于任何特定操作,对后端业务逻辑并不真正感兴趣,并且可能用于在许多页面上进行演示。

为此,您需要一个返回“Object”或“Object[]”的 EL 函数。您不能在 EL 声明中(即在 .tld 文件中)使用 Java 泛型的东西,但这并不重要,因为 EL 环境无论如何都会进行类型嗅探。你要做的是在某处的类中声明一个公共静态函数:

public static Object yourFunction(String arg1, String arg2, String arg3) {
    // code code code
    return (ArrayList<HashMap<String, String>>) whatever;
}

在您的 .tld 文件中,您将拥有如下内容:

<function>
  <description>Blah blah blah</description>
  <name>yourFunction</name>
  <function-class>your.package.YourClassName</function-class>
  <function-signature>
    java.lang.Object yourFunction(java.lang.String, java.lang.String, java.lang.String)
  </function-signature>
</function>

在您的 JSP 中,您可以像这样访问该函数:

<c:set var='result' value='${prefix:yourFunction("Goodbye", "Mr.", "Chips")}'/>
于 2010-02-21T16:18:08.493 回答