在标签库描述符中使用可变参数
是否可以将 TLD 映射到以下功能:
public static <T> T[] toArray(T... stuff) {
return stuff;
}
以便我可以执行以下操作:
<c:forEach items="${my:toArray('a', 'b', 'c')}"...
我尝试了以下
java.lang.Object toArray( java.lang.Object... )
java.lang.Object[] toArray( java.lang.Object[] )
以及其他功能,但似乎没有任何效果。
Is it possible to have a TLD map to the following function:
public static <T> T[] toArray(T... stuff) {
return stuff;
}
So that I can do:
<c:forEach items="${my:toArray('a', 'b', 'c')}"...
I tried the following <function-signature>
s
java.lang.Object toArray( java.lang.Object... )
java.lang.Object[] toArray( java.lang.Object[] )
And others but nothing seems to work.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
不幸的是,这是不可能的。 EL 解析器立即将函数中的逗号解释为单独的参数,而不检查是否有任何方法采用可变参数。最好的选择是使用 JSTL
fn:split()
代替。然而,这在 EL 中是一个很好的功能,尽管实现它会相当复杂。
Unfortunately that's not possible. The EL resolver immediately interprets the commas in the function as separate arguments without checking if there are any methods taking varargs. Your best bet is using JSTL
fn:split()
instead.It would have been a nice feature in EL however, although implementing it would be pretty complex.
那好吧。所以这是为了字面意义的构建,并且会有有限的项目,
我不认为这样做是有罪的。自动生成 100 个,然后您就完成了。哈!
oh well. so this is for literal construction, and there will be limited items
I don't find it sinful to do this. Auto generate 100 of them and you are set. Ha!
这有点痛苦,但你可以这样做:
It's a little more painful, but you could do something like this:
为了解决这个问题,我所做的一件事是创建一个实用函数类,并在服务器启动时将其设置在应用程序上下文中,而不是尝试将其定义为 EL 函数。然后您可以在 EL 中访问该方法。
因此,当我的 servlet 启动时:
context.setAttribute("utils", new MyJSPUtilsClass());
在我的 JSP 上:
${utils.toArray(1, 2, 3, 4) }
One thing I did to get around this was to create a utility function class and set it on the application context when the server starts up, rather than trying to define it as an EL function. You can then access the method in EL.
So when my servlet starts up:
context.setAttribute("utils", new MyJSPUtilsClass());
and on my JSP:
${utils.toArray(1, 2, 3, 4)}