Использование varargs в дескрипторе библиотеки тегов - PullRequest
9 голосов
/ 17 февраля 2011

Можно ли привязать 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[] )

И другие, но, кажется, ничего не работает.

Ответы [ 4 ]

8 голосов
/ 17 февраля 2011

К сожалению, это невозможно.Средство распознавания 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, однако реализация ее была бы довольно сложной.

1 голос
/ 05 апреля 2012

Это немного более болезненно, но вы могли бы сделать что-то вроде этого:

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>
1 голос
/ 17 февраля 2011

да ладно.так что это для буквального построения, и будет ограниченное количество предметов

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 из них, и вы настроены.Ха!

0 голосов
/ 31 июля 2015

Одна вещь, которую я сделал, чтобы обойти это, заключалась в том, чтобы создать класс служебной функции и установить его в контексте приложения при запуске сервера, вместо того, чтобы пытаться определить его как функцию EL.Затем вы можете получить доступ к методу в EL.

Поэтому, когда мой сервлет запускается:

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

и на моем JSP:

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

...