instanceof检查EL表达式语言

Fra*_*sco 35 jsf el instanceof

有没有办法instanceof在EL 进行检查?

例如

<h:link rendered="#{model instanceof ClassA}">      
    #{errorMessage1}
</h:link>
<h:link rendered="#{model instanceof ClassB}">      
    #{errorMessage2}
</h:link>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 52

你可以比较Class#getName()或者,也许更好,Class#getSimpleName()String.

<h:link rendered="#{model['class'].simpleName eq 'ClassA'}">      
    #{errorMessage1}
</h:link>
<h:link rendered="#{model['class'].simpleName eq 'ClassB'}">      
    #{errorMessage2}
</h:link>
Run Code Online (Sandbox Code Playgroud)

请注意Object#getClass()使用大括号表示法的重要性,['class']因为它class是一个保留的Java文字,否则会在EL 2.2+中引发EL异常.

该类型安全的替代方法是添加一些public enum Type { A, B }沿public abstract Type getType()到公共基类的模型.

<h:link rendered="#{model.type eq 'A'}">      
    #{errorMessage1}
</h:link>
<h:link rendered="#{model.type eq 'B'}">      
    #{errorMessage2}
</h:link>
Run Code Online (Sandbox Code Playgroud)

任何无效值都会在EL 2.2+运行期间抛出EL异常.

如果你使用的是OmniFaces,那么你可以使用3.0版本#{of:isInstance()}.

<h:link rendered="#{of:isInstance('com.example.ClassA', model)}">      
    #{errorMessage1}
</h:link>
<h:link rendered="#{of:isInstance('com.example.ClassB', model)}">      
    #{errorMessage2}
</h:link>
Run Code Online (Sandbox Code Playgroud)

  • 不会为接口工作......有什么建议吗? (3认同)
  • 层次继承怎么样?我有一个Item类,它有两个子类,即Product和Service.反过来,Product类有两个名为Medicine和Consumable的子类.所以我想检查天气药物实体是产品吗?只有当我将其检查为"药物"时才会返回true,但在作为产品检查时则不会返回. (2认同)

fla*_*ash 6

这不起作用EL.使用支持bean:

public class MyBean {

    public boolean getIsClassA() {
        if(model instanceof ClassA) {
            return true;
        }
        return false;
    }


}
Run Code Online (Sandbox Code Playgroud)

然后通过调用支持bean进行检查:

<h:link outcome="#{PageNameA}?faces-redirect=true&amp;" rendered="#{myBean.isClassA}">      
    #{errorMessage}
</h:link>
Run Code Online (Sandbox Code Playgroud)