【发布时间】:2011-02-01 05:42:30
【问题描述】:
是否可以在 JSF 中测试枚举是否相等?
例如其中stuff 是enum Stuff:
<h:outputText value="text" rendered="#{mrBean.stuff == mrsBean.stuff}"/>
【问题讨论】:
是否可以在 JSF 中测试枚举是否相等?
例如其中stuff 是enum Stuff:
<h:outputText value="text" rendered="#{mrBean.stuff == mrsBean.stuff}"/>
【问题讨论】:
您可以在枚举上定义测试方法,请参阅以下来源。
枚举定义:
public enum MyEnum {
FOO;
public boolean isFoo(){
return FOO.equals(this);
}
}
JSF 代码:
<h:outputText value="text" rendered="#{mrBean.stuff ne null and mrBean.stuff.foo}"/>
【讨论】:
这实际上与 EL 相关,而不是与 JSF 相关。您发布的构造是有效的,但您应该记住,EL 2.1 中的枚举值实际上被评估为 String 值。如果String.valueOf(mrBean.getStuff()) 等于String.valueOf(mrsBean.getStuff()),那么您的代码示例将呈现。在 EL 2.2 中,同样的构造也可以工作,但它们被评估为真正的枚举。
请注意,它确实需要一个 getter 方法来返回枚举值。鉴于枚举被视为String,您实际上也可以这样做:
<h:outputText value="text" rendered="#{mrBean.stuff == 'FOO'}" />
在当前的 EL 2.2 版本中,您不能像这样直接访问枚举值:
<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />
这只有在你使用OmniFaces <o:importConstants>时才有可能:
<o:importConstants type="com.example.Stuff" />
...
<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />
【讨论】:
Stuff stuff,在我的 JSF 中我尝试 #{stuff.FOO},但它不起作用。当你说一个 getter 方法返回枚举值时,你能否更具体地使用你的 FOO、BAR 示例。如果您想更好地了解我的结构,我已经提出了一个单独的问题。 stackoverflow.com/questions/3916871/…
<o:importConstants>。
如果你有枚举
public enum Status {
YES, NO
}
您可以像这样在 jsf 页面中引用枚举:
<h:outputText value="text" rendered="#{myBean.status == 'YES'}"/>
我不太确定字符串评估,因为我在重构一些代码以使用枚举时偶然发现了一些东西:如果你的状态字符串中有错字,即:
<h:outputText value="text" rendered="#{myBean.status == 'YESSIR'}"/>
当您点击该页面时,您实际上会遇到运行时错误,因为 EL 解析器会尝试将“YESSIR”强制转换为 Status 枚举并失败。
【讨论】: