enmu基本知识
//简单的枚举
public enum Planet {
MERCURY ,
VENUS
}
//负责的枚举
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6)
private final double mass; // in kilograms
private final double radius; // in meters
//MERCURY (3.303e+23, 2.4397e6)里面的参数与构造函数对应
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double getmass() { return mass; }
public double getradius() { return radius; }
}
在jsf页面使用Enmu
<h:selectOneMenu id="CustomerStatusList" value="#{customerAccountsAction.status}">
<s:selectItems value="#{customerStatusList}" var="_s" label="#{_s.label}" noSelectionLabel="" />
<s:convertEnum />
</h:selectOneMenu>
@Factory
public CustomerAccountStatus[] getCustomerStatusList() {
return CustomerAccountStatus.values();
}
package org.manaty.model.party.customerAccount;
public enum CustomerAccountStatus {
ACTIVE("Actif"),LOCKED("Verrouill"u00E9"),CLOSED("Ferm"u00E9");
private String label;
CustomerAccountStatus(String label) {
this.label = label;
}
public String getLabel() {
return label;
}
}
目前存在的问题是label="#{_s.label}"没法国际化,如果要在列表中国际化就应该 在getCustomerStatusList()
方法中修改枚举的label值,如此给CustomerAccountStatus增加setLabel方 法,getCustomerStatusList()方法中循环 CustomerAccountStatus.values(),取出枚举值的name,然后再去资源文件中获取对应的国际化label。、
问题在于这样就修改了枚举值本身的内容,而枚举值的含义是相当于常量,常量是不可以改变的。
最新解决办法
不用label来显示enmu,直接用enmu.name()来作为key去资源文件中取对应的国际化
<h:selectOneMenu id="CustomerStatusList" value="#{customerAccountsAction.status}">
<s:selectItems value="#{customerStatusList}" var="_s" label="#{messages[_s.name()]} " noSelectionLabel="" />
<s:convertEnum />
</h:selectOneMenu>
为什么使用_s.name()而不使用 _s.label呢?
因为label是特定enmu的方法,,而不是所有enmu有的方法,这样_s.label就不通用了。
原帖地址: http://yourenyouyu2008.javaeye.com/blog/351703