我正在努力解决这个问题,因为它会破坏我的模块化。我正在使用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>
感谢每一位帮助
答案 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}}足够的。