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; }

}

可以使用枚举的具体方法

Planet.MERCURY.getmass()

Planet.MERCURY.getradius()     

在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();//.values()是Enmu的公共方法,用于返回全部枚举值。
 }

 

package org.manaty.model.party.customerAccount;
//枚举类定义
public enum CustomerAccountStatus {
    ACTIVE("Actif"),LOCKED("Verrouill"),CLOSED("Ferm");

 private String label;//对应于ACTIVE("Actif")括号里的Actif

    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就不通用了。

补充:也可以作为一个约定来使用label,让每个enmu增加label方法,label相当于起了个别名,表达式的意思

更明白些,另外name表达的意思比较简短,容易重复。

 

System.out.println(Status.CLOSED);---CLOSED 输出枚举的名字
System.out.println(Status.CLOSED.name());--CLOSED 输出枚举的名字
System.out.println(Status.CLOSED.getLabel());--test.closed 输出枚举的label

 

直接在页面内使用枚举

public enum CycleType {
    MONTH("Days of Month"),WEEK("Days of Week");
    private String name;
    CycleType(String name){
        this.name=name;
    }
    public String toString() {
        return this.name;
    }
}

<a4j:outputPanel id="week"
   rendered="#{calendarParam.cycleBasis == 'WEEK'}">

页面内的枚举比较使用的是【枚举名称】而不是toString()的名称

 

你可能感兴趣的:(JSF,seam)