是否可以将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[] )
其他人似乎没什么用。
答案 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)}