Java 在标记库描述符中使用varargs

Java 在标记库描述符中使用varargs,java,jsp,el,variadic-functions,taglib,Java,Jsp,El,Variadic Functions,Taglib,是否可以将TLD映射到以下功能: public static <T> T[] toArray(T... stuff) { return stuff; } 和其他人,但似乎什么都不起作用。不幸的是,这是不可能的。EL解析器立即将函数中的逗号解释为单独的参数,而不检查是否有任何方法使用varargs。最好使用JSTLfn:split() <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"

是否可以将TLD映射到以下功能:

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

和其他人,但似乎什么都不起作用。

不幸的是,这是不可能的。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>

...    
${item}

不过,在EL中这将是一个不错的选择,尽管实现它将相当复杂。

哦,好吧。因此,这是用于文字构造的,将有有限的项

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个,您已设置。哈!

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

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>
类MyAddTag扩展了SimpleTagSupport{
私有字符串变量;
私人客体价值;
公共无效doTag(){
((列表)getJspContext().getAttribute(var).setValue(value);
}
}
...

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

因此,当我的servlet启动时:

context.setAttribute(“utils”,新的MyJSPUtilsClass());

在我的JSP上:


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

实现整个java方法选择算法会带来伤害,我不能使用这种方法,因为我不处理字符串(只是举个例子),但要记住一个很好的技巧。我最终做了类似的事情(目前只需要两个元素)。丑陋但有效。
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}; }
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>