seam中Enmu的使用

seam中Enmu的使用(转)

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

你可能感兴趣的:(seam中Enmu的使用)