我想在EL函数中使用三个String参数返回ArrayList<HashMap<String,String>>
。怎么做?
答案 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<java.util.Map<java.lang.String,java.lang.String>> 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")}'/>