在标签库描述
问题描述:
使用可变参数是否有可能有一个顶级域名映射到以下功能:在标签库描述
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,虽然实施这将是非常复杂的。
答
哦。所以这是为了字面建设,并且会有限制的项目
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)}
实现整个Java方法选择算法会伤害 – irreputable 2011-02-17 19:56:18
@irreputable:没错, 。 – BalusC 2011-02-17 20:01:00