在标签库描述

问题描述:

使用可变参数是否有可能有一个顶级域名映射到以下功能:在标签库描述

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

所以,我可以做的:

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

我尝试以下<function-signature>小号

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

和其他人似乎没有任何工作。

不幸的是,这是不可能的。 EL解析器立即将函数中的逗号解释为单独的参数,而不检查是否有任何方法采用可变参数。您最好的选择是使用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

实现整个Java方法选择算法会伤害 – irreputable 2011-02-17 19:56:18

+0

@irreputable:没错, 。 – BalusC 2011-02-17 20:01:00

哦。所以这是为了字面建设,并且会有限制的项目

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> 

有一件事我没有得到解决,这是创建一个效用函数类,并把它放在应用程序上下文当服务器启动,而不是试图将其定义为EL功能。然后您可以访问EL中的方法。

所以,当我的servlet启动:

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

,并在我的JSP:

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