表达式语言:如何简化此语句(需要“in -like”子句)

时间:2013-01-15 14:05:02

标签: java jsp jsf el in-clause

如果我可以替换

,那会很棒
${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', ...}}

但它们都没有奏效。任何替代解决方案?

2 个答案:

答案 0 :(得分:4)

首先为此创建一个EL函数。 Facelets的启动示例可以在this answer中找到,另一个用于JSP可以在our EL wiki page底部附近找到。

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()只是将分隔String转换为String[]

的技巧

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

${my:contains('foo,bar,john,doe', myvar)}

答案 1 :(得分:2)

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

mylist.contains(myvar)