4

如果我可以更换就好了

${myvar eq 'foo' or myvar eq 'bar' or myvar eq 'john' or myvar eq 'doe' or myvar eq ...}

通过

${myvar in ['foo', 'bar', 'john', 'doe', ...]}

或者

${myvar in {'foo', 'bar', 'john', 'doe', ...}}

但他们都没有工作。任何替代解决方案?

4

2 回答 2

4

首先为此创建一个 EL 函数。Facelets 的启动示例可以在这个答案中找到,另一个 JSP的示例可以在我们的 EL wiki 页面底部附近的某个地方找到。

public static boolean contains(Object[] array, Object item) {
    if (array == null || item == null) {
        return false;
    }

    for (Object object : array) {
        if (object != null && object.toString().equals(item.toString())) {
            return true;
        }
    }

    return false;
}

(或者如果您使用的是 JSF 实用程序库OmniFaces,请使用它of:contains(),尽管它仅适用于 Facelets,不适用于已弃用的 JSP)

然后按如下方式使用它:

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@taglib prefix="my" uri="http://my.example.com/functions" %>
...
${my:contains(fn:split('foo,bar,john,doe', ','), myvar)}

(这fn:split()只是将 a delimited 转换为 a 的String技巧String[]

您甚至可以通过直接传递分隔字符串并在函数中执行拆分来进一步简化/专门化它,以便您最终可以像:

${my:contains('foo,bar,john,doe', myvar)}
于 2013-01-15T14:20:22.353 回答
2

使用名称列表定义一个变量mylist并使用contains

mylist.contains(myvar)
于 2013-01-15T14:13:20.833 回答