在标签库描述符中使用可变参数

发布于 2024-10-18 02:17:15 字数 441 浏览 3 评论 0原文

是否可以将 TLD 映射到以下功能:

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

以及其他功能,但似乎没有任何效果。

Is it possible to have a TLD map to the following function:

public static <T> T[] toArray(T... stuff) {
    return stuff;
}

So that I can do:

<c:forEach items="${my:toArray('a', 'b', 'c')}"...

I tried the following <function-signature>s

java.lang.Object toArray( java.lang.Object... )
java.lang.Object[] toArray( java.lang.Object[] )

And others but nothing seems to work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

天涯离梦残月幽梦 2024-10-25 02:17:15

不幸的是,这是不可能的。 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 中是一个很好的功能,尽管实现它会相当复杂。

Unfortunately that's not possible. The EL resolver immediately interprets the commas in the function as separate arguments without checking if there are any methods taking varargs. Your best bet is using JSTL fn:split() instead.

<%@ 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>

It would have been a nice feature in EL however, although implementing it would be pretty complex.

jJeQQOZ5 2024-10-25 02:17:15

那好吧。所以这是为了字面意义的构建,并且会有有限的项目,

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 个,然后您就完成了。哈!

oh well. so this is for literal construction, and there will be limited items

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

I don't find it sinful to do this. Auto generate 100 of them and you are set. Ha!

静赏你的温柔 2024-10-25 02:17:15

这有点痛苦,但你可以这样做:

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>

It's a little more painful, but you could do something like this:

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>
‘画卷フ 2024-10-25 02:17:15

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

因此,当我的 servlet 启动时:

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

在我的 JSP 上:

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

One thing I did to get around this was to create a utility function class and set it on the application context when the server starts up, rather than trying to define it as an EL function. You can then access the method in EL.

So when my servlet starts up:

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

and on my JSP:

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文