el function with generic ArrayList返回类型和参数

el function with generic ArrayList返回类型和参数

问题描述:

我想返回ArrayList<HashMap<String,String>> EL函数中有三个String参数。怎么做?el function with generic ArrayList返回类型和参数

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

要做到这一点,你想要的是一个返回“Object”或者“Object []”的EL函数。你不能在你的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,你” d访问这样的功能:

<c:set var='result' value='${prefix:yourFunction("Goodbye", "Mr.", "Chips")}'/> 
+0

+1为介绍性文字。不过,我会感兴趣的是他需要什么。我无法想象任何有效的现实世界理由。无论何时这些值已经在JSP中硬编码了,为什么要将它转换为另一个Java对象?或者当这些值是动态的,为什么你不抓取一个servlet或bean来预处理它? – BalusC 2010-02-21 16:37:23

+0

我不知道。在大多数情况下,可能会有一个bean使用,但是谁知道?最初的问题是关于如何设置EL功能。无论如何,通过EL函数可以更快更清晰地获得bean,相比'',它会在每个使用它的页面中定义类名。 – Pointy 2010-02-21 19:06:11

+0

不支持泛型,但返回类型应该是函数签名中的java.util.List和方法签名中的List。 – BacMan 2010-02-22 17:58:55

可以在你的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>,不能用作参数。 (可能是一个令牌化错误。)您将不得不使用原始类型。