如何比较EL中的char属性

我有一个像下面的命令button。

<h:commandButton value="Accept orders" action="#{acceptOrdersBean.acceptOrder}" styleClass="button" rendered="#{product.orderStatus=='N' }"></h:commandButton> 

即使product.orderStatus值等于'N' ,命令button也不会显示在我的页面中。

这里product.orderStatus是一个字符属性。

不幸的是,这是预期的行为。 在EL中,像'N'这样'N'引号中的任何东西总是被当作一个String并且一个char属性值总是被视为一个数字。 该char在EL中由其Unicode代码点表示,对于N78

有两种解决方法

  1. 使用String#charAt() ,传递0 ,使String在EL中获得。 请注意,这只有在您的环境支持EL 2.2时才有效。 否则,你需要安装JBoss EL 。

     <h:commandButton ... rendered="#{product.orderStatus eq 'N'.charAt(0)}"> 
  2. 在Unicode中使用char的数字表示, N为78。 你可以通过System.out.println((int) 'N')找出正确的Unicode代码点。

     <h:commandButton ... rendered="#{product.orderStatus eq 78}"> 

然而, 真正的解决scheme是使用枚举 :

 public enum OrderStatus { N, X, Y, Z; } 

 private OrderStatus orderStatus; // +getter 

那么你可以在EL中使用所需的语法:

 <h:commandButton ... rendered="#{product.orderStatus eq 'N'}"> 

额外的好处是,枚举强制types安全。 您不能像那样指定一个字符作为订单状态值。