2011-02-17 154 views
9

使用可變參數是否有可能有一個頂級域名映射到以下功能:在標籤庫描述

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[]) 

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

回答

8

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

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個,然後設置。哈!

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> 
0

有一件事我沒有得到解決,這是創建一個效用函數類,並把它放在應用程序上下文當服務器啓動,而不是試圖將其定義爲EL功能。然後您可以訪問EL中的方法。

所以,當我的servlet啓動:

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

,並在我的JSP:

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