在标记库描述符中使用varargs

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

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

而其他人似乎没什么用。

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

 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> ...  ${item}

然而,它本来是EL的一个很好的function ,虽然实现它会非常复杂。

好吧。 所以这是用于文字建设,并且将有限的项目

 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); } }   ... 

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

所以当我的servlet启动时:

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

在我的JSP上:

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