JSF 2.0:为selectOneMenu使用Enum值

Ing*_*her 27 jsf java-ee jsf-2 jboss-weld

我正在使用JSF 2.0,并希望用我的Enum的值填充selectOneMenu.一个简单的例子:

// Sample Enum
public enum Gender {
  MALE("Male"),
  FEMALE("Female");

  private final String label;

  private Gender(String label) {
    this.label = label;
  }

  public String getLabel() {
    return this.label;
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不能将Seam用于我当前的项目,该项目有一个很好的<s:convertEnum/>标签可以完成大部分工作.在Seam中,要使用Enum的值,我必须编写以下标记(并创建一个提供以下内容的工厂#{genderValues}:

<!-- the Seam way -->
<h:selectOneMenu id="persongender" value="#{person.gender}">
  <s:selectItems var="_gender" value="#{genderValues}"" label="#{_gender.label}"/>
  <s:convertEnum/>
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

结果是我不必在标记内明确声明枚举值.我知道在JSF <2.0中这不是很容易,但JSF2中是否有任何新的东西来帮助解决这个问题?或者Weld在某种程度上帮助了吗?如果JSF2中没有新内容,那么在JSF 1.2中最简单的方法是什么?

或者我甚至可以集成Seam JSF标记和相应的Seam类来在JavaEE6-App中获得相同的功能(没有Seam容器)?

Ing*_*her 48

好的,这是最后的方法: - 在faces-config.xml中注册标准枚举转换器(可选):

<converter>
  <converter-for-class>java.lang.Enum</converter-for-class>
  <converter-class>javax.faces.convert.EnumConverter</converter-class>
</converter>
Run Code Online (Sandbox Code Playgroud)

例如,将一个函数添加到托管bean,托管bean将Enum值转换为SelectItems数组:

@ManagedBean
public class GenderBean {
  public SelectItem[] getGenderValues() {
    SelectItem[] items = new SelectItem[Gender.values().length];
    int i = 0;
    for(Gender g: Gender.values()) {
      items[i++] = new SelectItem(g, g.getLabel());
    }
    return items;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后将此函数绑定到JSF中的selectOneMenu:

<h:selectOneMenu id="gender" value="#{person.gender}">
  <!-- use property name not method name -->
  <f:selectItems value="#{genderBean.genderValues}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

而已!不是网上这个问题的第一个解释.但我认为这是最简单和最短的一个;)

  • 转换器注册是不必要的. (43认同)

Ing*_*her 21

在查看我自己的Seam示例一分钟之后,我在托管bean中创建了一个方法,如下所示:

@ManagedBean
public class MyManagedBean {
  public Gender[] getGenderValues() {
    return Gender.values;
  }
}   
Run Code Online (Sandbox Code Playgroud)

在我的标记中,我说

<h:selectOneMenu id="gender" value="#{person.gender}">
  <f:selectItems value="#{myManagedBean.genderValues}" var="g" 
    itemValue="#{g}" itemLabel="#{g.label}"/>
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

现在,我必须enum在发送表单时查看是否在我的实体中正确保存了.我会看看自己能不能做到这一点 - 无论如何,我会很感激提示或最佳实践!


小智 5

这是一个更简单的方法,它使用一个简单的getter和setter来将字符串编组到枚举中.

http://www.ninthavenue.com.au/blog/using-enums-in-el