java - 表达语言 : how to simplify this statement ("in"-like clause needed)

标签 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', ...}}

但它们都不起作用。任何替代解决方案?

最佳答案

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

关于java - 表达语言 : how to simplify this statement ("in"-like clause needed),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14339443/

相关文章:

java - 在 Servlet/JSP 中加载属性文件

jsp - javax.el.MethodNotFoundException : Method not found: TableBeanDetail@bd4053. onRowSelect()

java - 找不到JSF文件上传方法

jsf - 如何设置 <h :inputText> inside <ui:repeat> into map, set 或 list 的提交值

css - 将 styleClass 应用于父 panelGrid 元素而不是子元素

java - 如何将 ArrayList 中的类的类从一个 Activity 传递到另一个 Activity

java - 如何在 Java 中获取嵌套列表结构中的嵌套项

java - 使用 Jena 读取限制约束

java - hibernate 将 Set<Enum> 存储到数据库中

java - 使用 JSP 从 SQL 显示单个属性值