【问题标题】:Expression Language: how to simplify this statement ("in"-like clause needed)表达式语言:如何简化此语句(需要类似“in”的子句)
【发布时间】:2012-12-29 15:39:27
【问题描述】:

如果我能替换就好了

${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', ...}}

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

【问题讨论】:

    标签: java jsp jsf el in-clause


    【解决方案1】:

    首先为此创建一个 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)}
    

    【讨论】:

      【解决方案2】:

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

      mylist.contains(myvar)
      

      【讨论】:

        猜你喜欢
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        • 2023-01-16
        • 1970-01-01
        • 2022-06-20
        相关资源
        最近更新 更多