在标记库描述符中使用varargs

时间:2011-02-17 19:26:15

标签: java jsp el variadic-functions taglib

是否可以将TLD映射到以下函数:

public static <T> T[] toArray(T... stuff) {
    return stuff;
}

所以我可以这样做:

<c:forEach items="${my:toArray('a', 'b', 'c')}"...

我尝试了以下<function-signature> s

java.lang.Object toArray( java.lang.Object... )
java.lang.Object[] toArray( java.lang.Object[] )

其他人似乎没什么用。

4 个答案:

答案 0 :(得分:8)

不幸的是,这是不可能的。 EL解析器立即将函数中的逗号解释为单独的参数,而不检查是否有任何方法采用varargs。您最好的选择是使用JSTL fn:split()

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...    
<c:forEach items="${fn:split('a,b,c', ',')}" var="item">
    ${item}<br/>
</c:forEach>

然而,在EL中这将是一个不错的feature,虽然实现它会非常复杂。

答案 1 :(得分:1)

哦,好吧。所以这是文字构造,而且会有限的项目

public static Object[] array(Object x0)
{ return  new Object[] {x0}; }

public static Object[] array(Object x0, Object x1)
{ return  new Object[] {x0, x1}; }

....

public static Object[] array(Object x0, Object x1, Object x2, ... Object x99)
{ return  new Object[] {x0, x1, x2, ... x99}; }

我认为这样做并不是有罪的。自动生成100个并且您已设置。哈!

答案 2 :(得分:1)

这有点痛苦,但你可以这样做:

class MyAddTag extends SimpleTagSupport {
    private String var;
    private Object value;

    public void doTag() {
        ((List) getJspContext().getAttribute(var).setValue(value);
    }
}

<my:add var="myCollection" value="${myObject}" />
<my:add var="myCollection" value="${myOtherObject}" />
<c:forEach items="myCollection">...</c:forEach>

答案 3 :(得分:0)

我做的一件事就是创建一个实用程序函数类,并在服务器启动时将其设置在应用程序上下文中,而不是尝试将其定义为EL函数。然后,您可以在EL中访问该方法。

所以当我的servlet启动时:

context.setAttribute("utils", new MyJSPUtilsClass());

和我的JSP:

${utils.toArray(1, 2, 3, 4)}