在JSF 1.2中创建动态ENUM菜单标记

时间:2013-05-19 12:58:19

标签: java jsf enums jsf-1.2 selectonemenu

我正在努力解决这个问题,因为它会破坏我的模块化。我正在使用JSF 1.2并面向使用 h:selectOneMenu 来选择一组给定枚举的一个值。

e.g。

public enum State {    
        A,B,C;
};

例如,我会做某事。像这样:

<h:selectOneMenu>
      <f:selectItem itemValue="A" itemLabel="text" />
      <f:selectItem itemValue="B" itemLabel="text" />
      <f:selectItem itemValue="C" itemLabel="text" />
</h:selectOneMenu>

所以我正在寻找一种方法(例如自定义标签)以使其更通用。

关于视图组件,我想在菜单中将所有可用选项作为独立的 f:selectItem

可用的选项可以通过列表或某事传递。其他

我尝试的第一种方法是为我的selectItems使用 a4j:repeat 标记,并将一组选项传递给此标记,但我唯一得到的是一个空菜单。

我的想法是某种自定义标记,如下所示:

<namespace:enumMenu enumValues="#{values}" value=#{value}" />

考虑一组传递的枚举,其值为A,B,C,D,它应该导致......像

    <h:selectOneMenu value=#{value}>
          <!-- REPEAT for every enum Item in the passed #values -->
          <f:selectItem itemValue="A" />
          <f:selectItem itemValue="B" />
          <f:selectItem itemValue="C" />
          <f:selectItem itemValue="D" />
    </h:selectOneMenu>

感谢每一位帮助

1 个答案:

答案 0 :(得分:3)

<a4j:repeat>失败,因为<f:xxx>组件在视图构建期间必须可用才能插入组件树中,但<a4j:repeat>在视图渲染时运行。你需要JSTL <c:forEach>

<h:selectOneMenu ...>
    <c:forEach ...>
        <f:selectItem />
    </c:forEach>
</h:selectOneMenu>

另见:


另一种方法是使用<f:selectItems>。 JSF 1.2有一个内置enum converter,所以你只需要这个:

private State selectedState; // +getter+setter
private SelectItem[] availableStateItems; // +getter (no setter necessary!)

@PostConstruct
public void init() {
    State[] availableStates = State.values();
    availableStateItems = new SelectItem[availableStates.length];

    for (int i = 0; i < availableStates.length; i++) {
        availableStateItems[i] = new SelectItem(availableStates[i]);
    }
}

<h:selectOneMenu value="#{bean.selectedState}">
    <f:selectItems value="#{bean.availableStateItems}" />
</h:selectOneMenu>

您甚至可以将availableStateItems放在一个完全独立的应用程序范围的托管bean中,这样可用项的列表在应用程序的生命周期内只初始化一次。

请注意,上面的答案是针对JSF 1.2的,因为JSF 2.x您不再需要将其转换为SelectItem[],而State[]所获得的State.values()只是{{1}}足够的。

另见: