0

我在这个问题上苦苦挣扎,因为它有点破坏了我的模块化。我正在使用 JSF 1.2 并面临使用h:selectOneMenu来选择给定枚举集的一个值。

例如

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>

感谢每一个帮助

4

1 回答 1

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 转换器,所以你只需要这个:

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()已经足够了。

也可以看看:

于 2013-05-20T13:09:39.870 回答