具有泛型arraylist返回类型和参数的el函数

时间:2010-02-21 14:49:57

标签: java jsp el

我想在EL函数中使用三个String参数返回ArrayList<HashMap<String,String>>。怎么做?

2 个答案:

答案 0 :(得分:5)

也可以在你的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>)不能用作参数。 (可能是一个标记化错误。)你将不得不使用那里的原始类型。

答案 1 :(得分:3)

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

要做到这一点,你想要的是一个EL函数,它返回“Object”,或者可能是“Object []”。您不能在EL声明中使用Java泛型内容(在.tld文件中),但这并不重要,因为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")}'/>